ETH Price: $2,687.95 (-3.33%)

Token

Rocket (RocketDash)
 

Overview

Max Total Supply

521 RocketDash

Holders

502

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 RocketDash
0xd534b06e77528b2fc42101cdef9c270f435bf742
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RocketdashMinting

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
Yes with 77777 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-12
*/

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

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.15;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
 contract Pausable is Ownable {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function pause() external onlyOwner whenNotPaused {
        _paused = true;
        emit Paused(msg.sender);
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function unpause() external onlyOwner whenPaused {
        _paused = false;
        emit Unpaused(msg.sender);
    }
}

/// @title Interface for ERC-721: Non-Fungible Tokens
interface InterfaceERC721 {
    // Required methods
    function totalSupply() external view returns (uint256 total);
    function balanceOf(address _owner) external view returns (uint256 balance);
    function ownerOf(uint256 _tokenId) external view returns (address owner);
    function approve(address _to, uint256 _tokenId) external;
    function transfer(address _to, uint256 _tokenId) external;
    function transferFrom(address _from, address _to, uint256 _tokenId) external;

    // Events
    event Transfer(address from, address to, uint256 tokenId);
    event Approval(address owner, address approved, uint256 tokenId);

   
}

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

/// @title Auction Core
/// @dev Contains models, variables, and internal methods for the auction.
/// @notice We omit a fallback function to prevent accidental sends to this contract.
contract ClockAuctionBase {

    // Represents an auction on an NFT
    struct Auction {
        // Current owner of NFT
        address seller;
        // Price (in wei) at beginning of auction
        uint128 startingPrice;
        // Price (in wei) at end of auction
        uint128 endingPrice;
        // Duration (in seconds) of auction
        uint64 duration;
        // Time when auction started
        // NOTE: 0 if this auction has been concluded
        uint64 startedAt;

        address tokenAddress;
    }

    // Reference to contract tracking NFT ownership
    InterfaceERC721 public nonFungibleContract;

    // Cut owner takes on each auction, measured in basis points (1/100 of a percent).
    uint256 public ownerCut;

    // Map from token ID to their corresponding auction.
    mapping (uint256 => Auction) tokenIdToAuction;

    event AuctionCreated(uint256 tokenId, uint256 startingPrice, uint256 endingPrice, uint256 duration);
    event AuctionSuccessful(uint256 tokenId, uint256 totalPrice, address winner);
    event AuctionCancelled(uint256 tokenId);

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (nonFungibleContract.ownerOf(_tokenId) == _claimant);
    }

    /// @dev Escrows the NFT, assigning ownership to this contract.
    /// Throws if the escrow fails.
    /// @param _owner - Current owner address of token to escrow.
    /// @param _tokenId - ID of token whose approval to verify.
    function _escrow(address _owner, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(_owner, address(this), _tokenId);
    }

    /// @dev Transfers an NFT owned by this contract to another address.
    /// Returns true if the transfer succeeds.
    /// @param _receiver - Address to transfer NFT to.
    /// @param _tokenId - ID of token to transfer.
    function _transfer(address _receiver, uint256 _tokenId) internal {
        // it will throw if transfer fails
        nonFungibleContract.transferFrom(address(this), _receiver, _tokenId);
    }

    /// @dev Adds an auction to the list of open auctions. Also fires the
    ///  AuctionCreated event.
    /// @param _tokenId The ID of the token to be put on auction.
    /// @param _auction Auction to add.
    function _addAuction(uint256 _tokenId, Auction memory _auction) internal {
        // Require that all auctions have a duration of
        // at least one minute.
        require(_auction.duration >= 1 minutes);

        tokenIdToAuction[_tokenId] = _auction;

        emit AuctionCreated(
            uint256(_tokenId),
            uint256(_auction.startingPrice),
            uint256(_auction.endingPrice),
            uint256(_auction.duration)
        );
    }

    /// @dev Cancels an auction unconditionally.
    function _cancelAuction(uint256 _tokenId, address _seller) internal {
        _removeAuction(_tokenId);
        _transfer(_seller, _tokenId);
        emit AuctionCancelled(_tokenId);
    }

    /// @dev Computes the price and transfers winnings.
    function _bid(uint256 _tokenId, uint256 _bidAmount)
        internal
        returns (uint256)
    {
        // Get a reference to the auction struct
        Auction storage auction = tokenIdToAuction[_tokenId];

        // Explicitly check that this auction is currently live.
        require(_isOnAuction(auction));

        // Check that the bid is greater than or equal to the current price
        uint256 price = _currentPrice(auction);
        require(_bidAmount >= price);

        address seller = auction.seller;

        // Remove the auction before sending the fees
        _removeAuction(_tokenId);

        // Transfer proceeds to seller (if there are any!)
        if (price > 0) {
          
            uint256 auctioneerCut = _computeCut(price);
            uint256 sellerProceeds = price - auctioneerCut;

            payable(seller).transfer(sellerProceeds);
        }

        // Calculate any excess funds        
        uint256 bidExcess = _bidAmount - price;
        // Return the funds.
        payable(msg.sender).transfer(bidExcess);

        // Tell the world!
        emit AuctionSuccessful(_tokenId, price, msg.sender);

        return price;
    }

    /// @dev Removes an auction from the list of open auctions.
    /// @param _tokenId - ID of NFT on auction.
    function _removeAuction(uint256 _tokenId) internal {
        delete tokenIdToAuction[_tokenId];
    }

    /// @dev Returns true if the NFT is on auction.
    /// @param _auction - Auction to check.
    function _isOnAuction(Auction memory _auction) internal pure returns (bool) {
        return (_auction.startedAt > 0);
    }

    /// @dev Returns current price of an NFT on auction. 
    function _currentPrice(Auction memory _auction)
        internal
        view
        returns (uint256)
    {
        uint256 secondsPassed = 0;
        if (block.timestamp > _auction.startedAt) {
            secondsPassed = block.timestamp - _auction.startedAt;
        }

        return _computeCurrentPrice(
            _auction.startingPrice,
            _auction.endingPrice,
            _auction.duration,
            secondsPassed
        );
    }

    /// @dev Computes the current price of an auction.    
    function _computeCurrentPrice(
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        uint256 _secondsPassed
    )
        internal
        pure
        returns (uint256)
    {
        
        if (_secondsPassed >= _duration) {
            return _endingPrice;
        } else {
  
            int256 totalPriceChange = int256(_endingPrice) - int256(_startingPrice);          
            int256 currentPriceChange = totalPriceChange * int256(_secondsPassed) / int256(_duration);
            int256 currentPrice = int256(_startingPrice) + currentPriceChange;
            return uint256(currentPrice);
        }
    }

    /// @dev Computes owner's cut of a sale.
    /// @param _price - Sale price of NFT.
    function _computeCut(uint256 _price) internal view returns (uint256) {
        return _price * ownerCut / 10000;
    }
}


contract ClockAuction is Pausable, ClockAuctionBase {

     bytes4 constant InterfaceSignature_ERC721 = bytes4(0x9a20483d);

     constructor(address _nftAddress, uint256 _cut)  {
        require(_cut <= 10000);
        ownerCut = _cut;

        InterfaceERC721 candidateContract = InterfaceERC721(_nftAddress);
        nonFungibleContract = candidateContract;
    }

    /// @dev Remove all Ether from the contract, which is the owner's cuts
    function withdrawBalance() external {
        address nftAddress = address(nonFungibleContract);
        require(
            msg.sender == owner() ||
            msg.sender == nftAddress
        );
        // We are using this boolean method to make sure that even if one fails it will still work
        bool res = payable(nftAddress).send(address(this).balance);
        require(res == true, "transfer failed");
    }

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of time to move between starting
    ///  price and ending price (in seconds).
    /// @param _seller - Seller
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller,
        address _tokenAddress
    )
        external virtual
        whenNotPaused
    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(_owns(msg.sender, _tokenId));
        _escrow(msg.sender, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(block.timestamp),
            _tokenAddress
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Bids on an open auction, completing the auction and transferring
    ///  ownership of the NFT if enough Ether is supplied.
    /// @param _tokenId - ID of token to bid on.
    function bid(uint256 _tokenId)
        external
        virtual 
        payable
        whenNotPaused
    {
        // _bid will throw if the bid or funds transfer fails
        _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);
    }

    /// @dev Cancels an auction that hasn't been won yet.
    ///  Returns the NFT to original owner.
    /// @notice This is a state-modifying function that can
    ///  be called while the contract is paused.
    /// @param _tokenId - ID of token on auction
    function cancelAuction(uint256 _tokenId)
        external
        whenPaused
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction),"not in auction");
        address seller = auction.seller;
        require(msg.sender == seller,"not a seller");
        _cancelAuction(_tokenId, seller);
    }

    /// @dev Cancels an auction when the contract is paused.
    ///  Only the owner may do this, and NFTs are returned to
    ///  the seller. This should only be used in emergencies.
    /// @param _tokenId - ID of the NFT on auction to cancel.
    function cancelAuctionWhenPaused(uint256 _tokenId)
        whenPaused
        onlyOwner
        external
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction),"not in auction");
        _cancelAuction(_tokenId, auction.seller);
    }

    /// @dev Returns auction info for an NFT on auction.
    /// @param _tokenId - ID of NFT on auction.
    function getAuction(uint256 _tokenId)
        external
        view
        returns
    (
        address seller,
        uint256 startingPrice,
        uint256 endingPrice,
        uint256 duration,
        uint256 startedAt
    ) {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return (
            auction.seller,
            auction.startingPrice,
            auction.endingPrice,
            auction.duration,
            auction.startedAt
        );
    }

    /// @dev Returns the current price of an auction.
    /// @param _tokenId - ID of the token price we are checking.
    function getCurrentPrice(uint256 _tokenId)
        external
        view
        returns (uint256)
    {
        Auction storage auction = tokenIdToAuction[_tokenId];
        require(_isOnAuction(auction));
        return _currentPrice(auction);
    }

}

contract SaleClockAuction is ClockAuction {

    bool public isSaleClockAuction = true;
    
    // Tracks last 5 sale price of gen0 rocket sales
    uint256 public gen0SaleCount;
    uint256[5] public lastGen0SalePrices;

    constructor(address _nftAddr, uint256 _cut) 
        ClockAuction(_nftAddr, _cut) {}

    /// @dev Creates and begins a new auction.
    /// @param _tokenId - ID of token to auction, sender must be owner.
    /// @param _startingPrice - Price of item (in wei) at beginning of auction.
    /// @param _endingPrice - Price of item (in wei) at end of auction.
    /// @param _duration - Length of auction (in seconds).
    /// @param _seller - Seller, if not the message sender
    function createAuction(
        uint256 _tokenId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _seller,
        address _tokenAddress
    )
        external override virtual

    {
        require(_startingPrice == uint256(uint128(_startingPrice)));
        require(_endingPrice == uint256(uint128(_endingPrice)));
        require(_duration == uint256(uint64(_duration)));

        require(msg.sender == address(nonFungibleContract),"Not a tokenContract");
        _escrow(_seller, _tokenId);
        Auction memory auction = Auction(
            _seller,
            uint128(_startingPrice),
            uint128(_endingPrice),
            uint64(_duration),
            uint64(block.timestamp),
            _tokenAddress
        );
        _addAuction(_tokenId, auction);
    }

    /// @dev Updates lastSalePrice if seller is the nft contract
    /// Otherwise, works the same as default bid method.
    function bid(uint256 _tokenId)
        external 
        virtual 
        override
        payable
    {
        // _bid verifies token ID size
        address seller = tokenIdToAuction[_tokenId].seller;
        uint256 price = _bid(_tokenId, msg.value);
        _transfer(msg.sender, _tokenId);

        // If not a gen0 auction, exit
        if (seller == address(nonFungibleContract)) {
            // Track gen0 sale prices
            lastGen0SalePrices[gen0SaleCount % 5] = price;
            gen0SaleCount++;
        }
    }

    function averageGen0SalePrice() external view returns (uint256) {
        uint256 sum = 0;
        for (uint256 i = 0; i < 5; i++) {
            sum += lastGen0SalePrices[i];
        }
        return sum / 5;
    }

}

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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);
}

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

     // Base URI
    string private baseURI_;

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

       /**
     * @dev function to set the contract URI
     * @param _baseTokenURI string URI prefix to assign
     */
    function setBaseURI(string calldata _baseTokenURI) external onlyOwner {
        _setBaseURI(_baseTokenURI);
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory _baseUri) internal virtual {
        baseURI_ = _baseUri;
    }

    /**
     * @dev Returns the base URI set via {_setBaseURI}. This will be
     * automatically added as a prefix in {tokenURI} to each token's URI, or
     * to the token ID if no specific URI is set for that token ID.
     */
    function baseUri() public view returns (string memory) {
        return baseURI_;
    }    


}


contract RocketBase is ERC721Base("Rocket", "RocketDash") {

    /// @dev The Build event is fired whenever a new rocket comes into existence.
    event Build(address owner, uint256 rocketId, uint256 inventorModelId, uint256 architectModelId);

  
    struct Rocket {

        // The timestamp from the block when this rocketcame into existence.
        uint64 buildTime;

        // The minimum timestamp after which this rocket can able build
        // new rockets again.
        uint64 recoveryEndTime;

        // The ID of the originator of this rocket, set to 0 for gen0 rockets.
        uint32 inventorModelId;
        uint32 architectModelId;

        // Set to the ID of the architectModel rocketfor inventorModels that are preProduction,
        // zero otherwise. 
        uint32 ProcessingWithId;

        // Set to the index in the recovery array (see below) that represents
        // the current recovery duration for this Rocket. This starts at zero
        // for gen0 rockets, and is initialized to floor(generation/2) for others.
        // Incremented by one for each successful building action, regardless
        // of whether this rocketis acting as inventorModel or architectModel.
        uint16 recoveryIndex;

        // The "generation number" of this rocket.
        // for sale are called "gen0" and have a generation number of 0. The
        // generation number of all other rockets is the larger of the two generation
        // numbers of their originator, plus one.
        // (i.e. max(inventorModel.generation, architectModel.generation) + 1)
        uint16 generation;
    }

    /*** CONSTANTS ***/

    /// @dev A lookup table rocketing the recovery duration after any successful
    ///  building action, called "processing time" for inventorModels and "Processing recovery"
    ///  for architectModels. Designed such that the recovery roughly doubles each time a rocket
    ///  is build, encouraging owners not to just keep building the same rocketover
    ///  and over again. Caps out at one week (a rocketcan build an unbounded number
    ///  of times, and the maximum recovery is always seven days).
    uint32[14] public recovery = [
        uint32(1 minutes),
        uint32(2 minutes),
        uint32(5 minutes),
        uint32(10 minutes),
        uint32(30 minutes),
        uint32(1 hours),
        uint32(2 hours),
        uint32(4 hours),
        uint32(8 hours),
        uint32(16 hours),
        uint32(1 days),
        uint32(2 days),
        uint32(4 days),
        uint32(7 days)
    ];

    /*** STORAGE ***/

    /// @dev An array containing the Rocket struct for all rockets in existence. The ID
    ///  of each rocketis actually an index into this array. 
    Rocket[] rockets;

    /// @dev A mapping from RocketIDs to an address that has been approved to use
    ///  this Rocket for Processing via buildWith(). Each Rocket can only have one approved
    ///  address for Processing at any time. A zero value means no approval is outstanding.
    mapping (uint256 => address) public architectModelAllowedToAddress;

    /// @dev The address of the ClockAuction contract that handles sales of rockets. This
    ///  same contract handles both peer-to-peer sales as well as the gen0 sales. 
    SaleClockAuction public saleAuction;

    constructor(){

    }

     function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._transfer(from, to, tokenId);
        // once the rocket is transferred also clear architectModel allowances
        delete architectModelAllowedToAddress[tokenId];
    }

    /// @dev An internal method that creates a new rocket and stores it. This
    /// @param _inventorModelId The rocket ID of the inventorModel of this rocket(zero for gen0)
    /// @param _architectModelId The rocket ID of the architectModel of this rocket(zero for gen0)
    /// @param _generation The generation number of this rocket, must be computed by caller.
    /// @param _owner The inital owner of this rocket, must be non-zero (except for the unRocket, ID 0)
    function _createRocket(
        uint256 _inventorModelId,
        uint256 _architectModelId,
        uint256 _generation,
        address _owner
    )
        internal
        returns (uint)
    {

        require(_inventorModelId == uint256(uint32(_inventorModelId)));
        require(_architectModelId == uint256(uint32(_architectModelId)));
        require(_generation == uint256(uint16(_generation)));

        // New rocket starts with the same recovery as parent gen/2
        uint16 recoveryIndex = uint16(_generation / 2);
        if (recoveryIndex > 13) {
            recoveryIndex = 13;
        }

        Rocket memory _rocket = Rocket({
            buildTime: uint64(block.timestamp),
            recoveryEndTime: 0,
            inventorModelId: uint32(_inventorModelId),
            architectModelId: uint32(_architectModelId),
            ProcessingWithId: 0,
            recoveryIndex: recoveryIndex,
            generation: uint16(_generation)
        });
        rockets.push(_rocket);
        uint256 newrocketId =  rockets.length;

      
        require(newrocketId == uint256(uint32(newrocketId)));

        // emit the build event
        emit Build(
            _owner,
            newrocketId,
            uint256(_rocket.inventorModelId),
            uint256(_rocket.architectModelId)
        );

        // This will assign ownership, and also emit the Transfer event as
        // per ERC721 draft
        _mint(_owner, newrocketId);

        return newrocketId;
    }

    /// @notice Returns the total number of rockets currently in existence.
    /// @dev Required for ERC-721 compliance.
    function totalSupply() public view returns (uint) {
        return rockets.length - 1;
    }

    /// @notice Returns a list of all Rocket IDs assigned to an address.
    /// @param _owner The owner whose rockets we are interested in.
    /// @dev This method MUST NEVER be called by smart contract code. First, it's fairly
    ///  expensive (it walks the entire Rocket array looking for rockets belonging to owner),
    ///  but it also returns a dynamic array, which is only supported for web3 calls, and
    ///  not contract-to-contract calls.
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ownerTokens) {
        uint256 tokenCount = balanceOf(_owner);

        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 totalRockets = totalSupply();
            uint256 resultIndex = 0;

            // We count on the fact that all rockets have IDs starting at 1 and increasing
            // sequentially up to the totalRocketcount.
            uint256 rocketId;

            for (rocketId = 1; rocketId <= totalRockets; rocketId++) {
                if (_owners[rocketId] == _owner) {
                    result[resultIndex] = rocketId;
                    resultIndex++;
                }
            }

            return result;
        }
    }

  function setRecovery(uint32[14] calldata  _recovery) external onlyOwner {
        recovery = _recovery;
    }
}

contract RocketBuildBase is RocketBase{

    event Inventing(address owner, uint256 inventorModelId, uint256 architectModelId, uint256 recoveryEndTime);

    /// @notice The minimum payment required to use build new rocket 
    uint256 public autoBuildFee = 2e15;
    // platform charge percentage
    uint256 public charge = 10; // 10 equals 1% 
    // Keeps track of number of preProduction rocket.
    uint256 public preProductionRockets;
 
    /// @dev Checks that a given rocket is able to build. Requires that the
    ///  current recovery is finished (for architectModels) and also checks that there is
    ///  no pending processing.
    function _isReadyToBuild(Rocket memory _rocket) internal view returns (bool) {
        // In addition to checking the recoveryEndTime, we also need to check to see if
        // the rockethas a pending launch; there can be some period of time between the end
        // of the processing timer and the build event.
        return (_rocket.ProcessingWithId == 0) && (_rocket.recoveryEndTime <= uint64(block.timestamp));
    }

    /// @dev Check if a architectModel has authorized building with this inventorModel. True if both architectModel
    ///  and inventorModel have the same owner, or if the architectModel has given build permission to
    ///  the inventorModel's owner (via approveArchitectModel()).
    function _isArchitectModelPermitted(uint256 _architectModelId, uint256 _inventorModelId) internal view returns (bool) {
        address inventorModelOwner = _owners[_inventorModelId];
        address architectModelOwner = _owners[_architectModelId];

        // ArchitectModel is okay if they have same owner, or if the inventorModel's owner was given
        // permission to build with this architectModel.
        return (inventorModelOwner == architectModelOwner || architectModelAllowedToAddress[_architectModelId] == inventorModelOwner);
    }

    /// @dev Set the recoveryEndTime for the given Rocket, based on its current recoveryIndex.
    ///  Also increments the recoveryIndex (unless it has hit the cap).
    /// @param _rocket A reference to the Rocket in storage which needs its timer started.
    function _triggerRecovery(Rocket storage _rocket) internal {
        // Compute an estimation of the recovery time in blocks (based on current recoveryIndex).
        _rocket.recoveryEndTime = uint64((recovery[_rocket.recoveryIndex]) + block.timestamp);

        // Increment the building count, clamping it at 13
        if (_rocket.recoveryIndex < 13) {
            _rocket.recoveryIndex += 1;
        }
    }

    /// @notice Grants approval to another user to architectModel with one of your Rocket.
    /// @param _addr The address that will be able to  create new rocket using architectModel with your Rocket. Set to
    ///  address(0) to clear all Processing approvals for this Rocket.
    /// @param _architectModelId A Rocket that you own that _addr will now be able to architectModel with.
    function approveArchitectModel(address _addr, uint256 _architectModelId)
        external
        whenNotPaused
    {
        require(_owns(msg.sender, _architectModelId));
        architectModelAllowedToAddress[_architectModelId] = _addr;
    }

    /// @dev Updates the minimum payment required for building new rocket. 
    function setAutoBuildFee(uint256 val) external onlyOwner {
        autoBuildFee = val;
    }

    /// @dev Checks to see if a given Rocket is preProduction and (if so) if the processing
    ///  period has passed.
    function _isReadyToLaunch(Rocket memory _inventorModel) private view returns (bool) {
        return (_inventorModel.ProcessingWithId != 0) && (_inventorModel.recoveryEndTime <= uint64(block.timestamp));
    }

    /// @notice Checks that a given rocket is able to build (i.e. it is not preProduction or
    ///  in the middle of a Processing recovery).
    /// @param _rocketId reference the id of the rocket, any user can inquire about it
    function isReadyToBuild(uint256 _rocketId)
        public
        view
        returns (bool)
    {
        require(_rocketId > 0);
        Rocket storage _rocket = rockets[_rocketId];
        return _isReadyToBuild(_rocket);
    }

    /// @dev Checks whether a rocket is currently preProduction.
    /// @param _rocketId reference the id of the rocket, any user can inquire about it
    function isInventing(uint256 _rocketId)
        public
        view
        returns (bool)
    {
        require(_rocketId > 0);
        // A rocket is preProduction if and only if this field is set
        return rockets[_rocketId].ProcessingWithId != 0;
    }

    /// @dev Internal check to see if a given architectModel and inventorModel are a valid inventor model.
    /// @param _inventorModel A reference to the Rocket struct of the potential inventorModel.
    /// @param _inventorModelId The inventorModel's ID.
    /// @param _architectModel A reference to the Rocket struct of the potential architectModel.
    /// @param _architectModelId The architectModel's ID
    function _isValidInventorModel(
        Rocket storage _inventorModel,
        uint256 _inventorModelId,
        Rocket storage _architectModel,
        uint256 _architectModelId
    )
        private
        view
        returns(bool)
    {
        // A Rocket can't build with itself!
        if (_inventorModelId == _architectModelId) {
            return false;
        }

        // Rocket can't build with inventor .
        if (_inventorModel.inventorModelId == _architectModelId || _inventorModel.architectModelId == _architectModelId) {
            return false;
        }
        if (_architectModel.inventorModelId == _inventorModelId || _architectModel.architectModelId == _inventorModelId) {
            return false;
        }

        // We can short circuit the  co model check (below) if either rocketis
        // gen zero (has a inventorModel ID of zero).
        if (_architectModel.inventorModelId == 0 || _inventorModel.inventorModelId == 0) {
            return true;
        }

        // Rocket can't build with full or half co models.
        if (_architectModel.inventorModelId == _inventorModel.inventorModelId || _architectModel.inventorModelId == _inventorModel.architectModelId) {
            return false;
        }
        if (_architectModel.architectModelId == _inventorModel.inventorModelId || _architectModel.architectModelId == _inventorModel.architectModelId) {
            return false;
        }

        return true;
    }

    /// @dev Internal check to see if a given architectModel and inventorModel are a valid inventor model for
    ///  building via auction (i.e. skips ownership and Processing approval checks).
    function _canBuildWithViaAuction(uint256 _inventorModelId, uint256 _architectModelId)
        internal
        view
        returns (bool)
    {
        Rocket storage inventorModel = rockets[_inventorModelId];
        Rocket storage architectModel = rockets[_architectModelId];
        return _isValidInventorModel(inventorModel, _inventorModelId, architectModel, _architectModelId);
    }

    /// @notice Checks to see if two rocket can build together, including checks for
    ///  ownership and Processing approvals. 
    /// @param _inventorModelId The ID of the proposed inventorModel.
    /// @param _architectModelId The ID of the proposed architectModel.
    function canBuildWith(uint256 _inventorModelId, uint256 _architectModelId)
        external
        view
        returns(bool)
    {
        require(_inventorModelId > 0);
        require(_architectModelId > 0);
        Rocket storage inventorModel = rockets[_inventorModelId];
        Rocket storage architectModel = rockets[_architectModelId];
        return _isValidInventorModel(inventorModel, _inventorModelId, architectModel, _architectModelId) &&
            _isArchitectModelPermitted(_architectModelId, _inventorModelId);
    }

    /// @dev Internal utility function to initiate building, assumes that all building
    ///  requirements have been checked.
    function _buildWith(uint256 _inventorModelId, uint256 _architectModelId) internal {
        // Grab a reference to the Rocket from storage.
        Rocket storage architectModel = rockets[_architectModelId];
        Rocket storage inventorModel = rockets[_inventorModelId];

        inventorModel.ProcessingWithId = uint32(_architectModelId);

        // Trigger the recovery for both inventor .
        _triggerRecovery(architectModel);
        _triggerRecovery(inventorModel);

        // Clear Processing permission for both inventor . This may not be strictly necessary
        delete architectModelAllowedToAddress[_inventorModelId];
        delete architectModelAllowedToAddress[_architectModelId];

        // Every time a new rocket gets in preProduction, counter is incremented.
        preProductionRockets++;

        // Emit the processing event.
        emit Inventing(_owners[_inventorModelId], _inventorModelId, _architectModelId, inventorModel.recoveryEndTime);
    }

    /// @notice Build a Rocket you own (as inventorModel) with a architectModel that you own, or for which you
    ///  have previously been given ArchitectModel approval. Will either make your rocket preProduction, or will
    ///  fail entirely. Requires a pre-payment of the fee given out to the first caller of giveBuild()
    /// @param _inventorModelId The ID of the Rocket acting as inventorModel (will end up preProduction if successful)
    /// @param _architectModelId The ID of the Rocket acting as architectModel (will begin its Processing recovery if successful)
    function buildNewRocket(uint256 _inventorModelId, uint256 _architectModelId)
        external
        payable
        whenNotPaused
    {
        // Checks for payment.
        require(msg.value >= autoBuildFee);

        // Caller must own the inventorModel.
        require(_owns(msg.sender, _inventorModelId));
      
        // Check that inventorModel and architectModel are both owned by caller, or that the architectModel
        // has given Processing permission to caller (i.e. inventorModel's owner).
        // Will fail for _architectModelId = 0
        require(_isArchitectModelPermitted(_architectModelId, _inventorModelId));

        // Grab a reference to the potential inventorModel
        Rocket storage inventorModel = rockets[_inventorModelId];

        // Make sure inventorModel isn't preProduction, or in the middle of a Processing recovery
        require(_isReadyToBuild(inventorModel));

        // Grab a reference to the potential architectModel
        Rocket storage architectModel = rockets[_architectModelId];

        // Make sure architectModel isn't preProduction, or in the middle of a Processing recovery
        require(_isReadyToBuild(architectModel));

        // Test that these rocket are a valid inventor model.
        require(_isValidInventorModel(
            inventorModel,
            _inventorModelId,
            architectModel,
            _architectModelId
        ));

        // All checks passed, rocket gets preProduction!
        _buildWith(_inventorModelId, _architectModelId);
    }

    /// @notice Have a preProduction Rocket give build!
    /// @param _inventorModelId A Rocket ready to give build.
    /// @return The Rocket ID of the new rocket.
    /// @dev Looks at a given Rocket and, if preProduction and if the processing period has passed,
    ///  combines the  of the two inventor  to create a new rocket. The new Rocket is assigned
    ///  to the current owner of the inventorModel. Upon successful completion, both the inventorModel and the
    ///  new rocket will be ready to build again. Note that anyone can call this function (if they
    ///  are willing to pay the gas!), but the new rocket always goes to the inventorModel's owner.
    function LaunchRocket(uint256 _inventorModelId)
        external
        whenNotPaused
        returns(uint256)
    {
        // Grab a reference to the inventorModel in storage.
        Rocket storage inventorModel = rockets[_inventorModelId];

        // Check that the inventorModel is a valid rocket.
        require(inventorModel.buildTime != 0);

        // Check that its time has come!
        require(_isReadyToLaunch(inventorModel));

        // Grab a reference to the architectModel in storage.
        uint256 architectModelId = inventorModel.ProcessingWithId;
        Rocket storage architectModel = rockets[architectModelId];

        // Determine the higher generation number of the two inventor 
        uint16 parentGen = inventorModel.generation;
        if (architectModel.generation > inventorModel.generation) {
            parentGen = architectModel.generation;
        }


        // Make the new rocket!
        address owner = _owners[_inventorModelId];
        uint256 rocketId = _createRocket(_inventorModelId, inventorModel.ProcessingWithId, parentGen + 1,  owner);

        delete inventorModel.ProcessingWithId;

        // Every time a rocket gives build counter is decremented.
        preProductionRockets--;

        // Send the balance fee to the person who made build happen.
        payable(msg.sender).transfer(autoBuildFee-(autoBuildFee*charge/1000));

        // return the new rocket's ID
        return rocketId;
    }

    /// @dev Returns true if the claimant owns the token.
    /// @param _claimant - Address claiming to own the token.
    /// @param _tokenId - ID of token whose ownership to verify.
    function _owns(address _claimant, uint256 _tokenId) internal view returns (bool) {
        return (ownerOf(_tokenId) == _claimant);
    }

}

contract AuctionBase is RocketBuildBase {

    /// @dev Sets the reference to the sale auction.
    /// @param _address - Address of sale contract.
    function setSaleAuctionAddress(address _address) external onlyOwner {
        SaleClockAuction candidateContract = SaleClockAuction(_address);

        require(candidateContract.isSaleClockAuction());

        // Set the new contract address
        saleAuction = candidateContract;
    }

    /// @dev Put a rocket up for auction.
    ///  Does some ownership trickery to create auctions in one tx.
    function createSaleAuction(
        uint256 _rocketId,
        uint256 _startingPrice,
        uint256 _endingPrice,
        uint256 _duration,
        address _tokenAddress
    )
        external
        whenNotPaused
    {
        // Auction contract checks input sizes
        // If rocket is already on any auction, this will throw
        // because it will be owned by the auction contract.
        require(_owns(msg.sender, _rocketId));
        // Ensure the rocket is not inventing to prevent the auction
        // contract accidentally receiving ownership of the child.
        // NOTE: the rocket IS allowed to be in a recovery.
        require(!isInventing(_rocketId));
        _approve(address(saleAuction),_rocketId);
        // Sale auction throws if inputs are invalid and clears
        // transfer and architectModel approval after escrowing the rocket.
        saleAuction.createAuction(
            _rocketId,
            _startingPrice,
            _endingPrice,
            _duration,
            msg.sender,
            _tokenAddress
        );
    }
    
    /// @dev Transfers the balance of the sale auction contract
    /// to the RocketCore contract. We use two-step withdrawal to
    /// prevent two transfer calls in the auction bid function.
    function withdrawAuctionBalances() external onlyOwner {
        saleAuction.withdrawBalance();
    }
}

contract RocketdashMinting is AuctionBase {

    // Constants for gen0 auctions.
    uint256 public constant GEN0_STARTING_PRICE = 10e15;
    uint256 public constant GEN0_AUCTION_DURATION = 1 days;

    // Counts the number of rockets the contract owner has created.
    uint256 public promoCreatedCount;
    uint256 public gen0CreatedCount;
    uint256 public elononeCreatedCount;

    uint256 public initTime;

    address elonone = 0x97b65710D03E12775189F0D113202cc1443b0aa2;
    uint256 elononeRequirement = 40000000000 * 10**9; // 40b

    // for future business collab partner rockets
    // vars needed to split mint fees with partners and set price, time frame
    uint256 mintPrice;
    uint256 mintInit;
    uint256 mintPeriod;
    address payable partnerAddress;
    address payable teamAddress;

    mapping(address => bool) hasMinted;

    constructor (string memory _baseUri) {
        _setBaseURI(_baseUri);
    }

    IERC20 _elonone = IERC20(elonone);

    // to stop bot smart contracts from frontrunning minting
    modifier noContract(address account) {
        require(Address.isContract(account) == false, "Contracts are not allowed to interact with the farm");
        _;
    }

    function initElononeMint() external onlyOwner {
        initTime = block.timestamp;
    }

    function mintElononeRocket() external noContract(msg.sender) {
        uint256 bal = _elonone.balanceOf(msg.sender);
        require(bal >= elononeRequirement, "you need more ELONONE!");
        require(block.timestamp < initTime + 3 days, "ELONONE mint is over!");
        require(!hasMinted[msg.sender], "already minted");
        _createRocket(0, 0, 0, msg.sender);
        hasMinted[msg.sender] = true;
        gen0CreatedCount++;
        elononeCreatedCount++;
    }

    // 1 partner mint event at a time only
    function initPartnershipMintWithParams(uint256 _mintPrice, uint256 _mintPeriod, address payable _partnerAddress, address payable _teamAddress) external onlyOwner {
        mintPrice = _mintPrice;
        mintInit = block.timestamp;
        mintPeriod = _mintPeriod;
        partnerAddress = _partnerAddress;
        teamAddress = _teamAddress;
    }

    function mintPartnershipRocket() external payable noContract(msg.sender) {
        require(block.timestamp < mintInit + mintPeriod, "mint is over");
        require(msg.value >= mintPrice, "not enough ether supplied");
        _createRocket(0, 0, 0, msg.sender);
        gen0CreatedCount++;
        uint256 divi = msg.value / 2;
        partnerAddress.transfer(divi);
        teamAddress.transfer(divi);
    }

    function createMultipleRocket(address[] memory _owner,uint256 _count) external onlyOwner {
        require(_owner.length == _count,"Invalid count of minting");
        uint i;
        for(i = 0; i < _owner.length; i++){

            address rocketOwner = _owner[i];
            if (rocketOwner == address(0)) {
                rocketOwner = owner();
            }

            promoCreatedCount++;
            _createRocket(0, 0, 0,  rocketOwner);
        }
    }

    /// @dev Creates a new gen0 rocket
    ///  creates an auction for it.
    function createGen0Auction(address _tokenAddress) external onlyOwner {

        uint256 rocketId = _createRocket(0, 0, 0, address(this));
        _approve(address(saleAuction), rocketId);

        saleAuction.createAuction(
            rocketId,
            _computeNextGen0Price(),
            0,
            GEN0_AUCTION_DURATION,
            address(this),
            _tokenAddress
        );

        gen0CreatedCount++;
    }

    /// @dev Computes the next gen0 auction starting price, given
    ///  the average of the past 5 prices + 50%.
    function _computeNextGen0Price() internal view returns (uint256) {
        uint256 avePrice = saleAuction.averageGen0SalePrice();

        // Sanity check to ensure we don't overflow arithmetic
        require(avePrice == uint256(uint128(avePrice)));
        uint256 nextPrice = avePrice + (avePrice / 2);

        // We never auction for less than starting price
        if (nextPrice < GEN0_STARTING_PRICE) {
            nextPrice = GEN0_STARTING_PRICE;
        }
        return nextPrice;
    }


    /// @notice Returns all the relevant information about a specific rocket.
    /// @param _id The ID of the rocket of interest.
    function getRocket(uint256 _id)
        external
        view
        returns (
        bool isProcessing,
        bool isReady,
        uint256 recoveryIndex,
        uint256 nextActionAt,
        uint256 ProcessingWithId,
        uint256 buildTime,
        uint256 inventorModelId,
        uint256 architectModelId,
        uint256 generation
    ) {
        Rocket storage _rocket = rockets[_id];

        // if this variable is 0 then it's not building 
        isProcessing = (_rocket.ProcessingWithId != 0);
        isReady = (_rocket.recoveryEndTime <= block.timestamp);
        recoveryIndex = uint256(_rocket.recoveryIndex);
        nextActionAt = uint256(_rocket.recoveryEndTime);
        ProcessingWithId = uint256(_rocket.ProcessingWithId);
        buildTime = uint256(_rocket.buildTime);
        inventorModelId = uint256(_rocket.inventorModelId);
        architectModelId = uint256(_rocket.architectModelId);
        generation = uint256(_rocket.generation);
    }

     // @dev Allows the owner to capture the balance available to the contract.
    function withdrawBalance() external onlyOwner {
        uint256 balance = address(this).balance;
        // Subtract all the currently preProduction rockets we have, plus 1 of margin.
        uint256 subtractFees = (preProductionRockets + 1) * autoBuildFee;

        if (balance > subtractFees) {
            payable(msg.sender).transfer(balance - subtractFees);
        }
    }
    
    // @dev allow contract to receive ether 
    receive () external payable {}

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"rocketId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"architectModelId","type":"uint256"}],"name":"Build","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"architectModelId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"recoveryEndTime","type":"uint256"}],"name":"Inventing","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"GEN0_AUCTION_DURATION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GEN0_STARTING_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"}],"name":"LaunchRocket","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","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":"_addr","type":"address"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"approveArchitectModel","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"architectModelAllowedToAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"autoBuildFee","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"buildNewRocket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_inventorModelId","type":"uint256"},{"internalType":"uint256","name":"_architectModelId","type":"uint256"}],"name":"canBuildWith","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"createGen0Auction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owner","type":"address[]"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"createMultipleRocket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"},{"internalType":"uint256","name":"_startingPrice","type":"uint256"},{"internalType":"uint256","name":"_endingPrice","type":"uint256"},{"internalType":"uint256","name":"_duration","type":"uint256"},{"internalType":"address","name":"_tokenAddress","type":"address"}],"name":"createSaleAuction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"elononeCreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gen0CreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getRocket","outputs":[{"internalType":"bool","name":"isProcessing","type":"bool"},{"internalType":"bool","name":"isReady","type":"bool"},{"internalType":"uint256","name":"recoveryIndex","type":"uint256"},{"internalType":"uint256","name":"nextActionAt","type":"uint256"},{"internalType":"uint256","name":"ProcessingWithId","type":"uint256"},{"internalType":"uint256","name":"buildTime","type":"uint256"},{"internalType":"uint256","name":"inventorModelId","type":"uint256"},{"internalType":"uint256","name":"architectModelId","type":"uint256"},{"internalType":"uint256","name":"generation","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initElononeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"},{"internalType":"uint256","name":"_mintPeriod","type":"uint256"},{"internalType":"address payable","name":"_partnerAddress","type":"address"},{"internalType":"address payable","name":"_teamAddress","type":"address"}],"name":"initPartnershipMintWithParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"initTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"}],"name":"isInventing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rocketId","type":"uint256"}],"name":"isReadyToBuild","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintElononeRocket","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPartnershipRocket","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preProductionRockets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"promoCreatedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"recovery","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleAuction","outputs":[{"internalType":"contract SaleClockAuction","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"val","type":"uint256"}],"name":"setAutoBuildFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32[14]","name":"_recovery","type":"uint32[14]"}],"name":"setRecovery","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"setSaleAuctionAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"ownerTokens","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAuctionBalances","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

610240604052603c6080908152607860a05261012c60c05261025860e05261070861010052610e1061012052611c2061014052613840610160526170806101805261e1006101a052620151806101c0526202a3006101e052620546006102005262093a80610220526200007790600890600e62000202565b5066071afd498d0000600d55600a600e55601480547397b65710d03e12775189f0d113202cc1443b0aa26001600160a01b0319918216811790925568022b1c8c1227a00000601555601c80549091169091179055348015620000d857600080fd5b50604051620058cc380380620058cc833981016040819052620000fb91620002d2565b60405180604001604052806006815260200165149bd8dad95d60d21b8152506040518060400160405280600a8152602001690a4dec6d6cae888c2e6d60b31b81525062000157620001516200019c60201b60201c565b620001a0565b6000805460ff60a01b19169055600162000172838262000436565b50600262000181828262000436565b5050506200019581620001f060201b60201c565b5062000502565b3390565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6007620001fe828262000436565b5050565b600283019183908215620002935791602002820160005b838211156200025f57835183826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030262000219565b8015620002915782816101000a81549063ffffffff02191690556004016020816003010492830192600103026200025f565b505b50620002a1929150620002a5565b5090565b5b80821115620002a15760008155600101620002a6565b634e487b7160e01b600052604160045260246000fd5b60006020808385031215620002e657600080fd5b82516001600160401b0380821115620002fe57600080fd5b818501915085601f8301126200031357600080fd5b815181811115620003285762000328620002bc565b604051601f8201601f19908116603f01168101908382118183101715620003535762000353620002bc565b8160405282815288868487010111156200036c57600080fd5b600093505b8284101562000390578484018601518185018701529285019262000371565b600086848301015280965050505050505092915050565b600181811c90821680620003bc57607f821691505b602082108103620003dd57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200043157600081815260208120601f850160051c810160208610156200040c5750805b601f850160051c820191505b818110156200042d5782815560010162000418565b5050505b505050565b81516001600160401b03811115620004525762000452620002bc565b6200046a81620004638454620003a7565b84620003e3565b602080601f831160018114620004a25760008415620004895750858301515b600019600386901b1c1916600185901b1785556200042d565b600085815260208120601f198616915b82811015620004d357888601518255948401946001909101908401620004b2565b5085821015620004f25787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6153ba80620005126000396000f3fe6080604052600436106103595760003560e01c80636872ebdf116101bb5780639b7df652116100f7578063e319856d11610095578063e985e9c51161006f578063e985e9c5146109a4578063f1ca9410146109fa578063f2fde38b14610a10578063faea4a7414610a3057600080fd5b8063e319856d14610937578063e3868b4f14610957578063e6cbe3511461097757600080fd5b8063b88d4fde116100d1578063b88d4fde146108b7578063c87b56dd146108d7578063ca0e7fd3146108f7578063d4236f2d1461091757600080fd5b80639b7df65214610811578063a22cb46514610831578063aed4f39c1461085157600080fd5b80638462151c1161016457806391876e571161013e57806391876e57146107bd578063937df102146107d257806395d89b41146107e75780639abc8320146107fc57600080fd5b80638462151c1461074f5780638d3cfa9b1461077c5780638da5cb5b1461079257600080fd5b8063715018a611610195578063715018a61461071257806381e58b29146107275780638456cb591461073a57600080fd5b80636872ebdf146106bd5780636fbde40d146106d257806370a08231146106f257600080fd5b80631e419ff3116102955780634a696f15116102335780635c975abb1161020d5780635c975abb146106385780635f4fe931146106685780635fd8c710146106885780636352211e1461069d57600080fd5b80634a696f15146105e2578063551619131461060257806355f804b31461061857600080fd5b80633f4ba83a1161026f5780633f4ba83a1461056d57806342842e0e146105825780634693aee5146105a25780634821fa0a146105c257600080fd5b80631e419ff31461051057806323b872dd146105185780632b079b2e1461053857600080fd5b8063081812fc116103025780631091b981116102dc5780631091b981146104ae57806314394f59146104ce57806318160ddd146104e457806319c2f201146104f957600080fd5b8063081812fc1461042e578063095ea7b3146104735780630e583df01461049357600080fd5b806305fe46001161033357806305fe4600146103d457806306fdde03146103ea57806307d6e9a41461040c57600080fd5b806301ffc9a714610365578063041151871461039a57806305e45546146103be57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b506103856103803660046149f9565b610a73565b60405190151581526020015b60405180910390f35b3480156103a657600080fd5b506103b060135481565b604051908152602001610391565b3480156103ca57600080fd5b506103b060105481565b3480156103e057600080fd5b506103b060125481565b3480156103f657600080fd5b506103ff610b58565b6040516103919190614a84565b34801561041857600080fd5b5061042c610427366004614ab9565b610bea565b005b34801561043a57600080fd5b5061044e610449366004614ad6565b610d87565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561047f57600080fd5b5061042c61048e366004614aef565b610e61565b34801561049f57600080fd5b506103b0662386f26fc1000081565b3480156104ba57600080fd5b5061042c6104c9366004614ad6565b610fed565b3480156104da57600080fd5b506103b0600f5481565b3480156104f057600080fd5b506103b0611073565b34801561050557600080fd5b506103b06201518081565b61042c61108a565b34801561052457600080fd5b5061042c610533366004614b1b565b6112c0565b34801561054457600080fd5b50610558610553366004614ad6565b611361565b60405163ffffffff9091168152602001610391565b34801561057957600080fd5b5061042c611391565b34801561058e57600080fd5b5061042c61059d366004614b1b565b6114f4565b3480156105ae57600080fd5b506103b06105bd366004614ad6565b61150f565b3480156105ce57600080fd5b5061042c6105dd366004614aef565b611893565b3480156105ee57600080fd5b506103856105fd366004614ad6565b61197e565b34801561060e57600080fd5b506103b0600e5481565b34801561062457600080fd5b5061042c610633366004614b5c565b611aaa565b34801561064457600080fd5b5060005474010000000000000000000000000000000000000000900460ff16610385565b34801561067457600080fd5b50610385610683366004614bce565b611b6e565b34801561069457600080fd5b5061042c611bf1565b3480156106a957600080fd5b5061044e6106b8366004614ad6565b611cd2565b3480156106c957600080fd5b5061042c611d84565b3480156106de57600080fd5b5061042c6106ed366004614ab9565b611e0b565b3480156106fe57600080fd5b506103b061070d366004614ab9565b611f51565b34801561071e57600080fd5b5061042c61201f565b61042c610735366004614bce565b6120ac565b34801561074657600080fd5b5061042c6123cb565b34801561075b57600080fd5b5061076f61076a366004614ab9565b612540565b6040516103919190614bf0565b34801561078857600080fd5b506103b0600d5481565b34801561079e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661044e565b3480156107c957600080fd5b5061042c612649565b3480156107de57600080fd5b5061042c612748565b3480156107f357600080fd5b506103ff612a35565b34801561080857600080fd5b506103ff612a44565b34801561081d57600080fd5b5061042c61082c366004614c34565b612a53565b34801561083d57600080fd5b5061042c61084c366004614c8f565b612bcf565b34801561085d57600080fd5b5061087161086c366004614ad6565b612ce5565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610391565b3480156108c357600080fd5b5061042c6108d2366004614d46565b612e3d565b3480156108e357600080fd5b506103ff6108f2366004614ad6565b612edf565b34801561090357600080fd5b50610385610912366004614ad6565b612fee565b34801561092357600080fd5b5061042c610932366004614e28565b613045565b34801561094357600080fd5b5061042c610952366004614ee0565b6131e1565b34801561096357600080fd5b5061042c610972366004614f2a565b6132c5565b34801561098357600080fd5b50600c5461044e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b057600080fd5b506103856109bf366004614f55565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0657600080fd5b506103b060115481565b348015610a1c57600080fd5b5061042c610a2b366004614ab9565b613353565b348015610a3c57600080fd5b5061044e610a4b366004614ad6565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060018054610b6790614f83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390614f83565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000610c80600080600030613483565b600c54909150610ca69073ffffffffffffffffffffffffffffffffffffffff16826137a2565b600c5473ffffffffffffffffffffffffffffffffffffffff16637e5d9bb782610ccd613842565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925260248201526000604482015262015180606482015230608482015273ffffffffffffffffffffffffffffffffffffffff851660a482015260c401600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b505060118054925090506000610d7e83614fff565b91905055505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e6c82611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c67565b3373ffffffffffffffffffffffffffffffffffffffff82161480610f525750610f5281336109bf565b610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c67565b610fe883836137a2565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d55565b600a5460009061108590600190615037565b905090565b33803b1561111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b60185460175461112a919061504a565b4210611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d696e74206973206f76657200000000000000000000000000000000000000006044820152606401610c67565b6016543410156111fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610c67565b61120c600080600033613483565b506011805490600061121d83614fff565b909155506000905061123060023461508c565b60195460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f19350505050158015611278573d6000803e3d6000fd5b50601a5460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b6112ca338261392d565b611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b610fe8838383613a99565b600881600e811061137157600080fd5b60089182820401919006600402915054906101000a900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610fe883838360405180602001604052806000815250612e3d565b6000805474010000000000000000000000000000000000000000900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6000600a83815481106115aa576115aa6150a0565b60009182526020822001805490925067ffffffffffffffff1690036115ce57600080fd5b6040805160e081018252825467ffffffffffffffff808216835268010000000000000000820416602083015263ffffffff70010000000000000000000000000000000082048116938301939093527401000000000000000000000000000000000000000081048316606083015278010000000000000000000000000000000000000000000000008104909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008304811660a08301527e0100000000000000000000000000000000000000000000000000000000000090920490911660c08201526116bd90613adc565b6116c657600080fd5b8054600a8054780100000000000000000000000000000000000000000000000090920463ffffffff16916000919083908110611704576117046150a0565b6000918252602090912084549101805490925061ffff7e010000000000000000000000000000000000000000000000000000000000009283900481169290910416811015611776575080547e01000000000000000000000000000000000000000000000000000000000000900461ffff165b600086815260036020526040812054855473ffffffffffffffffffffffffffffffffffffffff90911691906117de9089907801000000000000000000000000000000000000000000000000900463ffffffff166117d48660016150cf565b61ffff1685613483565b86547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff168755600f80549192506000611816836150f1565b91905055503373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8600e54600d546118489190615126565b611852919061508c565b600d5461185f9190615037565b6040518115909202916000818181858888f19350505050158015611887573d6000803e3d6000fd5b50979650505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6119223382613b0c565b61192b57600080fd5b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080821161198c57600080fd5b6000600a83815481106119a1576119a16150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c08301529150611aa390613b4c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b7b92505050565b5050565b6000808311611b7c57600080fd5b60008211611b8957600080fd5b6000600a8481548110611b9e57611b9e6150a0565b9060005260206000200190506000600a8481548110611bbf57611bbf6150a0565b906000526020600020019050611bd782868387613b87565b8015611be85750611be88486613d8b565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d54600f544791600091611c8890600161504a565b611c929190615126565b905080821115611b6a57336108fc611caa8385615037565b6040518115909202916000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c67565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b42601355565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60008190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f00919061513d565b611f0957600080fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b600073ffffffffffffffffffffffffffffffffffffffff8216611ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c67565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b6120aa6000613dfa565b565b60005474010000000000000000000000000000000000000000900460ff1615612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600d5434101561214057600080fd5b61214a3383613b0c565b61215357600080fd5b61215d8183613d8b565b61216657600080fd5b6000600a838154811061217b5761217b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061227d90613b4c565b61228657600080fd5b6000600a838154811061229b5761229b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061239d90613b4c565b6123a657600080fd5b6123b282858386613b87565b6123bb57600080fd5b6123c58484613e6f565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16156124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016114ea565b6060600061254d83611f51565b90508060000361256d575050604080516000815260208101909152919050565b60008167ffffffffffffffff81111561258857612588614cc8565b6040519080825280602002602001820160405280156125b1578160200160208202803683370190505b50905060006125be611073565b9050600060015b8281116126385760008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff808916911603612626578084838151811061260d5761260d6150a0565b60209081029190910101528161262281614fff565b9250505b8061263081614fff565b9150506125c5565b509195945050505050565b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146126ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273457600080fd5b505af11580156123c5573d6000803e3d6000fd5b33803b156127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b601c546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b919061515a565b90506015548110156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f796f75206e656564206d6f726520454c4f4e4f4e4521000000000000000000006044820152606401610c67565b6013546128e9906203f48061504a565b4210612951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f454c4f4e4f4e45206d696e74206973206f7665722100000000000000000000006044820152606401610c67565b336000908152601b602052604090205460ff16156129cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610c67565b6129d9600080600033613483565b50336000908152601b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556011805491612a2083614fff565b909155505060128054906000610d7e83614fff565b606060028054610b6790614f83565b606060078054610b6790614f83565b60005474010000000000000000000000000000000000000000900460ff1615612ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b612ae23386613b0c565b612aeb57600080fd5b612af485612fee565b15612afe57600080fd5b600c54612b219073ffffffffffffffffffffffffffffffffffffffff16866137a2565b600c546040517f7e5d9bb70000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064810184905233608482015273ffffffffffffffffffffffffffffffffffffffff83811660a483015290911690637e5d9bb79060c401600060405180830381600087803b158015612bb057600080fd5b505af1158015612bc4573d6000803e3d6000fd5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff831603612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c67565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080600080600080600080600080600a8b81548110612d0757612d076150a0565b9060005260206000200190508060000160189054906101000a900463ffffffff1663ffffffff16600014159950428160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115985080600001601c9054906101000a900461ffff1661ffff1697508060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1696508060000160189054906101000a900463ffffffff1663ffffffff1695508060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1694508060000160109054906101000a900463ffffffff1663ffffffff1693508060000160149054906101000a900463ffffffff1663ffffffff16925080600001601e9054906101000a900461ffff1661ffff169150509193959799909294969850565b612e47338361392d565b612ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b6123c584848484613ff0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c67565b6000612f9d612a44565b90506000815111612fbd5760405180602001604052806000815250611aa3565b80612fc784614093565b604051602001612fd8929190615173565b6040516020818303038152906040529392505050565b6000808211612ffc57600080fd5b600a828154811061300f5761300f6150a0565b6000918252602090912001547801000000000000000000000000000000000000000000000000900463ffffffff16151592915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b80825114613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420636f756e74206f66206d696e74696e6700000000000000006044820152606401610c67565b60005b8251811015610fe8576000838281518110613150576131506150a0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131a9575060005473ffffffffffffffffffffffffffffffffffffffff165b601080549060006131b983614fff565b91905055506131cc600080600084613483565b505080806131d990614fff565b915050613133565b60005473ffffffffffffffffffffffffffffffffffffffff163314613262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b601693909355426017556018919091556019805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155601a8054929093169116179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a600882600e614914565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8116613477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c67565b61348081613dfa565b50565b60008463ffffffff16851461349757600080fd5b8363ffffffff1684146134a957600080fd5b8261ffff1683146134b957600080fd5b60006134c660028561508c565b9050600d8161ffff1611156134d95750600d5b6040805160e08101825267ffffffffffffffff428116825260006020830181815263ffffffff808c169585019586528a8116606086019081526080860184815261ffff808a1660a089019081528d821660c08a01908152600a8054600181018255988190528a517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909901805498519c51965195519351925185167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939095167c0100000000000000000000000000000000000000000000000000000000027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff948916780100000000000000000000000000000000000000000000000002949094167fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff96891674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff988a1670010000000000000000000000000000000002989098167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9e8d1668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909b169b909c169a909a17989098179b909b16989098179390931791909116949094171793909316919091179055915490918116811461371f57600080fd5b604082810151606080850151835173ffffffffffffffffffffffffffffffffffffffff8a1681526020810186905263ffffffff9384168186015292169082015290517f428b559deb78ae264f175a82b90ecac7f28acc5c0bbce329463bcf94aa5ffd539181900360800190a161379585826141c8565b925050505b949350505050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906137fc82611cd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d6919061515a565b9050806fffffffffffffffffffffffffffffffff1681146138f657600080fd5b600061390360028361508c565b61390d908361504a565b9050662386f26fc10000811015610b525750662386f26fc1000092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff166139de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b60006139e983611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a5857508373ffffffffffffffffffffffffffffffffffffffff16613a4084610d87565b73ffffffffffffffffffffffffffffffffffffffff16145b8061379a575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff1661379a565b613aa4838383614390565b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816080015163ffffffff16600014158015610b525750506020015167ffffffffffffffff4281169116111590565b60008273ffffffffffffffffffffffffffffffffffffffff16613b2e83611cd2565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6000816080015163ffffffff166000148015610b525750506020015167ffffffffffffffff4281169116111590565b6007611b6a82826151f0565b6000818403613b985750600061379a565b8454700100000000000000000000000000000000900463ffffffff16821480613bdf5750845474010000000000000000000000000000000000000000900463ffffffff1682145b15613bec5750600061379a565b8254700100000000000000000000000000000000900463ffffffff16841480613c335750825474010000000000000000000000000000000000000000900463ffffffff1684145b15613c405750600061379a565b8254700100000000000000000000000000000000900463ffffffff161580613c8157508454700100000000000000000000000000000000900463ffffffff16155b15613c8e5750600161379a565b845483547001000000000000000000000000000000009182900463ffffffff90811692909104161480613cf8575084548354700100000000000000000000000000000000900463ffffffff9081167401000000000000000000000000000000000000000090920416145b15613d055750600061379a565b8454835474010000000000000000000000000000000000000000900463ffffffff908116700100000000000000000000000000000000909204161480613d73575084548354740100000000000000000000000000000000000000009182900463ffffffff9081169290910416145b15613d805750600061379a565b506001949350505050565b600081815260036020526040808220548483529082205473ffffffffffffffffffffffffffffffffffffffff918216911680821480611be857506000858152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908316149250505092915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600a8281548110613e8457613e846150a0565b9060005260206000200190506000600a8481548110613ea557613ea56150a0565b600091825260209091200180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff8616021781559050613f04826145f7565b613f0d816145f7565b6000848152600b602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585835290822080549091169055600f805491613f6083614fff565b9091555050600084815260036020908152604091829020548354835173ffffffffffffffffffffffffffffffffffffffff909216825291810187905291820185905268010000000000000000900467ffffffffffffffff1660608201527f8d386972618b2508abab1a415558214e499e5f02f175d1fa315d0fdd7022b23b9060800160405180910390a150505050565b613ffb848484613a99565b61400784848484614724565b6123c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b6060816000036140d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561410057806140ea81614fff565b91506140f99050600a8361508c565b91506140da565b60008167ffffffffffffffff81111561411b5761411b614cc8565b6040519080825280601f01601f191660200182016040528015614145576020820181803683370190505b5090505b841561379a5761415a600183615037565b9150614167600a8661530a565b61417290603061504a565b60f81b818381518110614187576141876150a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141c1600a8661508c565b9450614149565b801561424b5773ffffffffffffffffffffffffffffffffffffffff821661424b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c67565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156142d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061430d90849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8273ffffffffffffffffffffffffffffffffffffffff166143b082611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614614453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c67565b73ffffffffffffffffffffffffffffffffffffffff82166144f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c67565b6145006000826137a2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290614536908490615037565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061457190849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805442906008907c0100000000000000000000000000000000000000000000000000000000900461ffff16600e8110614632576146326150a0565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1661465e919061504a565b81547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff929092169190910217808255600d7c010000000000000000000000000000000000000000000000000000000090910461ffff1610156134805780546001908290601c906147079084907c0100000000000000000000000000000000000000000000000000000000900461ffff166150cf565b92506101000a81548161ffff021916908361ffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561490c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061479b90339089908890889060040161531e565b6020604051808303816000875af19250505080156147f4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526147f191810190615367565b60015b6148c1573d808015614822576040519150601f19603f3d011682016040523d82523d6000602084013e614827565b606091505b5080516000036148b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061379a565b50600161379a565b6002830191839082156149a65791602002820160005b8382111561497457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261492a565b80156149a45782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614974565b505b506149b29291506149b6565b5090565b5b808211156149b257600081556001016149b7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461348057600080fd5b600060208284031215614a0b57600080fd5b8135611aa3816149cb565b60005b83811015614a31578181015183820152602001614a19565b50506000910152565b60008151808452614a52816020860160208601614a16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aa36020830184614a3a565b73ffffffffffffffffffffffffffffffffffffffff8116811461348057600080fd5b600060208284031215614acb57600080fd5b8135611aa381614a97565b600060208284031215614ae857600080fd5b5035919050565b60008060408385031215614b0257600080fd5b8235614b0d81614a97565b946020939093013593505050565b600080600060608486031215614b3057600080fd5b8335614b3b81614a97565b92506020840135614b4b81614a97565b929592945050506040919091013590565b60008060208385031215614b6f57600080fd5b823567ffffffffffffffff80821115614b8757600080fd5b818501915085601f830112614b9b57600080fd5b813581811115614baa57600080fd5b866020828501011115614bbc57600080fd5b60209290920196919550909350505050565b60008060408385031215614be157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614c2857835183529284019291840191600101614c0c565b50909695505050505050565b600080600080600060a08688031215614c4c57600080fd5b853594506020860135935060408601359250606086013591506080860135614c7381614a97565b809150509295509295909350565b801515811461348057600080fd5b60008060408385031215614ca257600080fd5b8235614cad81614a97565b91506020830135614cbd81614c81565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3e57614d3e614cc8565b604052919050565b60008060008060808587031215614d5c57600080fd5b8435614d6781614a97565b9350602085810135614d7881614a97565b935060408601359250606086013567ffffffffffffffff80821115614d9c57600080fd5b818801915088601f830112614db057600080fd5b813581811115614dc257614dc2614cc8565b614df2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf7565b91508082528984828501011115614e0857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215614e3b57600080fd5b823567ffffffffffffffff80821115614e5357600080fd5b818501915085601f830112614e6757600080fd5b8135602082821115614e7b57614e7b614cc8565b8160051b9250614e8c818401614cf7565b8281529284018101928181019089851115614ea657600080fd5b948201945b84861015614ed05785359350614ec084614a97565b8382529482019490820190614eab565b9997909101359750505050505050565b60008060008060808587031215614ef657600080fd5b84359350602085013592506040850135614f0f81614a97565b91506060850135614f1f81614a97565b939692955090935050565b60006101c0808385031215614f3e57600080fd5b838184011115614f4d57600080fd5b509092915050565b60008060408385031215614f6857600080fd5b8235614f7381614a97565b91506020830135614cbd81614a97565b600181811c90821680614f9757607f821691505b602082108103612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503057615030614fd0565b5060010190565b81810381811115610b5257610b52614fd0565b80820180821115610b5257610b52614fd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261509b5761509b61505d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff8181168382160190808211156150ea576150ea614fd0565b5092915050565b60008161510057615100614fd0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610b5257610b52614fd0565b60006020828403121561514f57600080fd5b8151611aa381614c81565b60006020828403121561516c57600080fd5b5051919050565b60008351615185818460208801614a16565b835190830190615199818360208801614a16565b01949350505050565b601f821115610fe857600081815260208120601f850160051c810160208610156151c95750805b601f850160051c820191505b818110156151e8578281556001016151d5565b505050505050565b815167ffffffffffffffff81111561520a5761520a614cc8565b61521e816152188454614f83565b846151a2565b602080601f831160018114615271576000841561523b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556151e8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156152be5788860151825594840194600190910190840161529f565b50858210156152fa57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000826153195761531961505d565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261535d6080830184614a3a565b9695505050505050565b60006020828403121561537957600080fd5b8151611aa3816149cb56fea2646970667358221220a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c7608012764736f6c6343000811003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010726f636b6574646173682e67616d652f00000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106103595760003560e01c80636872ebdf116101bb5780639b7df652116100f7578063e319856d11610095578063e985e9c51161006f578063e985e9c5146109a4578063f1ca9410146109fa578063f2fde38b14610a10578063faea4a7414610a3057600080fd5b8063e319856d14610937578063e3868b4f14610957578063e6cbe3511461097757600080fd5b8063b88d4fde116100d1578063b88d4fde146108b7578063c87b56dd146108d7578063ca0e7fd3146108f7578063d4236f2d1461091757600080fd5b80639b7df65214610811578063a22cb46514610831578063aed4f39c1461085157600080fd5b80638462151c1161016457806391876e571161013e57806391876e57146107bd578063937df102146107d257806395d89b41146107e75780639abc8320146107fc57600080fd5b80638462151c1461074f5780638d3cfa9b1461077c5780638da5cb5b1461079257600080fd5b8063715018a611610195578063715018a61461071257806381e58b29146107275780638456cb591461073a57600080fd5b80636872ebdf146106bd5780636fbde40d146106d257806370a08231146106f257600080fd5b80631e419ff3116102955780634a696f15116102335780635c975abb1161020d5780635c975abb146106385780635f4fe931146106685780635fd8c710146106885780636352211e1461069d57600080fd5b80634a696f15146105e2578063551619131461060257806355f804b31461061857600080fd5b80633f4ba83a1161026f5780633f4ba83a1461056d57806342842e0e146105825780634693aee5146105a25780634821fa0a146105c257600080fd5b80631e419ff31461051057806323b872dd146105185780632b079b2e1461053857600080fd5b8063081812fc116103025780631091b981116102dc5780631091b981146104ae57806314394f59146104ce57806318160ddd146104e457806319c2f201146104f957600080fd5b8063081812fc1461042e578063095ea7b3146104735780630e583df01461049357600080fd5b806305fe46001161033357806305fe4600146103d457806306fdde03146103ea57806307d6e9a41461040c57600080fd5b806301ffc9a714610365578063041151871461039a57806305e45546146103be57600080fd5b3661036057005b600080fd5b34801561037157600080fd5b506103856103803660046149f9565b610a73565b60405190151581526020015b60405180910390f35b3480156103a657600080fd5b506103b060135481565b604051908152602001610391565b3480156103ca57600080fd5b506103b060105481565b3480156103e057600080fd5b506103b060125481565b3480156103f657600080fd5b506103ff610b58565b6040516103919190614a84565b34801561041857600080fd5b5061042c610427366004614ab9565b610bea565b005b34801561043a57600080fd5b5061044e610449366004614ad6565b610d87565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610391565b34801561047f57600080fd5b5061042c61048e366004614aef565b610e61565b34801561049f57600080fd5b506103b0662386f26fc1000081565b3480156104ba57600080fd5b5061042c6104c9366004614ad6565b610fed565b3480156104da57600080fd5b506103b0600f5481565b3480156104f057600080fd5b506103b0611073565b34801561050557600080fd5b506103b06201518081565b61042c61108a565b34801561052457600080fd5b5061042c610533366004614b1b565b6112c0565b34801561054457600080fd5b50610558610553366004614ad6565b611361565b60405163ffffffff9091168152602001610391565b34801561057957600080fd5b5061042c611391565b34801561058e57600080fd5b5061042c61059d366004614b1b565b6114f4565b3480156105ae57600080fd5b506103b06105bd366004614ad6565b61150f565b3480156105ce57600080fd5b5061042c6105dd366004614aef565b611893565b3480156105ee57600080fd5b506103856105fd366004614ad6565b61197e565b34801561060e57600080fd5b506103b0600e5481565b34801561062457600080fd5b5061042c610633366004614b5c565b611aaa565b34801561064457600080fd5b5060005474010000000000000000000000000000000000000000900460ff16610385565b34801561067457600080fd5b50610385610683366004614bce565b611b6e565b34801561069457600080fd5b5061042c611bf1565b3480156106a957600080fd5b5061044e6106b8366004614ad6565b611cd2565b3480156106c957600080fd5b5061042c611d84565b3480156106de57600080fd5b5061042c6106ed366004614ab9565b611e0b565b3480156106fe57600080fd5b506103b061070d366004614ab9565b611f51565b34801561071e57600080fd5b5061042c61201f565b61042c610735366004614bce565b6120ac565b34801561074657600080fd5b5061042c6123cb565b34801561075b57600080fd5b5061076f61076a366004614ab9565b612540565b6040516103919190614bf0565b34801561078857600080fd5b506103b0600d5481565b34801561079e57600080fd5b5060005473ffffffffffffffffffffffffffffffffffffffff1661044e565b3480156107c957600080fd5b5061042c612649565b3480156107de57600080fd5b5061042c612748565b3480156107f357600080fd5b506103ff612a35565b34801561080857600080fd5b506103ff612a44565b34801561081d57600080fd5b5061042c61082c366004614c34565b612a53565b34801561083d57600080fd5b5061042c61084c366004614c8f565b612bcf565b34801561085d57600080fd5b5061087161086c366004614ad6565b612ce5565b604080519915158a5297151560208a0152968801959095526060870193909352608086019190915260a085015260c084015260e083015261010082015261012001610391565b3480156108c357600080fd5b5061042c6108d2366004614d46565b612e3d565b3480156108e357600080fd5b506103ff6108f2366004614ad6565b612edf565b34801561090357600080fd5b50610385610912366004614ad6565b612fee565b34801561092357600080fd5b5061042c610932366004614e28565b613045565b34801561094357600080fd5b5061042c610952366004614ee0565b6131e1565b34801561096357600080fd5b5061042c610972366004614f2a565b6132c5565b34801561098357600080fd5b50600c5461044e9073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109b057600080fd5b506103856109bf366004614f55565b73ffffffffffffffffffffffffffffffffffffffff918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a0657600080fd5b506103b060115481565b348015610a1c57600080fd5b5061042c610a2b366004614ab9565b613353565b348015610a3c57600080fd5b5061044e610a4b366004614ad6565b600b6020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60007fffffffff0000000000000000000000000000000000000000000000000000000082167f80ac58cd000000000000000000000000000000000000000000000000000000001480610b0657507fffffffff0000000000000000000000000000000000000000000000000000000082167f5b5e139f00000000000000000000000000000000000000000000000000000000145b80610b5257507f01ffc9a7000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008316145b92915050565b606060018054610b6790614f83565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9390614f83565b8015610be05780601f10610bb557610100808354040283529160200191610be0565b820191906000526020600020905b815481529060010190602001808311610bc357829003601f168201915b5050505050905090565b60005473ffffffffffffffffffffffffffffffffffffffff163314610c70576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b6000610c80600080600030613483565b600c54909150610ca69073ffffffffffffffffffffffffffffffffffffffff16826137a2565b600c5473ffffffffffffffffffffffffffffffffffffffff16637e5d9bb782610ccd613842565b6040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b168152600481019290925260248201526000604482015262015180606482015230608482015273ffffffffffffffffffffffffffffffffffffffff851660a482015260c401600060405180830381600087803b158015610d5557600080fd5b505af1158015610d69573d6000803e3d6000fd5b505060118054925090506000610d7e83614fff565b91905055505050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff16610e38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b5060009081526005602052604090205473ffffffffffffffffffffffffffffffffffffffff1690565b6000610e6c82611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610f29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610c67565b3373ffffffffffffffffffffffffffffffffffffffff82161480610f525750610f5281336109bf565b610fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610c67565b610fe883836137a2565b505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461106e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d55565b600a5460009061108590600190615037565b905090565b33803b1561111a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b60185460175461112a919061504a565b4210611192576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f6d696e74206973206f76657200000000000000000000000000000000000000006044820152606401610c67565b6016543410156111fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f6e6f7420656e6f75676820657468657220737570706c696564000000000000006044820152606401610c67565b61120c600080600033613483565b506011805490600061121d83614fff565b909155506000905061123060023461508c565b60195460405191925073ffffffffffffffffffffffffffffffffffffffff169082156108fc029083906000818181858888f19350505050158015611278573d6000803e3d6000fd5b50601a5460405173ffffffffffffffffffffffffffffffffffffffff9091169082156108fc029083906000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b6112ca338261392d565b611356576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b610fe8838383613a99565b600881600e811061137157600080fd5b60089182820401919006600402915054906101000a900463ffffffff1681565b60005473ffffffffffffffffffffffffffffffffffffffff163314611412576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16611496576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff1690556040513381527f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa906020015b60405180910390a1565b610fe883838360405180602001604052806000815250612e3d565b6000805474010000000000000000000000000000000000000000900460ff1615611595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6000600a83815481106115aa576115aa6150a0565b60009182526020822001805490925067ffffffffffffffff1690036115ce57600080fd5b6040805160e081018252825467ffffffffffffffff808216835268010000000000000000820416602083015263ffffffff70010000000000000000000000000000000082048116938301939093527401000000000000000000000000000000000000000081048316606083015278010000000000000000000000000000000000000000000000008104909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008304811660a08301527e0100000000000000000000000000000000000000000000000000000000000090920490911660c08201526116bd90613adc565b6116c657600080fd5b8054600a8054780100000000000000000000000000000000000000000000000090920463ffffffff16916000919083908110611704576117046150a0565b6000918252602090912084549101805490925061ffff7e010000000000000000000000000000000000000000000000000000000000009283900481169290910416811015611776575080547e01000000000000000000000000000000000000000000000000000000000000900461ffff165b600086815260036020526040812054855473ffffffffffffffffffffffffffffffffffffffff90911691906117de9089907801000000000000000000000000000000000000000000000000900463ffffffff166117d48660016150cf565b61ffff1685613483565b86547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff168755600f80549192506000611816836150f1565b91905055503373ffffffffffffffffffffffffffffffffffffffff166108fc6103e8600e54600d546118489190615126565b611852919061508c565b600d5461185f9190615037565b6040518115909202916000818181858888f19350505050158015611887573d6000803e3d6000fd5b50979650505050505050565b60005474010000000000000000000000000000000000000000900460ff1615611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b6119223382613b0c565b61192b57600080fd5b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b600080821161198c57600080fd5b6000600a83815481106119a1576119a16150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c08301529150611aa390613b4c565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a82828080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250613b7b92505050565b5050565b6000808311611b7c57600080fd5b60008211611b8957600080fd5b6000600a8481548110611b9e57611b9e6150a0565b9060005260206000200190506000600a8481548110611bbf57611bbf6150a0565b906000526020600020019050611bd782868387613b87565b8015611be85750611be88486613d8b565b95945050505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314611c72576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600d54600f544791600091611c8890600161504a565b611c929190615126565b905080821115611b6a57336108fc611caa8385615037565b6040518115909202916000818181858888f19350505050158015610fe8573d6000803e3d6000fd5b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff1680610b52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e00000000000000000000000000000000000000000000006064820152608401610c67565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b42601355565b60005473ffffffffffffffffffffffffffffffffffffffff163314611e8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60008190508073ffffffffffffffffffffffffffffffffffffffff166385b861886040518163ffffffff1660e01b8152600401602060405180830381865afa158015611edc573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f00919061513d565b611f0957600080fd5b600c80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b600073ffffffffffffffffffffffffffffffffffffffff8216611ff6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f2061646472657373000000000000000000000000000000000000000000006064820152608401610c67565b5073ffffffffffffffffffffffffffffffffffffffff1660009081526004602052604090205490565b60005473ffffffffffffffffffffffffffffffffffffffff1633146120a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b6120aa6000613dfa565b565b60005474010000000000000000000000000000000000000000900460ff1615612131576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600d5434101561214057600080fd5b61214a3383613b0c565b61215357600080fd5b61215d8183613d8b565b61216657600080fd5b6000600a838154811061217b5761217b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061227d90613b4c565b61228657600080fd5b6000600a838154811061229b5761229b6150a0565b60009182526020918290206040805160e08101825291909201805467ffffffffffffffff8082168452680100000000000000008204169483019490945263ffffffff70010000000000000000000000000000000085048116938301939093527401000000000000000000000000000000000000000084048316606083015278010000000000000000000000000000000000000000000000008404909216608082015261ffff7c01000000000000000000000000000000000000000000000000000000008404811660a08301527e0100000000000000000000000000000000000000000000000000000000000090930490921660c0830152915061239d90613b4c565b6123a657600080fd5b6123b282858386613b87565b6123bb57600080fd5b6123c58484613e6f565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461244c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b60005474010000000000000000000000000000000000000000900460ff16156124d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b600080547fffffffffffffffffffffff00ffffffffffffffffffffffffffffffffffffffff16740100000000000000000000000000000000000000001790556040513381527f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258906020016114ea565b6060600061254d83611f51565b90508060000361256d575050604080516000815260208101909152919050565b60008167ffffffffffffffff81111561258857612588614cc8565b6040519080825280602002602001820160405280156125b1578160200160208202803683370190505b50905060006125be611073565b9050600060015b8281116126385760008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff808916911603612626578084838151811061260d5761260d6150a0565b60209081029190910101528161262281614fff565b9250505b8061263081614fff565b9150506125c5565b509195945050505050565b50919050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146126ca576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16635fd8c7106040518163ffffffff1660e01b8152600401600060405180830381600087803b15801561273457600080fd5b505af11580156123c5573d6000803e3d6000fd5b33803b156127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f436f6e74726163747320617265206e6f7420616c6c6f77656420746f20696e7460448201527f6572616374207769746820746865206661726d000000000000000000000000006064820152608401610c67565b601c546040517f70a0823100000000000000000000000000000000000000000000000000000000815233600482015260009173ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612847573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061286b919061515a565b90506015548110156128d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f796f75206e656564206d6f726520454c4f4e4f4e4521000000000000000000006044820152606401610c67565b6013546128e9906203f48061504a565b4210612951576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f454c4f4e4f4e45206d696e74206973206f7665722100000000000000000000006044820152606401610c67565b336000908152601b602052604090205460ff16156129cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f616c7265616479206d696e7465640000000000000000000000000000000000006044820152606401610c67565b6129d9600080600033613483565b50336000908152601b6020526040812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790556011805491612a2083614fff565b909155505060128054906000610d7e83614fff565b606060028054610b6790614f83565b606060078054610b6790614f83565b60005474010000000000000000000000000000000000000000900460ff1615612ad8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610c67565b612ae23386613b0c565b612aeb57600080fd5b612af485612fee565b15612afe57600080fd5b600c54612b219073ffffffffffffffffffffffffffffffffffffffff16866137a2565b600c546040517f7e5d9bb70000000000000000000000000000000000000000000000000000000081526004810187905260248101869052604481018590526064810184905233608482015273ffffffffffffffffffffffffffffffffffffffff83811660a483015290911690637e5d9bb79060c401600060405180830381600087803b158015612bb057600080fd5b505af1158015612bc4573d6000803e3d6000fd5b505050505050505050565b3373ffffffffffffffffffffffffffffffffffffffff831603612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610c67565b33600081815260066020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600080600080600080600080600080600a8b81548110612d0757612d076150a0565b9060005260206000200190508060000160189054906101000a900463ffffffff1663ffffffff16600014159950428160000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff161115985080600001601c9054906101000a900461ffff1661ffff1697508060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff1696508060000160189054906101000a900463ffffffff1663ffffffff1695508060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1694508060000160109054906101000a900463ffffffff1663ffffffff1693508060000160149054906101000a900463ffffffff1663ffffffff16925080600001601e9054906101000a900461ffff1661ffff169150509193959799909294969850565b612e47338361392d565b612ed3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f7665640000000000000000000000000000006064820152608401610c67565b6123c584848484613ff0565b60008181526003602052604090205460609073ffffffffffffffffffffffffffffffffffffffff16612f93576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006064820152608401610c67565b6000612f9d612a44565b90506000815111612fbd5760405180602001604052806000815250611aa3565b80612fc784614093565b604051602001612fd8929190615173565b6040516020818303038152906040529392505050565b6000808211612ffc57600080fd5b600a828154811061300f5761300f6150a0565b6000918252602090912001547801000000000000000000000000000000000000000000000000900463ffffffff16151592915050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146130c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b80825114613130576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f496e76616c696420636f756e74206f66206d696e74696e6700000000000000006044820152606401610c67565b60005b8251811015610fe8576000838281518110613150576131506150a0565b60200260200101519050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036131a9575060005473ffffffffffffffffffffffffffffffffffffffff165b601080549060006131b983614fff565b91905055506131cc600080600084613483565b505080806131d990614fff565b915050613133565b60005473ffffffffffffffffffffffffffffffffffffffff163314613262576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b601693909355426017556018919091556019805473ffffffffffffffffffffffffffffffffffffffff9283167fffffffffffffffffffffffff000000000000000000000000000000000000000091821617909155601a8054929093169116179055565b60005473ffffffffffffffffffffffffffffffffffffffff163314613346576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b611b6a600882600e614914565b60005473ffffffffffffffffffffffffffffffffffffffff1633146133d4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8116613477576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610c67565b61348081613dfa565b50565b60008463ffffffff16851461349757600080fd5b8363ffffffff1684146134a957600080fd5b8261ffff1683146134b957600080fd5b60006134c660028561508c565b9050600d8161ffff1611156134d95750600d5b6040805160e08101825267ffffffffffffffff428116825260006020830181815263ffffffff808c169585019586528a8116606086019081526080860184815261ffff808a1660a089019081528d821660c08a01908152600a8054600181018255988190528a517fc65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a8909901805498519c51965195519351925185167e01000000000000000000000000000000000000000000000000000000000000027dffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff939095167c0100000000000000000000000000000000000000000000000000000000027fffff0000ffffffffffffffffffffffffffffffffffffffffffffffffffffffff948916780100000000000000000000000000000000000000000000000002949094167fffff000000000000ffffffffffffffffffffffffffffffffffffffffffffffff96891674010000000000000000000000000000000000000000027fffffffffffffffff00000000ffffffffffffffffffffffffffffffffffffffff988a1670010000000000000000000000000000000002989098167fffffffffffffffff0000000000000000ffffffffffffffffffffffffffffffff9e8d1668010000000000000000027fffffffffffffffffffffffffffffffff00000000000000000000000000000000909b169b909c169a909a17989098179b909b16989098179390931791909116949094171793909316919091179055915490918116811461371f57600080fd5b604082810151606080850151835173ffffffffffffffffffffffffffffffffffffffff8a1681526020810186905263ffffffff9384168186015292169082015290517f428b559deb78ae264f175a82b90ecac7f28acc5c0bbce329463bcf94aa5ffd539181900360800190a161379585826141c8565b925050505b949350505050565b600081815260056020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841690811790915581906137fc82611cd2565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600080600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663eac9d94c6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156138b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906138d6919061515a565b9050806fffffffffffffffffffffffffffffffff1681146138f657600080fd5b600061390360028361508c565b61390d908361504a565b9050662386f26fc10000811015610b525750662386f26fc1000092915050565b60008181526003602052604081205473ffffffffffffffffffffffffffffffffffffffff166139de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e00000000000000000000000000000000000000006064820152608401610c67565b60006139e983611cd2565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480613a5857508373ffffffffffffffffffffffffffffffffffffffff16613a4084610d87565b73ffffffffffffffffffffffffffffffffffffffff16145b8061379a575073ffffffffffffffffffffffffffffffffffffffff80821660009081526006602090815260408083209388168352929052205460ff1661379a565b613aa4838383614390565b6000908152600b6020526040902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001690555050565b6000816080015163ffffffff16600014158015610b525750506020015167ffffffffffffffff4281169116111590565b60008273ffffffffffffffffffffffffffffffffffffffff16613b2e83611cd2565b73ffffffffffffffffffffffffffffffffffffffff16149392505050565b6000816080015163ffffffff166000148015610b525750506020015167ffffffffffffffff4281169116111590565b6007611b6a82826151f0565b6000818403613b985750600061379a565b8454700100000000000000000000000000000000900463ffffffff16821480613bdf5750845474010000000000000000000000000000000000000000900463ffffffff1682145b15613bec5750600061379a565b8254700100000000000000000000000000000000900463ffffffff16841480613c335750825474010000000000000000000000000000000000000000900463ffffffff1684145b15613c405750600061379a565b8254700100000000000000000000000000000000900463ffffffff161580613c8157508454700100000000000000000000000000000000900463ffffffff16155b15613c8e5750600161379a565b845483547001000000000000000000000000000000009182900463ffffffff90811692909104161480613cf8575084548354700100000000000000000000000000000000900463ffffffff9081167401000000000000000000000000000000000000000090920416145b15613d055750600061379a565b8454835474010000000000000000000000000000000000000000900463ffffffff908116700100000000000000000000000000000000909204161480613d73575084548354740100000000000000000000000000000000000000009182900463ffffffff9081169290910416145b15613d805750600061379a565b506001949350505050565b600081815260036020526040808220548483529082205473ffffffffffffffffffffffffffffffffffffffff918216911680821480611be857506000858152600b602052604090205473ffffffffffffffffffffffffffffffffffffffff908116908316149250505092915050565b6000805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6000600a8281548110613e8457613e846150a0565b9060005260206000200190506000600a8481548110613ea557613ea56150a0565b600091825260209091200180547fffffffff00000000ffffffffffffffffffffffffffffffffffffffffffffffff16780100000000000000000000000000000000000000000000000063ffffffff8616021781559050613f04826145f7565b613f0d816145f7565b6000848152600b602052604080822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690915585835290822080549091169055600f805491613f6083614fff565b9091555050600084815260036020908152604091829020548354835173ffffffffffffffffffffffffffffffffffffffff909216825291810187905291820185905268010000000000000000900467ffffffffffffffff1660608201527f8d386972618b2508abab1a415558214e499e5f02f175d1fa315d0fdd7022b23b9060800160405180910390a150505050565b613ffb848484613a99565b61400784848484614724565b6123c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b6060816000036140d657505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b811561410057806140ea81614fff565b91506140f99050600a8361508c565b91506140da565b60008167ffffffffffffffff81111561411b5761411b614cc8565b6040519080825280601f01601f191660200182016040528015614145576020820181803683370190505b5090505b841561379a5761415a600183615037565b9150614167600a8661530a565b61417290603061504a565b60f81b818381518110614187576141876150a0565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506141c1600a8661508c565b9450614149565b801561424b5773ffffffffffffffffffffffffffffffffffffffff821661424b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610c67565b60008181526003602052604090205473ffffffffffffffffffffffffffffffffffffffff16156142d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610c67565b73ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061430d90849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8273ffffffffffffffffffffffffffffffffffffffff166143b082611cd2565b73ffffffffffffffffffffffffffffffffffffffff1614614453576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201527f73206e6f74206f776e00000000000000000000000000000000000000000000006064820152608401610c67565b73ffffffffffffffffffffffffffffffffffffffff82166144f5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f72657373000000000000000000000000000000000000000000000000000000006064820152608401610c67565b6145006000826137a2565b73ffffffffffffffffffffffffffffffffffffffff83166000908152600460205260408120805460019290614536908490615037565b909155505073ffffffffffffffffffffffffffffffffffffffff8216600090815260046020526040812080546001929061457190849061504a565b909155505060008181526003602052604080822080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff86811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b805442906008907c0100000000000000000000000000000000000000000000000000000000900461ffff16600e8110614632576146326150a0565b600891828204019190066004029054906101000a900463ffffffff1663ffffffff1661465e919061504a565b81547fffffffffffffffffffffffffffffffff0000000000000000ffffffffffffffff166801000000000000000067ffffffffffffffff929092169190910217808255600d7c010000000000000000000000000000000000000000000000000000000090910461ffff1610156134805780546001908290601c906147079084907c0100000000000000000000000000000000000000000000000000000000900461ffff166150cf565b92506101000a81548161ffff021916908361ffff16021790555050565b600073ffffffffffffffffffffffffffffffffffffffff84163b1561490c576040517f150b7a0200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff85169063150b7a029061479b90339089908890889060040161531e565b6020604051808303816000875af19250505080156147f4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526147f191810190615367565b60015b6148c1573d808015614822576040519150601f19603f3d011682016040523d82523d6000602084013e614827565b606091505b5080516000036148b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e74657200000000000000000000000000006064820152608401610c67565b805181602001fd5b7fffffffff00000000000000000000000000000000000000000000000000000000167f150b7a020000000000000000000000000000000000000000000000000000000014905061379a565b50600161379a565b6002830191839082156149a65791602002820160005b8382111561497457833563ffffffff1683826101000a81548163ffffffff021916908363ffffffff160217905550926020019260040160208160030104928301926001030261492a565b80156149a45782816101000a81549063ffffffff0219169055600401602081600301049283019260010302614974565b505b506149b29291506149b6565b5090565b5b808211156149b257600081556001016149b7565b7fffffffff000000000000000000000000000000000000000000000000000000008116811461348057600080fd5b600060208284031215614a0b57600080fd5b8135611aa3816149cb565b60005b83811015614a31578181015183820152602001614a19565b50506000910152565b60008151808452614a52816020860160208601614a16565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081526000611aa36020830184614a3a565b73ffffffffffffffffffffffffffffffffffffffff8116811461348057600080fd5b600060208284031215614acb57600080fd5b8135611aa381614a97565b600060208284031215614ae857600080fd5b5035919050565b60008060408385031215614b0257600080fd5b8235614b0d81614a97565b946020939093013593505050565b600080600060608486031215614b3057600080fd5b8335614b3b81614a97565b92506020840135614b4b81614a97565b929592945050506040919091013590565b60008060208385031215614b6f57600080fd5b823567ffffffffffffffff80821115614b8757600080fd5b818501915085601f830112614b9b57600080fd5b813581811115614baa57600080fd5b866020828501011115614bbc57600080fd5b60209290920196919550909350505050565b60008060408385031215614be157600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b81811015614c2857835183529284019291840191600101614c0c565b50909695505050505050565b600080600080600060a08688031215614c4c57600080fd5b853594506020860135935060408601359250606086013591506080860135614c7381614a97565b809150509295509295909350565b801515811461348057600080fd5b60008060408385031215614ca257600080fd5b8235614cad81614a97565b91506020830135614cbd81614c81565b809150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715614d3e57614d3e614cc8565b604052919050565b60008060008060808587031215614d5c57600080fd5b8435614d6781614a97565b9350602085810135614d7881614a97565b935060408601359250606086013567ffffffffffffffff80821115614d9c57600080fd5b818801915088601f830112614db057600080fd5b813581811115614dc257614dc2614cc8565b614df2847fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601614cf7565b91508082528984828501011115614e0857600080fd5b808484018584013760008482840101525080935050505092959194509250565b60008060408385031215614e3b57600080fd5b823567ffffffffffffffff80821115614e5357600080fd5b818501915085601f830112614e6757600080fd5b8135602082821115614e7b57614e7b614cc8565b8160051b9250614e8c818401614cf7565b8281529284018101928181019089851115614ea657600080fd5b948201945b84861015614ed05785359350614ec084614a97565b8382529482019490820190614eab565b9997909101359750505050505050565b60008060008060808587031215614ef657600080fd5b84359350602085013592506040850135614f0f81614a97565b91506060850135614f1f81614a97565b939692955090935050565b60006101c0808385031215614f3e57600080fd5b838184011115614f4d57600080fd5b509092915050565b60008060408385031215614f6857600080fd5b8235614f7381614a97565b91506020830135614cbd81614a97565b600181811c90821680614f9757607f821691505b602082108103612643577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503057615030614fd0565b5060010190565b81810381811115610b5257610b52614fd0565b80820180821115610b5257610b52614fd0565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60008261509b5761509b61505d565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61ffff8181168382160190808211156150ea576150ea614fd0565b5092915050565b60008161510057615100614fd0565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b8082028115828204841417610b5257610b52614fd0565b60006020828403121561514f57600080fd5b8151611aa381614c81565b60006020828403121561516c57600080fd5b5051919050565b60008351615185818460208801614a16565b835190830190615199818360208801614a16565b01949350505050565b601f821115610fe857600081815260208120601f850160051c810160208610156151c95750805b601f850160051c820191505b818110156151e8578281556001016151d5565b505050505050565b815167ffffffffffffffff81111561520a5761520a614cc8565b61521e816152188454614f83565b846151a2565b602080601f831160018114615271576000841561523b5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556151e8565b6000858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156152be5788860151825594840194600190910190840161529f565b50858210156152fa57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b6000826153195761531961505d565b500690565b600073ffffffffffffffffffffffffffffffffffffffff80871683528086166020840152508360408301526080606083015261535d6080830184614a3a565b9695505050505050565b60006020828403121561537957600080fd5b8151611aa3816149cb56fea2646970667358221220a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c7608012764736f6c63430008110033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000010726f636b6574646173682e67616d652f00000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseUri (string): rocketdash.game/

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000010
Arg [2] : 726f636b6574646173682e67616d652f00000000000000000000000000000000


Deployed Bytecode Sourcemap

78826:6019:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42383:305;;;;;;;;;;-1:-1:-1;42383:305:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;42383:305:0;;;;;;;;79224:23;;;;;;;;;;;;;;;;;;;784:25:1;;;772:2;757:18;79224:23:0;638:177:1;79104:32:0;;;;;;;;;;;;;;;;79181:34;;;;;;;;;;;;;;;;43328:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;82050:446::-;;;;;;;;;;-1:-1:-1;82050:446:0;;;;;:::i;:::-;;:::i;:::-;;44887:221;;;;;;;;;;-1:-1:-1;44887:221:0;;;;;:::i;:::-;;:::i;:::-;;;2407:42:1;2395:55;;;2377:74;;2365:2;2350:18;44887:221:0;2231:226:1;44417:404:0;;;;;;;;;;-1:-1:-1;44417:404:0;;;;;:::i;:::-;;:::i;78914:51::-;;;;;;;;;;;;78960:5;78914:51;;66284:94;;;;;;;;;;-1:-1:-1;66284:94:0;;;;;:::i;:::-;;:::i;63333:35::-;;;;;;;;;;;;;;;;61329:94;;;;;;;;;;;;;:::i;78972:54::-;;;;;;;;;;;;79020:6;78972:54;;81064:417;;;:::i;45777:339::-;;;;;;;;;;-1:-1:-1;45777:339:0;;;;;:::i;:::-;;:::i;57643:409::-;;;;;;;;;;-1:-1:-1;57643:409:0;;;;;:::i;:::-;;:::i;:::-;;;3417:10:1;3405:23;;;3387:42;;3375:2;3360:18;57643:409:0;3243:192:1;7298:119:0;;;;;;;;;;;;;:::i;46187:185::-;;;;;;;;;;-1:-1:-1;46187:185:0;;;;;:::i;:::-;;:::i;74991:1500::-;;;;;;;;;;-1:-1:-1;74991:1500:0;;;;;:::i;:::-;;:::i;65948:251::-;;;;;;;;;;-1:-1:-1;65948:251:0;;;;;:::i;:::-;;:::i;66960:239::-;;;;;;;;;;-1:-1:-1;66960:239:0;;;;;:::i;:::-;;:::i;63228:26::-;;;;;;;;;;;;;;;;54649:115;;;;;;;;;;-1:-1:-1;54649:115:0;;;;;:::i;:::-;;:::i;6240:86::-;;;;;;;;;;-1:-1:-1;6287:4:0;6311:7;;;;;;6240:86;;70445:547;;;;;;;;;;-1:-1:-1;70445:547:0;;;;;:::i;:::-;;:::i;84366:386::-;;;;;;;;;;;;;:::i;43022:239::-;;;;;;;;;;-1:-1:-1;43022:239:0;;;;;:::i;:::-;;:::i;80070:91::-;;;;;;;;;;;;;:::i;76991:295::-;;;;;;;;;;-1:-1:-1;76991:295:0;;;;;:::i;:::-;;:::i;42752:208::-;;;;;;;;;;-1:-1:-1;42752:208:0;;;;;:::i;:::-;;:::i;4448:103::-;;;;;;;;;;;;;:::i;72722:1581::-;;;;;;:::i;:::-;;:::i;7040:117::-;;;;;;;;;;;;;:::i;61892:903::-;;;;;;;;;;-1:-1:-1;61892:903:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63152:34::-;;;;;;;;;;;;;;;;3797:87;;;;;;;;;;-1:-1:-1;3843:7:0;3870:6;;;3797:87;;78717:102;;;;;;;;;;;;;:::i;80169:480::-;;;;;;;;;;;;;:::i;43497:104::-;;;;;;;;;;;;;:::i;55337:89::-;;;;;;;;;;;;;:::i;77406:1102::-;;;;;;;;;;-1:-1:-1;77406:1102:0;;;;;:::i;:::-;;:::i;45180:295::-;;;;;;;;;;-1:-1:-1;45180:295:0;;;;;:::i;:::-;;:::i;83273:1004::-;;;;;;;;;;-1:-1:-1;83273:1004:0;;;;;:::i;:::-;;:::i;:::-;;;;6347:14:1;;6340:22;6322:41;;6406:14;;6399:22;6394:2;6379:18;;6372:50;6438:18;;;6431:34;;;;6496:2;6481:18;;6474:34;;;;6539:3;6524:19;;6517:35;;;;6583:3;6568:19;;6561:35;6627:3;6612:19;;6605:35;6671:3;6656:19;;6649:35;6715:3;6700:19;;6693:35;6309:3;6294:19;83273:1004:0;5963:771:1;46443:328:0;;;;;;;;;;-1:-1:-1;46443:328:0;;;;;:::i;:::-;;:::i;43672:334::-;;;;;;;;;;-1:-1:-1;43672:334:0;;;;;:::i;:::-;;:::i;67361:269::-;;;;;;;;;;-1:-1:-1;67361:269:0;;;;;:::i;:::-;;:::i;81489:476::-;;;;;;;;;;-1:-1:-1;81489:476:0;;;;;:::i;:::-;;:::i;80701:355::-;;;;;;;;;;-1:-1:-1;80701:355:0;;;;;:::i;:::-;;:::i;62801:111::-;;;;;;;;;;-1:-1:-1;62801:111:0;;;;;:::i;:::-;;:::i;58782:35::-;;;;;;;;;;-1:-1:-1;58782:35:0;;;;;;;;45546:164;;;;;;;;;;-1:-1:-1;45546:164:0;;;;;:::i;:::-;45667:25;;;;45643:4;45667:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;45546:164;79143:31;;;;;;;;;;;;;;;;4706:201;;;;;;;;;;-1:-1:-1;4706:201:0;;;;;:::i;:::-;;:::i;58532:66::-;;;;;;;;;;-1:-1:-1;58532:66:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;42383:305;42485:4;42522:40;;;42537:25;42522:40;;:105;;-1:-1:-1;42579:48:0;;;42594:33;42579:48;42522:105;:158;;;-1:-1:-1;35721:25:0;35706:40;;;;42644:36;42502:178;42383:305;-1:-1:-1;;42383:305:0:o;43328:100::-;43382:13;43415:5;43408:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43328:100;:::o;82050:446::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;;;;;;;;;82132:16:::1;82151:37;82165:1;82168::::0;82171::::1;82182:4;82151:13;:37::i;:::-;82216:11;::::0;82132:56;;-1:-1:-1;82199:40:0::1;::::0;82216:11:::1;;82132:56:::0;82199:8:::1;:40::i;:::-;82252:11;::::0;::::1;;:25;82292:8:::0;82315:23:::1;:21;:23::i;:::-;82252:205;::::0;;::::1;::::0;;;;;;::::1;::::0;::::1;12106:25:1::0;;;;12147:18;;;12140:34;82353:1:0::1;12190:18:1::0;;;12183:34;79020:6:0::1;12233:18:1::0;;;12226:34;82413:4:0::1;12337:19:1::0;;;12330:44;12279:42;12411:15;;12390:19;;;12383:44;12078:19;;82252:205:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;82470:16:0::1;:18:::0;;;-1:-1:-1;82470:16:0;-1:-1:-1;82470:16:0::1;:18;::::0;::::1;:::i;:::-;;;;;;82119:377;82050:446:::0;:::o;44887:221::-;44963:7;48370:16;;;:7;:16;;;;;;:30;:16;44983:73;;;;;;;13029:2:1;44983:73:0;;;13011:21:1;13068:2;13048:18;;;13041:30;13107:34;13087:18;;;13080:62;13178:14;13158:18;;;13151:42;13210:19;;44983:73:0;12827:408:1;44983:73:0;-1:-1:-1;45076:24:0;;;;:15;:24;;;;;;;;;44887:221::o;44417:404::-;44498:13;44514:16;44522:7;44514;:16::i;:::-;44498:32;;44555:5;44549:11;;:2;:11;;;44541:57;;;;;;;13442:2:1;44541:57:0;;;13424:21:1;13481:2;13461:18;;;13454:30;13520:34;13500:18;;;13493:62;13591:3;13571:18;;;13564:31;13612:19;;44541:57:0;13240:397:1;44541:57:0;2744:10;44633:21;;;;;:62;;-1:-1:-1;44658:37:0;44675:5;2744:10;45546:164;:::i;44658:37::-;44611:168;;;;;;;13844:2:1;44611:168:0;;;13826:21:1;13883:2;13863:18;;;13856:30;13922:34;13902:18;;;13895:62;13993:26;13973:18;;;13966:54;14037:19;;44611:168:0;13642:420:1;44611:168:0;44792:21;44801:2;44805:7;44792:8;:21::i;:::-;44487:334;44417:404;;:::o;66284:94::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;66352:12:::1;:18:::0;66284:94::o;61329:::-;61397:7;:14;61373:4;;61397:18;;61414:1;;61397:18;:::i;:::-;61390:25;;61329:94;:::o;81064:417::-;81125:10;26302:19;;:23;79942:100;;;;;;;14402:2:1;79942:100:0;;;14384:21:1;14441:2;14421:18;;;14414:30;14480:34;14460:18;;;14453:62;14551:21;14531:18;;;14524:49;14590:19;;79942:100:0;14200:415:1;79942:100:0;81185:10:::1;;81174:8;;:21;;;;:::i;:::-;81156:15;:39;81148:64;;;::::0;::::1;::::0;;14952:2:1;81148:64:0::1;::::0;::::1;14934:21:1::0;14991:2;14971:18;;;14964:30;15030:14;15010:18;;;15003:42;15062:18;;81148:64:0::1;14750:336:1::0;81148:64:0::1;81244:9;;81231;:22;;81223:60;;;::::0;::::1;::::0;;15293:2:1;81223:60:0::1;::::0;::::1;15275:21:1::0;15332:2;15312:18;;;15305:30;15371:27;15351:18;;;15344:55;15416:18;;81223:60:0::1;15091:349:1::0;81223:60:0::1;81294:34;81308:1;81311::::0;81314::::1;81317:10;81294:13;:34::i;:::-;-1:-1:-1::0;81339:16:0::1;:18:::0;;;:16:::1;:18;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;81368:12:0::1;::::0;-1:-1:-1;81383:13:0::1;81395:1;81383:9;:13;:::i;:::-;81407:14;::::0;:29:::1;::::0;81368:28;;-1:-1:-1;81407:14:0::1;;::::0;:29;::::1;;;::::0;81368:28;;81407:14:::1;:29:::0;:14;:29;81368:28;81407:14;:29;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;81447:11:0::1;::::0;:26:::1;::::0;:11:::1;::::0;;::::1;::::0;:26;::::1;;;::::0;81468:4;;81447:11:::1;:26:::0;:11;:26;81468:4;81447:11;:26;::::1;;;;;;;;;;;;;::::0;::::1;;;;45777:339:::0;45972:41;2744:10;46005:7;45972:18;:41::i;:::-;45964:103;;;;;;;15961:2:1;45964:103:0;;;15943:21:1;16000:2;15980:18;;;15973:30;16039:34;16019:18;;;16012:62;16110:19;16090:18;;;16083:47;16147:19;;45964:103:0;15759:413:1;45964:103:0;46080:28;46090:4;46096:2;46100:7;46080:9;:28::i;57643:409::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7298:119::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;6287:4;6311:7;;;;;;6835:41:::1;;;::::0;::::1;::::0;;16379:2:1;6835:41:0::1;::::0;::::1;16361:21:1::0;16418:2;16398:18;;;16391:30;16457:22;16437:18;;;16430:50;16497:18;;6835:41:0::1;16177:344:1::0;6835:41:0::1;7368:5:::2;7358:15:::0;;;::::2;::::0;;7389:20:::2;::::0;7398:10:::2;2377:74:1::0;;7389:20:0::2;::::0;2365:2:1;2350:18;7389:20:0::2;;;;;;;;7298:119::o:0;46187:185::-;46325:39;46342:4;46348:2;46352:7;46325:39;;;;;;;;;;;;:16;:39::i;74991:1500::-;75097:7;6311;;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;75184:28:::1;75215:7;75223:16;75215:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;::::1;75321:23:::0;;75215:25;;-1:-1:-1;75321:23:0::1;;:28:::0;;75313:37:::1;;;::::0;::::1;;75413:31;::::0;;::::1;::::0;::::1;::::0;;;;::::1;::::0;;::::1;::::0;;;;::::1;;;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;:16:::1;:31::i;:::-;75405:40;;;::::0;::::1;;75548:30:::0;;75621:7:::1;:25:::0;;75548:30;;;::::1;;;::::0;75521:24:::1;::::0;75621:7;75548:30;;75621:25;::::1;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;75750:24;;75621:25;::::1;75789::::0;;75621;;-1:-1:-1;75750:24:0::1;::::0;;;;::::1;::::0;::::1;::::0;75789:25;;::::1;;:52:::0;-1:-1:-1;75785:122:0::1;;;-1:-1:-1::0;75870:25:0;;;;::::1;;;75785:122;75954:13;75970:25:::0;;;:7:::1;:25;::::0;;;;;76057:30;;75970:25:::1;::::0;;::::1;::::0;75954:13;76025:86:::1;::::0;75970:25;;76057:30;;::::1;;;76089:13;:9:::0;75970:25;76089:13:::1;:::i;:::-;76025:86;;76105:5;76025:13;:86::i;:::-;76124:37:::0;;;::::1;::::0;;76242:20:::1;:22:::0;;76006:105;;-1:-1:-1;76131:30:0::1;76242:22;::::0;::::1;:::i;:::-;;;;;;76355:10;76347:28;;:69;76410:4;76403:6;;76390:12;;:19;;;;:::i;:::-;:24;;;;:::i;:::-;76376:12;;:39;;;;:::i;:::-;76347:69;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;76475:8:0;74991:1500;-1:-1:-1;;;;;;;74991:1500:0:o;65948:251::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;66086:36:::1;66092:10;66104:17;66086:5;:36::i;:::-;66078:45;;;::::0;::::1;;66134:49;::::0;;;:30:::1;:49;::::0;;;;:57;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;65948:251::o;66960:239::-;67051:4;67093:1;67081:9;:13;67073:22;;;;;;67106;67131:7;67139:9;67131:18;;;;;;;;:::i;:::-;;;;;;;;;;67167:24;;;;;;;;67131:18;;;;67167:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;67131:18;-1:-1:-1;67167:24:0;;:15;:24::i;:::-;67160:31;66960:239;-1:-1:-1;;;66960:239:0:o;54649:115::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;54730:26:::1;54742:13;;54730:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;54730:11:0::1;::::0;-1:-1:-1;;;54730:26:0:i:1;:::-;54649:115:::0;;:::o;70445:547::-;70569:4;70618:1;70599:16;:20;70591:29;;;;;;70659:1;70639:17;:21;70631:30;;;;;;70672:28;70703:7;70711:16;70703:25;;;;;;;;:::i;:::-;;;;;;;;70672:56;;70739:29;70771:7;70779:17;70771:26;;;;;;;;:::i;:::-;;;;;;;;70739:58;;70815:89;70837:13;70852:16;70870:14;70886:17;70815:21;:89::i;:::-;:169;;;;;70921:63;70948:17;70967:16;70921:26;:63::i;:::-;70808:176;70445:547;-1:-1:-1;;;;;70445:547:0:o;84366:386::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;84613:12:::1;::::0;84585:20:::1;::::0;84441:21:::1;::::0;84423:15:::1;::::0;84585:24:::1;::::0;84608:1:::1;84585:24;:::i;:::-;84584:41;;;;:::i;:::-;84561:64;;84652:12;84642:7;:22;84638:107;;;84689:10;84681:52;84710:22;84720:12:::0;84710:7;:22:::1;:::i;:::-;84681:52;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;;;;;;;;::::0;::::1;;;;43022:239:::0;43094:7;43130:16;;;:7;:16;;;;;;;;;43157:73;;;;;;;17809:2:1;43157:73:0;;;17791:21:1;17848:2;17828:18;;;17821:30;17887:34;17867:18;;;17860:62;17958:11;17938:18;;;17931:39;17987:19;;43157:73:0;17607:405:1;80070:91:0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;80138:15:::1;80127:8;:26:::0;80070:91::o;76991:295::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;77070:34:::1;77124:8;77070:63;;77154:17;:36;;;:38;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;77146:47;;;::::0;::::1;;77247:11;:31:::0;;;::::1;;::::0;;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;76991:295:0:o;42752:208::-;42824:7;42852:19;;;42844:74;;;;;;;18469:2:1;42844:74:0;;;18451:21:1;18508:2;18488:18;;;18481:30;18547:34;18527:18;;;18520:62;18618:12;18598:18;;;18591:40;18648:19;;42844:74:0;18267:406:1;42844:74:0;-1:-1:-1;42936:16:0;;;;;;:9;:16;;;;;;;42752:208::o;4448:103::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;4513:30:::1;4540:1;4513:18;:30::i;:::-;4448:103::o:0;72722:1581::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;72926:12:::1;;72913:9;:25;;72905:34;;;::::0;::::1;;73007:35;73013:10;73025:16;73007:5;:35::i;:::-;72999:44;;;::::0;::::1;;73311:63;73338:17;73357:16;73311:26;:63::i;:::-;73303:72;;;::::0;::::1;;73448:28;73479:7;73487:16;73479:25;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;73624:30:::1;::::0;;::::1;::::0;::::1;::::0;;73479:25;;;::::1;73624:30:::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;73479:25;-1:-1:-1;73624:30:0::1;::::0;:15:::1;:30::i;:::-;73616:39;;;::::0;::::1;;73729:29;73761:7;73769:17;73761:26;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;73908:31:::1;::::0;;::::1;::::0;::::1;::::0;;73761:26;;;::::1;73908:31:::0;;::::1;::::0;;::::1;::::0;;;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;;::::1;::::0;;::::1;::::0;;;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;;::::1;::::0;;::::1;::::0;;;;73761:26;-1:-1:-1;73908:31:0::1;::::0;:15:::1;:31::i;:::-;73900:40;;;::::0;::::1;;74024:152;74060:13;74088:16;74119:14;74148:17;74024:21;:152::i;:::-;74016:161;;;::::0;::::1;;74248:47;74259:16;74277:17;74248:10;:47::i;:::-;72862:1441;;72722:1581:::0;;:::o;7040:117::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;6287:4;6311:7;;;;;;6565:9:::1;6557:38;;;::::0;::::1;::::0;;16728:2:1;6557:38:0::1;::::0;::::1;16710:21:1::0;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0::1;16526:340:1::0;6557:38:0::1;7101:7:::2;:14:::0;;;::::2;::::0;::::2;::::0;;7131:18:::2;::::0;7138:10:::2;2377:74:1::0;;7131:18:0::2;::::0;2365:2:1;2350:18;7131::0::2;2231:226:1::0;61892:903:0;61953:28;61994:18;62015:17;62025:6;62015:9;:17::i;:::-;61994:38;;62049:10;62063:1;62049:15;62045:743;;-1:-1:-1;;62126:16:0;;;62140:1;62126:16;;;;;;;;;62119:23;-1:-1:-1;61892:903:0:o;62045:743::-;62175:23;62215:10;62201:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62201:25:0;;62175:51;;62241:20;62264:13;:11;:13::i;:::-;62241:36;-1:-1:-1;62292:19:0;62530:1;62514:233;62545:12;62533:8;:24;62514:233;;62594:17;;;;:7;:17;;;;;;:27;;;;:17;;:27;62590:142;;62668:8;62646:6;62653:11;62646:19;;;;;;;;:::i;:::-;;;;;;;;;;:30;62699:13;;;;:::i;:::-;;;;62590:142;62559:10;;;;:::i;:::-;;;;62514:233;;;-1:-1:-1;62770:6:0;;61892:903;-1:-1:-1;;;;;61892:903:0:o;62045:743::-;61983:812;61892:903;;;:::o;78717:102::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;78782:11:::1;;;;;;;;;;;:27;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;80169:480:::0;80218:10;26302:19;;:23;79942:100;;;;;;;14402:2:1;79942:100:0;;;14384:21:1;14441:2;14421:18;;;14414:30;14480:34;14460:18;;;14453:62;14551:21;14531:18;;;14524:49;14590:19;;79942:100:0;14200:415:1;79942:100:0;80255:8:::1;::::0;:30:::1;::::0;;;;80274:10:::1;80255:30;::::0;::::1;2377:74:1::0;80241:11:0::1;::::0;80255:8:::1;;::::0;:18:::1;::::0;2350::1;;80255:30:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;80241:44;;80311:18;;80304:3;:25;;80296:60;;;::::0;::::1;::::0;;19069:2:1;80296:60:0::1;::::0;::::1;19051:21:1::0;19108:2;19088:18;;;19081:30;19147:24;19127:18;;;19120:52;19189:18;;80296:60:0::1;18867:346:1::0;80296:60:0::1;80393:8;::::0;:17:::1;::::0;80404:6:::1;80393:17;:::i;:::-;80375:15;:35;80367:69;;;::::0;::::1;::::0;;19420:2:1;80367:69:0::1;::::0;::::1;19402:21:1::0;19459:2;19439:18;;;19432:30;19498:23;19478:18;;;19471:51;19539:18;;80367:69:0::1;19218:345:1::0;80367:69:0::1;80466:10;80456:21;::::0;;;:9:::1;:21;::::0;;;;;::::1;;80455:22;80447:49;;;::::0;::::1;::::0;;19770:2:1;80447:49:0::1;::::0;::::1;19752:21:1::0;19809:2;19789:18;;;19782:30;19848:16;19828:18;;;19821:44;19882:18;;80447:49:0::1;19568:338:1::0;80447:49:0::1;80507:34;80521:1;80524::::0;80527::::1;80530:10;80507:13;:34::i;:::-;-1:-1:-1::0;80562:10:0::1;80552:21;::::0;;;:9:::1;:21;::::0;;;;:28;;;::::1;80576:4;80552:28;::::0;;80591:16:::1;:18:::0;;;::::1;::::0;::::1;:::i;:::-;::::0;;;-1:-1:-1;;80620:19:0::1;:21:::0;;;:19:::1;:21;::::0;::::1;:::i;43497:104::-:0;43553:13;43586:7;43579:14;;;;;:::i;55337:89::-;55377:13;55410:8;55403:15;;;;;:::i;77406:1102::-;6287:4;6311:7;;;;;;6565:9;6557:38;;;;;;;16728:2:1;6557:38:0;;;16710:21:1;16767:2;16747:18;;;16740:30;16806:18;16786;;;16779:46;16842:18;;6557:38:0;16526:340:1;6557:38:0;77832:28:::1;77838:10;77850:9;77832:5;:28::i;:::-;77824:37;;;::::0;::::1;;78080:22;78092:9;78080:11;:22::i;:::-;78079:23;78071:32;;;::::0;::::1;;78131:11;::::0;78114:40:::1;::::0;78131:11:::1;;78144:9:::0;78114:8:::1;:40::i;:::-;78307:11;::::0;:193:::1;::::0;;;;::::1;::::0;::::1;12106:25:1::0;;;12147:18;;;12140:34;;;12190:18;;;12183:34;;;12233:18;;;12226:34;;;78451:10:0::1;12337:19:1::0;;;12330:44;78307:11:0::1;12411:15:1::0;;;12390:19;;;12383:44;78307:11:0;;::::1;::::0;:25:::1;::::0;12078:19:1;;78307:193:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;77406:1102:::0;;;;;:::o;45180:295::-;2744:10;45283:24;;;;45275:62;;;;;;;20732:2:1;45275:62:0;;;20714:21:1;20771:2;20751:18;;;20744:30;20810:27;20790:18;;;20783:55;20855:18;;45275:62:0;20530:349:1;45275:62:0;2744:10;45350:32;;;;:18;:32;;;;;;;;;:42;;;;;;;;;;;;:53;;;;;;;;;;;;;45419:48;;586:41:1;;;45350:42:0;;2744:10;45419:48;;559:18:1;45419:48:0;;;;;;;45180:295;;:::o;83273:1004::-;83365:17;83393:12;83416:21;83448:20;83479:24;83514:17;83542:23;83576:24;83611:18;83648:22;83673:7;83681:3;83673:12;;;;;;;;:::i;:::-;;;;;;;;83648:37;;83772:7;:24;;;;;;;;;;;;:29;;83800:1;83772:29;;83756:46;;83851:15;83824:7;:23;;;;;;;;;;;;:42;;;;83813:54;;83902:7;:21;;;;;;;;;;;;83894:30;;83878:46;;83958:7;:23;;;;;;;;;;;;83950:32;;83935:47;;84020:7;:24;;;;;;;;;;;;84012:33;;83993:52;;84076:7;:17;;;;;;;;;;;;84068:26;;84056:38;;84131:7;:23;;;;;;;;;;;;84123:32;;84105:50;;84193:7;:24;;;;;;;;;;;;84185:33;;84166:52;;84250:7;:18;;;;;;;;;;;;84242:27;;84229:40;;83637:640;83273:1004;;;;;;;;;;;:::o;46443:328::-;46618:41;2744:10;46651:7;46618:18;:41::i;:::-;46610:103;;;;;;;15961:2:1;46610:103:0;;;15943:21:1;16000:2;15980:18;;;15973:30;16039:34;16019:18;;;16012:62;16110:19;16090:18;;;16083:47;16147:19;;46610:103:0;15759:413:1;46610:103:0;46724:39;46738:4;46744:2;46748:7;46757:5;46724:13;:39::i;43672:334::-;48346:4;48370:16;;;:7;:16;;;;;;43745:13;;48370:30;:16;43771:76;;;;;;;21086:2:1;43771:76:0;;;21068:21:1;21125:2;21105:18;;;21098:30;21164:34;21144:18;;;21137:62;21235:17;21215:18;;;21208:45;21270:19;;43771:76:0;20884:411:1;43771:76:0;43860:21;43884:10;:8;:10::i;:::-;43860:34;;43936:1;43918:7;43912:21;:25;:86;;;;;;;;;;;;;;;;;43964:7;43973:18;:7;:16;:18::i;:::-;43947:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43905:93;43672:334;-1:-1:-1;;;43672:334:0:o;67361:269::-;67449:4;67491:1;67479:9;:13;67471:22;;;;;;67582:7;67590:9;67582:18;;;;;;;;:::i;:::-;;;;;;;;;;:35;;;;;;:40;;;;-1:-1:-1;;67361:269:0:o;81489:476::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;81614:6:::1;81597;:13;:23;81589:59;;;::::0;::::1;::::0;;22003:2:1;81589:59:0::1;::::0;::::1;21985:21:1::0;22042:2;22022:18;;;22015:30;22081:26;22061:18;;;22054:54;22125:18;;81589:59:0::1;21801:348:1::0;81589:59:0::1;81659:6;81676:282;81691:6;:13;81687:1;:17;81676:282;;;81727:19;81749:6;81756:1;81749:9;;;;;;;;:::i;:::-;;;;;;;81727:31;;81800:1;81777:25;;:11;:25;;::::0;81773:87:::1;;-1:-1:-1::0;3843:7:0;3870:6;;;81773:87:::1;81876:17;:19:::0;;;:17:::1;:19;::::0;::::1;:::i;:::-;;;;;;81910:36;81924:1;81927::::0;81930::::1;81934:11;81910:13;:36::i;:::-;;81710:248;81706:3;;;;;:::i;:::-;;;;81676:282;;80701:355:::0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;80874:9:::1;:22:::0;;;;80918:15:::1;80907:8;:26:::0;80944:10:::1;:24:::0;;;;80979:14:::1;:32:::0;;::::1;::::0;;::::1;::::0;;;::::1;;::::0;;;81022:11:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;80701:355::o;62801:111::-;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;62884:20:::1;:8;62895:9:::0;62884:20:::1;;:::i;4706:201::-:0;3843:7;3870:6;4017:23;3870:6;2744:10;4017:23;4009:68;;;;;;;11652:2:1;4009:68:0;;;11634:21:1;;;11671:18;;;11664:30;11730:34;11710:18;;;11703:62;11782:18;;4009:68:0;11450:356:1;4009:68:0;4795:22:::1;::::0;::::1;4787:73;;;::::0;::::1;::::0;;22356:2:1;4787:73:0::1;::::0;::::1;22338:21:1::0;22395:2;22375:18;;;22368:30;22434:34;22414:18;;;22407:62;22505:8;22485:18;;;22478:36;22531:19;;4787:73:0::1;22154:402:1::0;4787:73:0::1;4871:28;4890:8;4871:18;:28::i;:::-;4706:201:::0;:::o;59654:1543::-;59846:4;59913:16;59898:33;;59878:16;:53;59870:62;;;;;;59987:17;59972:34;;59951:17;:55;59943:64;;;;;;60056:11;60041:28;;60026:11;:43;60018:52;;;;;;60152:20;60182:15;60196:1;60182:11;:15;:::i;:::-;60152:46;;60229:2;60213:13;:18;;;60209:69;;;-1:-1:-1;60264:2:0;60209:69;60314:338;;;;;;;;;60354:15;60314:338;;;;60290:21;60314:338;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60663:7;:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60718:14;;60314:338;;60776:28;;60761:43;;60753:52;;;;;;60931:23;;;;;60978:24;;;;;60856:158;;22822:42:1;22810:55;;22792:74;;22897:2;22882:18;;22875:34;;;60923:32:0;;;;22925:18:1;;;22918:34;60970:33:0;;22968:18:1;;;22961:34;60856:158:0;;;;;;;22779:3:1;60856:158:0;;;61132:26;61138:6;61146:11;61132:5;:26::i;:::-;61178:11;-1:-1:-1;;;59654:1543:0;;;;;;;:::o;52284:167::-;52359:24;;;;:15;:24;;;;;:29;;;;;;;;;;;;;:24;;52413:16;52359:24;52413:7;:16::i;:::-;52404:39;;;;;;;;;;;;52284:167;;:::o;82621:509::-;82677:7;82697:16;82716:11;;;;;;;;;;;:32;;;:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;82697:53;;82863:8;82847:26;;82835:8;:38;82827:47;;;;;;82885:17;82917:12;82928:1;82917:8;:12;:::i;:::-;82905:25;;:8;:25;:::i;:::-;82885:45;;78960:5;83005:9;:31;83001:95;;;-1:-1:-1;78960:5:0;83113:9;82621:509;-1:-1:-1;;82621:509:0:o;48575:341::-;48668:4;48370:16;;;:7;:16;;;;;;:30;:16;48685:73;;;;;;;23208:2:1;48685:73:0;;;23190:21:1;23247:2;23227:18;;;23220:30;23286:34;23266:18;;;23259:62;23357:14;23337:18;;;23330:42;23389:19;;48685:73:0;23006:408:1;48685:73:0;48769:13;48785:16;48793:7;48785;:16::i;:::-;48769:32;;48831:5;48820:16;;:7;:16;;;:51;;;;48864:7;48840:31;;:20;48852:7;48840:11;:20::i;:::-;:31;;;48820:51;:87;;;-1:-1:-1;45667:25:0;;;;45643:4;45667:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;48875:32;45546:164;58858:312;58991:34;59007:4;59013:2;59017:7;58991:15;:34::i;:::-;59123:39;;;;:30;:39;;;;;59116:46;;;;;;-1:-1:-1;;58858:312:0:o;66508:211::-;66586:4;66611:14;:31;;;:36;;66646:1;66611:36;;66610:101;;;;-1:-1:-1;;66653:30:0;;;:57;66694:15;66653:57;;;;;;;66508:211::o;76687:139::-;76762:4;76808:9;76787:30;;:17;76795:8;76787:7;:17::i;:::-;:30;;;;76687:139;-1:-1:-1;;;76687:139:0:o;63579:429::-;63650:4;63914:7;:24;;;:29;;63942:1;63914:29;63913:87;;;;-1:-1:-1;;63949:23:0;;;:50;63983:15;63949:50;;;;;;;63579:429::o;54994:100::-;55067:8;:19;55078:8;55067;:19;:::i;68055:1502::-;68293:4;68385:17;68365:16;:37;68361:82;;-1:-1:-1;68426:5:0;68419:12;;68361:82;68506:30;;;;;;;:51;;;:107;;-1:-1:-1;68561:31:0;;;;;;;:52;;68506:107;68502:152;;;-1:-1:-1;68637:5:0;68630:12;;68502:152;68668:31;;;;;;;:51;;;:107;;-1:-1:-1;68723:32:0;;;;;;;:52;;68668:107;68664:152;;;-1:-1:-1;68799:5:0;68792:12;;68664:152;68967:31;;;;;;;:36;;:75;;-1:-1:-1;69007:30:0;;;;;;;:35;68967:75;68963:119;;;-1:-1:-1;69066:4:0;69059:11;;68963:119;69193:30;;69158:31;;69193:30;;;;;;;;;69158:31;;;;;:65;;:135;;-1:-1:-1;69262:31:0;;69227;;;;;69262;69227;;;69262;;;;;69227:66;69158:135;69154:180;;;-1:-1:-1;69317:5:0;69310:12;;69154:180;69384:30;;69348:32;;;;;69384:30;69348:32;;;69384:30;;;;;69348:66;;:137;;-1:-1:-1;69454:31:0;;69418:32;;69454:31;;;;;;;;;69418:32;;;;;:67;69348:137;69344:182;;;-1:-1:-1;69509:5:0;69502:12;;69344:182;-1:-1:-1;69545:4:0;68055:1502;;;;;;:::o;64304:556::-;64416:4;64462:25;;;:7;:25;;;;;;;64528:26;;;;;;;64462:25;;;;;64528:26;64735:41;;;;:116;;-1:-1:-1;64780:49:0;;;;:30;:49;;;;;;:71;:49;;;:71;;;;64727:125;;;;64304:556;;;;:::o;5067:191::-;5141:16;5160:6;;;5177:17;;;;;;;;;;5210:40;;5160:6;;;;;;;5210:40;;5141:16;5210:40;5130:128;5067:191;:::o;71130:1003::-;71280:29;71312:7;71320:17;71312:26;;;;;;;;:::i;:::-;;;;;;;;71280:58;;71349:28;71380:7;71388:16;71380:25;;;;;;;;:::i;:::-;;;;;;;;;;71418:58;;;;;;;;;;;;71380:25;-1:-1:-1;71542:32:0;71559:14;71542:16;:32::i;:::-;71585:31;71602:13;71585:16;:31::i;:::-;71731:48;;;;:30;:48;;;;;;71724:55;;;;;;;;;71797:49;;;;;;71790:56;;;;;;;71942:20;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;72031:25:0;;;;:7;:25;;;;;;;;;;72095:29;;72021:104;;72031:25;;;;26032:74:1;;26122:18;;;26115:34;;;26165:18;;;26158:34;;;72095:29:0;;;;;26223:2:1;26208:18;;26201:59;72021:104:0;;26019:3:1;26004:19;72021:104:0;;;;;;;71212:921;;71130:1003;;:::o;47653:315::-;47810:28;47820:4;47826:2;47830:7;47810:9;:28::i;:::-;47857:48;47880:4;47886:2;47890:7;47899:5;47857:22;:48::i;:::-;47849:111;;;;;;;26473:2:1;47849:111:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551:34;26531:18;;;26524:62;26622:20;26602:18;;;26595:48;26660:19;;47849:111:0;26271:414:1;365:723:0;421:13;642:5;651:1;642:10;638:53;;-1:-1:-1;;669:10:0;;;;;;;;;;;;;;;;;;365:723::o;638:53::-;716:5;701:12;757:78;764:9;;757:78;;790:8;;;;:::i;:::-;;-1:-1:-1;813:10:0;;-1:-1:-1;821:2:0;813:10;;:::i;:::-;;;757:78;;;845:19;877:6;867:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;867:17:0;;845:39;;895:154;902:10;;895:154;;929:11;939:1;929:11;;:::i;:::-;;-1:-1:-1;998:10:0;1006:2;998:5;:10;:::i;:::-;985:24;;:2;:24;:::i;:::-;972:39;;955:6;962;955:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;1026:11:0;1035:2;1026:11;;:::i;:::-;;;895:154;;50252:424;50327:12;;50324:104;;50363:16;;;50355:61;;;;;;;27009:2:1;50355:61:0;;;26991:21:1;;;27028:18;;;27021:30;27087:34;27067:18;;;27060:62;27139:18;;50355:61:0;26807:356:1;50355:61:0;48346:4;48370:16;;;:7;:16;;;;;;:30;:16;:30;50438:58;;;;;;;27370:2:1;50438:58:0;;;27352:21:1;27409:2;27389:18;;;27382:30;27448;27428:18;;;27421:58;27496:18;;50438:58:0;27168:352:1;50438:58:0;50567:13;;;;;;;:9;:13;;;;;:18;;50584:1;;50567:13;:18;;50584:1;;50567:18;:::i;:::-;;;;-1:-1:-1;;50596:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;50635:33;;50596:16;;;50635:33;;50596:16;;50635:33;50252:424;;:::o;51595:571::-;51747:4;51727:24;;:16;51735:7;51727;:16::i;:::-;:24;;;51719:78;;;;;;;27727:2:1;51719:78:0;;;27709:21:1;27766:2;27746:18;;;27739:30;27805:34;27785:18;;;27778:62;27876:11;27856:18;;;27849:39;27905:19;;51719:78:0;27525:405:1;51719:78:0;51816:16;;;51808:65;;;;;;;28137:2:1;51808:65:0;;;28119:21:1;28176:2;28156:18;;;28149:30;28215:34;28195:18;;;28188:62;28286:6;28266:18;;;28259:34;28310:19;;51808:65:0;27935:400:1;51808:65:0;51990:29;52007:1;52011:7;51990:8;:29::i;:::-;52032:15;;;;;;;:9;:15;;;;;:20;;52051:1;;52032:15;:20;;52051:1;;52032:20;:::i;:::-;;;;-1:-1:-1;;52063:13:0;;;;;;;:9;:13;;;;;:18;;52080:1;;52063:13;:18;;52080:1;;52063:18;:::i;:::-;;;;-1:-1:-1;;52092:16:0;;;;:7;:16;;;;;;:21;;;;;;;;;;;;;;52131:27;;52092:16;;52131:27;;;;;;;51595:571;;;:::o;65129:419::-;65341:21;;65367:15;;65332:8;;65341:21;;;;;65332:31;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65331:51;;;;;;:::i;:::-;65298:85;;;;;;;;;;;;;;;;;;65484:2;65460:21;;;;;;:26;65456:85;;;65503:26;;65528:1;;65503:26;;:21;;:26;;65528:1;;65503:26;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;65129:419;:::o;53016:803::-;53171:4;53192:13;;;26302:19;:23;53188:624;;53228:72;;;;;:36;;;;;;:72;;2744:10;;53279:4;;53285:7;;53294:5;;53228:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;53228:72:0;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53224:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53474:6;:13;53491:1;53474:18;53470:272;;53517:60;;;;;26473:2:1;53517:60:0;;;26455:21:1;26512:2;26492:18;;;26485:30;26551:34;26531:18;;;26524:62;26622:20;26602:18;;;26595:48;26660:19;;53517:60:0;26271:414:1;53470:272:0;53692:6;53686:13;53677:6;53673:2;53669:15;53662:38;53224:533;53351:55;;53361:45;53351:55;;-1:-1:-1;53344:62:0;;53188:624;-1:-1:-1;53796:4:0;53789:11;;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;99:66;92:5;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:250::-;905:1;915:113;929:6;926:1;923:13;915:113;;;1005:11;;;999:18;986:11;;;979:39;951:2;944:10;915:113;;;-1:-1:-1;;1062:1:1;1044:16;;1037:27;820:250::o;1075:330::-;1117:3;1155:5;1149:12;1182:6;1177:3;1170:19;1198:76;1267:6;1260:4;1255:3;1251:14;1244:4;1237:5;1233:16;1198:76;:::i;:::-;1319:2;1307:15;1324:66;1303:88;1294:98;;;;1394:4;1290:109;;1075:330;-1:-1:-1;;1075:330:1:o;1410:220::-;1559:2;1548:9;1541:21;1522:4;1579:45;1620:2;1609:9;1605:18;1597:6;1579:45;:::i;1635:154::-;1721:42;1714:5;1710:54;1703:5;1700:65;1690:93;;1779:1;1776;1769:12;1794:247;1853:6;1906:2;1894:9;1885:7;1881:23;1877:32;1874:52;;;1922:1;1919;1912:12;1874:52;1961:9;1948:23;1980:31;2005:5;1980:31;:::i;2046:180::-;2105:6;2158:2;2146:9;2137:7;2133:23;2129:32;2126:52;;;2174:1;2171;2164:12;2126:52;-1:-1:-1;2197:23:1;;2046:180;-1:-1:-1;2046:180:1:o;2462:315::-;2530:6;2538;2591:2;2579:9;2570:7;2566:23;2562:32;2559:52;;;2607:1;2604;2597:12;2559:52;2646:9;2633:23;2665:31;2690:5;2665:31;:::i;:::-;2715:5;2767:2;2752:18;;;;2739:32;;-1:-1:-1;;;2462:315:1:o;2782:456::-;2859:6;2867;2875;2928:2;2916:9;2907:7;2903:23;2899:32;2896:52;;;2944:1;2941;2934:12;2896:52;2983:9;2970:23;3002:31;3027:5;3002:31;:::i;:::-;3052:5;-1:-1:-1;3109:2:1;3094:18;;3081:32;3122:33;3081:32;3122:33;:::i;:::-;2782:456;;3174:7;;-1:-1:-1;;;3228:2:1;3213:18;;;;3200:32;;2782:456::o;3440:592::-;3511:6;3519;3572:2;3560:9;3551:7;3547:23;3543:32;3540:52;;;3588:1;3585;3578:12;3540:52;3628:9;3615:23;3657:18;3698:2;3690:6;3687:14;3684:34;;;3714:1;3711;3704:12;3684:34;3752:6;3741:9;3737:22;3727:32;;3797:7;3790:4;3786:2;3782:13;3778:27;3768:55;;3819:1;3816;3809:12;3768:55;3859:2;3846:16;3885:2;3877:6;3874:14;3871:34;;;3901:1;3898;3891:12;3871:34;3946:7;3941:2;3932:6;3928:2;3924:15;3920:24;3917:37;3914:57;;;3967:1;3964;3957:12;3914:57;3998:2;3990:11;;;;;4020:6;;-1:-1:-1;3440:592:1;;-1:-1:-1;;;;3440:592:1:o;4037:248::-;4105:6;4113;4166:2;4154:9;4145:7;4141:23;4137:32;4134:52;;;4182:1;4179;4172:12;4134:52;-1:-1:-1;;4205:23:1;;;4275:2;4260:18;;;4247:32;;-1:-1:-1;4037:248:1:o;4290:632::-;4461:2;4513:21;;;4583:13;;4486:18;;;4605:22;;;4432:4;;4461:2;4684:15;;;;4658:2;4643:18;;;4432:4;4727:169;4741:6;4738:1;4735:13;4727:169;;;4802:13;;4790:26;;4871:15;;;;4836:12;;;;4763:1;4756:9;4727:169;;;-1:-1:-1;4913:3:1;;4290:632;-1:-1:-1;;;;;;4290:632:1:o;4927:521::-;5022:6;5030;5038;5046;5054;5107:3;5095:9;5086:7;5082:23;5078:33;5075:53;;;5124:1;5121;5114:12;5075:53;5160:9;5147:23;5137:33;;5217:2;5206:9;5202:18;5189:32;5179:42;;5268:2;5257:9;5253:18;5240:32;5230:42;;5319:2;5308:9;5304:18;5291:32;5281:42;;5373:3;5362:9;5358:19;5345:33;5387:31;5412:5;5387:31;:::i;:::-;5437:5;5427:15;;;4927:521;;;;;;;;:::o;5453:118::-;5539:5;5532:13;5525:21;5518:5;5515:32;5505:60;;5561:1;5558;5551:12;5576:382;5641:6;5649;5702:2;5690:9;5681:7;5677:23;5673:32;5670:52;;;5718:1;5715;5708:12;5670:52;5757:9;5744:23;5776:31;5801:5;5776:31;:::i;:::-;5826:5;-1:-1:-1;5883:2:1;5868:18;;5855:32;5896:30;5855:32;5896:30;:::i;:::-;5945:7;5935:17;;;5576:382;;;;;:::o;6739:184::-;6791:77;6788:1;6781:88;6888:4;6885:1;6878:15;6912:4;6909:1;6902:15;6928:334;6999:2;6993:9;7055:2;7045:13;;7060:66;7041:86;7029:99;;7158:18;7143:34;;7179:22;;;7140:62;7137:88;;;7205:18;;:::i;:::-;7241:2;7234:22;6928:334;;-1:-1:-1;6928:334:1:o;7267:1167::-;7362:6;7370;7378;7386;7439:3;7427:9;7418:7;7414:23;7410:33;7407:53;;;7456:1;7453;7446:12;7407:53;7495:9;7482:23;7514:31;7539:5;7514:31;:::i;:::-;7564:5;-1:-1:-1;7588:2:1;7627:18;;;7614:32;7655:33;7614:32;7655:33;:::i;:::-;7707:7;-1:-1:-1;7761:2:1;7746:18;;7733:32;;-1:-1:-1;7816:2:1;7801:18;;7788:32;7839:18;7869:14;;;7866:34;;;7896:1;7893;7886:12;7866:34;7934:6;7923:9;7919:22;7909:32;;7979:7;7972:4;7968:2;7964:13;7960:27;7950:55;;8001:1;7998;7991:12;7950:55;8037:2;8024:16;8059:2;8055;8052:10;8049:36;;;8065:18;;:::i;:::-;8107:112;8215:2;8146:66;8139:4;8135:2;8131:13;8127:86;8123:95;8107:112;:::i;:::-;8094:125;;8242:2;8235:5;8228:17;8282:7;8277:2;8272;8268;8264:11;8260:20;8257:33;8254:53;;;8303:1;8300;8293:12;8254:53;8358:2;8353;8349;8345:11;8340:2;8333:5;8329:14;8316:45;8402:1;8397:2;8392;8385:5;8381:14;8377:23;8370:34;;8423:5;8413:15;;;;;7267:1167;;;;;;;:::o;8439:1091::-;8532:6;8540;8593:2;8581:9;8572:7;8568:23;8564:32;8561:52;;;8609:1;8606;8599:12;8561:52;8649:9;8636:23;8678:18;8719:2;8711:6;8708:14;8705:34;;;8735:1;8732;8725:12;8705:34;8773:6;8762:9;8758:22;8748:32;;8818:7;8811:4;8807:2;8803:13;8799:27;8789:55;;8840:1;8837;8830:12;8789:55;8876:2;8863:16;8898:4;8921:2;8917;8914:10;8911:36;;;8927:18;;:::i;:::-;8973:2;8970:1;8966:10;8956:20;;8996:28;9020:2;9016;9012:11;8996:28;:::i;:::-;9058:15;;;9128:11;;;9124:20;;;9089:12;;;;9156:19;;;9153:39;;;9188:1;9185;9178:12;9153:39;9212:11;;;;9232:217;9248:6;9243:3;9240:15;9232:217;;;9328:3;9315:17;9302:30;;9345:31;9370:5;9345:31;:::i;:::-;9389:18;;;9265:12;;;;9427;;;;9232:217;;;9468:5;9505:18;;;;9492:32;;-1:-1:-1;;;;;;;8439:1091:1:o;9535:541::-;9637:6;9645;9653;9661;9714:3;9702:9;9693:7;9689:23;9685:33;9682:53;;;9731:1;9728;9721:12;9682:53;9767:9;9754:23;9744:33;;9824:2;9813:9;9809:18;9796:32;9786:42;;9878:2;9867:9;9863:18;9850:32;9891:31;9916:5;9891:31;:::i;:::-;9941:5;-1:-1:-1;9998:2:1;9983:18;;9970:32;10011:33;9970:32;10011:33;:::i;:::-;9535:541;;;;-1:-1:-1;9535:541:1;;-1:-1:-1;;9535:541:1:o;10081:273::-;10165:6;10196:3;10240:2;10228:9;10219:7;10215:23;10211:32;10208:52;;;10256:1;10253;10246:12;10208:52;10295:7;10290:2;10279:9;10275:18;10272:31;10269:51;;;10316:1;10313;10306:12;10269:51;-1:-1:-1;10339:9:1;;10081:273;-1:-1:-1;;10081:273:1:o;10615:388::-;10683:6;10691;10744:2;10732:9;10723:7;10719:23;10715:32;10712:52;;;10760:1;10757;10750:12;10712:52;10799:9;10786:23;10818:31;10843:5;10818:31;:::i;:::-;10868:5;-1:-1:-1;10925:2:1;10910:18;;10897:32;10938:33;10897:32;10938:33;:::i;11008:437::-;11087:1;11083:12;;;;11130;;;11151:61;;11205:4;11197:6;11193:17;11183:27;;11151:61;11258:2;11250:6;11247:14;11227:18;11224:38;11221:218;;11295:77;11292:1;11285:88;11396:4;11393:1;11386:15;11424:4;11421:1;11414:15;12438:184;12490:77;12487:1;12480:88;12587:4;12584:1;12577:15;12611:4;12608:1;12601:15;12627:195;12666:3;12697:66;12690:5;12687:77;12684:103;;12767:18;;:::i;:::-;-1:-1:-1;12814:1:1;12803:13;;12627:195::o;14067:128::-;14134:9;;;14155:11;;;14152:37;;;14169:18;;:::i;14620:125::-;14685:9;;;14706:10;;;14703:36;;;14719:18;;:::i;15445:184::-;15497:77;15494:1;15487:88;15594:4;15591:1;15584:15;15618:4;15615:1;15608:15;15634:120;15674:1;15700;15690:35;;15705:18;;:::i;:::-;-1:-1:-1;15739:9:1;;15634:120::o;16871:184::-;16923:77;16920:1;16913:88;17020:4;17017:1;17010:15;17044:4;17041:1;17034:15;17060:168;17127:6;17153:10;;;17165;;;17149:27;;17188:11;;;17185:37;;;17202:18;;:::i;:::-;17185:37;17060:168;;;;:::o;17233:196::-;17272:3;17300:5;17290:39;;17309:18;;:::i;:::-;-1:-1:-1;17356:66:1;17345:78;;17233:196::o;17434:168::-;17507:9;;;17538;;17555:15;;;17549:22;;17535:37;17525:71;;17576:18;;:::i;18017:245::-;18084:6;18137:2;18125:9;18116:7;18112:23;18108:32;18105:52;;;18153:1;18150;18143:12;18105:52;18185:9;18179:16;18204:28;18226:5;18204:28;:::i;18678:184::-;18748:6;18801:2;18789:9;18780:7;18776:23;18772:32;18769:52;;;18817:1;18814;18807:12;18769:52;-1:-1:-1;18840:16:1;;18678:184;-1:-1:-1;18678:184:1:o;21300:496::-;21479:3;21517:6;21511:13;21533:66;21592:6;21587:3;21580:4;21572:6;21568:17;21533:66;:::i;:::-;21662:13;;21621:16;;;;21684:70;21662:13;21621:16;21731:4;21719:17;;21684:70;:::i;:::-;21770:20;;21300:496;-1:-1:-1;;;;21300:496:1:o;23545:545::-;23647:2;23642:3;23639:11;23636:448;;;23683:1;23708:5;23704:2;23697:17;23753:4;23749:2;23739:19;23823:2;23811:10;23807:19;23804:1;23800:27;23794:4;23790:38;23859:4;23847:10;23844:20;23841:47;;;-1:-1:-1;23882:4:1;23841:47;23937:2;23932:3;23928:12;23925:1;23921:20;23915:4;23911:31;23901:41;;23992:82;24010:2;24003:5;24000:13;23992:82;;;24055:17;;;24036:1;24025:13;23992:82;;;23996:3;;;23545:545;;;:::o;24326:1471::-;24452:3;24446:10;24479:18;24471:6;24468:30;24465:56;;;24501:18;;:::i;:::-;24530:97;24620:6;24580:38;24612:4;24606:11;24580:38;:::i;:::-;24574:4;24530:97;:::i;:::-;24682:4;;24746:2;24735:14;;24763:1;24758:782;;;;25584:1;25601:6;25598:89;;;-1:-1:-1;25653:19:1;;;25647:26;25598:89;24232:66;24223:1;24219:11;;;24215:84;24211:89;24201:100;24307:1;24303:11;;;24198:117;25700:81;;24728:1063;;24758:782;23492:1;23485:14;;;23529:4;23516:18;;24806:66;24794:79;;;24971:236;24985:7;24982:1;24979:14;24971:236;;;25074:19;;;25068:26;25053:42;;25166:27;;;;25134:1;25122:14;;;;25001:19;;24971:236;;;24975:3;25235:6;25226:7;25223:19;25220:261;;;25296:19;;;25290:26;25397:66;25379:1;25375:14;;;25391:3;25371:24;25367:97;25363:102;25348:118;25333:134;;25220:261;-1:-1:-1;;;;;25527:1:1;25511:14;;;25507:22;25494:36;;-1:-1:-1;24326:1471:1:o;26690:112::-;26722:1;26748;26738:35;;26753:18;;:::i;:::-;-1:-1:-1;26787:9:1;;26690:112::o;28340:512::-;28534:4;28563:42;28644:2;28636:6;28632:15;28621:9;28614:34;28696:2;28688:6;28684:15;28679:2;28668:9;28664:18;28657:43;;28736:6;28731:2;28720:9;28716:18;28709:34;28779:3;28774:2;28763:9;28759:18;28752:31;28800:46;28841:3;28830:9;28826:19;28818:6;28800:46;:::i;:::-;28792:54;28340:512;-1:-1:-1;;;;;;28340:512:1:o;28857:249::-;28926:6;28979:2;28967:9;28958:7;28954:23;28950:32;28947:52;;;28995:1;28992;28985:12;28947:52;29027:9;29021:16;29046:30;29070:5;29046:30;:::i

Swarm Source

ipfs://a5d5cff765a94c33f2ce903d96e4ccfe4736b5e21494f45cecede46c76080127
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.