ETH Price: $3,263.47 (+0.63%)
Gas: 1 Gwei

DraGONS 2171 (DRAGONS)
 

Overview

TokenID

5604

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Majestic flying creatures living far away to the Northeast of Bunker 2171. Each element of the collection DraGONS is able to claim 1 $AMBER per day for a period of 2171 days. $AMBER is the utility token of the Bunker2171 ecosystem. It is NOT an investment and has NO economic...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
DraGONS

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
istanbul EvmVersion, MIT license

Contract Source Code (Solidity)

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol



pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

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

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

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

// File: @openzeppelin/contracts/utils/Address.sol



pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/utils/Context.sol



pragma solidity ^0.8.0;

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

    function _msgData() internal view virtual returns (bytes calldata) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol



pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol


















pragma solidity ^0.8.0;

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

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

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

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

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

// File: contracts/WithLimitedSupply.sol


pragma solidity ^0.8.0;


/// @author 1001.digital 
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply {
    using Counters for Counters.Counter;

    // Keeps track of how many we have minted
    Counters.Counter private _tokenCount;

    /// @dev The maximum count of tokens this token tracker will hold.
    uint256 private _maxSupply;

    /// Instanciate the contract
    /// @param totalSupply_ how many tokens this collection should hold
    constructor (uint256 totalSupply_) {
        _maxSupply = totalSupply_;
    }

    /// @dev Get the max Supply
    /// @return the maximum token count
    function maxSupply() public view returns (uint256) {
        return _maxSupply;
    }

    /// @dev Get the current token count
    /// @return the created token count
    function tokenCount() public view returns (uint256) {
        return _tokenCount.current();
    }

    /// @dev Check whether tokens are still available
    /// @return the available token count
    function availableTokenCount() public view returns (uint256) {
        return maxSupply() - tokenCount();
    }

    /// @dev Increment the token count and fetch the latest count
    /// @return the next token id
    function nextToken() internal virtual ensureAvailability returns (uint256) {
        uint256 token = _tokenCount.current();

        _tokenCount.increment();

        return token;
    }

    /// @dev Check whether another token is still available
    modifier ensureAvailability() {
        require(availableTokenCount() > 0, "No more tokens available");
        _;
    }

    /// @param amount Check whether number of tokens are still available
    /// @dev Check whether tokens are still available
    modifier ensureAvailabilityFor(uint256 amount) {
        require(availableTokenCount() >= amount, "Requested number of tokens not available");
        _;
    }
}
// File: contracts/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// @title Randomly assign tokenIDs from a given set of tokens.
abstract contract RandomlyAssigned is WithLimitedSupply {
    // Used for random index assignment
    mapping(uint256 => uint256) private tokenMatrix;

    // The initial token ID
    uint256 private startFrom;

    /// Instanciate the contract
    /// @param _maxSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _maxSupply, uint256 _startFrom)
        WithLimitedSupply(_maxSupply)
    {
        startFrom = _startFrom;
    }

    /// Get the next token ID
    /// @dev Randomly gets a new token ID and keeps track of the ones that are still available.
    /// @return the next token ID
    function nextToken() internal override ensureAvailability returns (uint256) {
        uint256 maxIndex = maxSupply() - tokenCount();
        uint256 random = uint256(keccak256(
            abi.encodePacked(
                msg.sender,
                block.coinbase,
                block.difficulty,
                block.gaslimit,
                block.timestamp
            )
        )) % maxIndex;

        uint256 value = 0;
        if (tokenMatrix[random] == 0) {
            // If this matrix position is empty, set the value to the generated random number.
            value = random;
        } else {
            // Otherwise, use the previously stored number from the matrix.
            value = tokenMatrix[random];
        }

        // If the last available tokenID is still unused...
        if (tokenMatrix[maxIndex - 1] == 0) {
            // ...store that ID in the current matrix position.
            tokenMatrix[random] = maxIndex - 1;
        } else {
            // ...otherwise copy over the stored number to the current matrix position.
            tokenMatrix[random] = tokenMatrix[maxIndex - 1];
        }

        // Increment counts
        super.nextToken();

        return value + startFrom;
    }
}

















pragma solidity ^0.8.0;



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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. Empty by default, can be overriden
     * in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        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 = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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 {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.sol



pragma solidity ^0.8.0;

/**
 * @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 () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}


// File: contracts/DraGONS.sol


pragma solidity ^0.8.0;


abstract contract GONS {
  function ownerOf(uint256 tokenId) public virtual view returns (address);
  function tokenOfOwnerByIndex(address owner, uint256 index) public virtual view returns (uint256);
  function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract DraGONS is ERC721Enumerable, Ownable, RandomlyAssigned {

  GONS private gons;
  uint constant public MAX_DRAGONS_MINT = 5000;
  uint constant public MAX_DRAGONS_AIRDROP = 904; 
  uint256 public constant dragonPrice = 70000000000000000; //0.07 ETH

  address private gonsContract = 0x984EEA281Bf65638ac6ed30C4FF7977EA7fe0433; // GONS SC
  bool public saleIsActive = false;
  bool public airdropIsActive = false;
  uint256 public maxDragons;
  string private baseURI;

  uint256 public totalDragonsMinted = 0;
  uint256 public totalDragonsAirdropped = 0; 

  mapping(uint256 => uint256) public mintedIDs;

  constructor() ERC721("DraGONS 2171", "DRAGONS") RandomlyAssigned (MAX_DRAGONS_MINT+MAX_DRAGONS_AIRDROP,0) {
    maxDragons = MAX_DRAGONS_MINT;
    gons = GONS(gonsContract);
  }

  function _baseURI() internal view override returns (string memory) {
    return baseURI;
  }
  
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }

  function flipSaleState() public onlyOwner {
    saleIsActive = !saleIsActive;
  }

  function flipAirdropState() public onlyOwner {
    airdropIsActive = !airdropIsActive;
  }

  // Shows if a GON can mint a DraGON
  function canMint(uint256 tokenId) view public returns (bool) {
        bool res = true;
        if (mintedIDs[tokenId] == 1){
            res = false;
        }
      return res;
  }

  // Returns the amount of DraGONS available to be minted
  function getMintableTokenNumber(address user) view public returns (uint256 mintableTokenNumber) {
      mintableTokenNumber = 0;
      for (uint256 i = 0; i < gons.balanceOf(user); i++) {
          uint256 tokenId = gons.tokenOfOwnerByIndex(user, i);
          if (canMint(tokenId))
              mintableTokenNumber++;
      }
      return mintableTokenNumber;
  }


  function getAvailableIDs() public view returns (uint256[] memory) {
      uint256[] memory availableIDs = new uint256[](MAX_DRAGONS_MINT);
      for (uint256 i = 0; i < MAX_DRAGONS_MINT; i++) {
         if (mintedIDs[i] != 1){
            availableIDs[i] = i;
         } else {
            availableIDs[i] = MAX_DRAGONS_MINT; 
         }
        
      }
      return availableIDs;
  }

  /**
    * Mint a DraGON
    */
  function mintDragon(uint256 gonsTokenId) public payable {
    require(saleIsActive, "The sale must be active to mint a DraGON");
    require(totalDragonsMinted < maxDragons, "The purchase would exceed the max supply of DraGONS");
    require(gonsTokenId < maxDragons, "The requested tokenId exceeds upper bound");
    require(gons.ownerOf(gonsTokenId) == msg.sender, "Must own the specific Gorilla Nemesis with the requested tokenId to mint this DraGON");
    require(dragonPrice <= msg.value, "Ether value sent is not correct");
    require(canMint(gonsTokenId), "DraGON already minted");

    uint256 mintIndex = nextToken();
    _safeMint(msg.sender, mintIndex);
     mintedIDs[gonsTokenId] = 1;
    totalDragonsMinted++;
  }

  /**
    * Mint N DraGONS
  */
  function mintNDragons(uint256 numDragons) public payable {
      require(saleIsActive, "The sale must be active to mint a DraGON");
      require(numDragons > 0, "Must mint at least one DraGON");
      require(totalDragonsMinted + numDragons <= MAX_DRAGONS_MINT, "The purchase would exceed the max supply of DraGONS");
      uint balanceGons = gons.balanceOf(msg.sender);
      require(balanceGons >= numDragons, "Must hold N Gorilla Nemesis to mint N DraGONS");
      uint256 toBeMinted = getMintableTokenNumber(msg.sender);
      require(toBeMinted > 0, "You must have at least one Gorilla Nemesis elegible to mint");
      if (toBeMinted > numDragons)
      {
          toBeMinted = numDragons;
      }
      require(dragonPrice * toBeMinted <= msg.value, "Ether value sent is not correct");

      uint256 minted = 0;
      for (uint256 i = 0; i < balanceGons; i++) {
          uint256 tokenId = gons.tokenOfOwnerByIndex(msg.sender, i);

          if (canMint(tokenId)) {
              uint256 mintIndex = nextToken();
              _safeMint(msg.sender, mintIndex);
              mintedIDs[tokenId] = 1;
              minted++;
              totalDragonsMinted++;
          }
          if (minted == toBeMinted) {
              break;
          }
      }
  }

    /**
     * Airdrop-phase: DraGONS assigned to MK owners [1 : 1] (500) + GONS Character owners [1 : 1] (404)
     * We take care of the transaction fees.
     */
    function airdropDragons(address to, uint count) public onlyOwner{
        require(airdropIsActive, "Airdrop-phase must be active to airdrop a DraGON");
        require(totalDragonsAirdropped + count <= MAX_DRAGONS_AIRDROP, "The number of dragons would exceed the maximum airdrop supply");

        for(uint i = 0; i < count; i++) {
            uint mintIndex = nextToken();
            _safeMint(to, mintIndex);
            totalDragonsAirdropped++;
        } 
    }

  /*
  * Withdraw from the contract
  */
 function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_DRAGONS_AIRDROP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_DRAGONS_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdropDragons","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"airdropIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"availableTokenCount","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"canMint","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dragonPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipAirdropState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAvailableIDs","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getMintableTokenNumber","outputs":[{"internalType":"uint256","name":"mintableTokenNumber","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxDragons","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"gonsTokenId","type":"uint256"}],"name":"mintDragon","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numDragons","type":"uint256"}],"name":"mintNDragons","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintedIDs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"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":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDragonsAirdropped","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalDragonsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052601080546001600160b01b03191673984eea281bf65638ac6ed30c4ff7977ea7fe0433179055600060138190556014553480156200004157600080fd5b506200005261038861138862000201565b604080518082018252600c81526b447261474f4e53203231373160a01b602080830191825283518085019094526007845266445241474f4e5360c81b9084015281516000938593929091620000a99186916200015b565b508051620000bf9060019060208401906200015b565b5050506000620000d46200015760201b60201c565b600a80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600c55600e5550611388601155601054600f80546001600160a01b0319166001600160a01b0390921691909117905562000265565b3390565b828054620001699062000228565b90600052602060002090601f0160209004810192826200018d5760008555620001d8565b82601f10620001a857805160ff1916838001178555620001d8565b82800160010185558215620001d8579182015b82811115620001d8578251825591602001919060010190620001bb565b50620001e6929150620001ea565b5090565b5b80821115620001e65760008155600101620001eb565b600082198211156200022357634e487b7160e01b600052601160045260246000fd5b500190565b600181811c908216806200023d57607f821691505b602082108114156200025f57634e487b7160e01b600052602260045260246000fd5b50919050565b612d4d80620002756000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063aa3f3955116100b6578063e14ca3531161007a578063e14ca35314610652578063e985e9c514610667578063eaa0477b146106b0578063eb8d2444146106c6578063f06a9575146106e7578063f2fde38b146106fd57600080fd5b8063aa3f3955146105c6578063b3485104146105e7578063b88d4fde146105fd578063c87b56dd1461061d578063d5abeb011461063d57600080fd5b806395d89b41116100fd57806395d89b41146105465780639dc647d71461055b5780639f181b5e146105715780639ffbaa9214610586578063a22cb465146105a657600080fd5b8063715018a6146104e557806377af7d43146104fa578063853828b61461050d57806388cba990146105155780638da5cb5b1461052857600080fd5b80633e75475f116101c75780635a7fba901161018b5780635a7fba901461043d5780635dd871a3146104585780636352211e146104785780636e5b0d7e1461049857806370a08231146104c557600080fd5b80633e75475f146103a857806342842e0e146103bd5780634947d744146103dd5780634f6ccce7146103fd57806355f804b31461041d57600080fd5b8063216c13ce1161020e578063216c13ce1461031b57806323b872dd146103315780632f745c591461035157806334918dfd1461037157806334f987b41461038657600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612872565b61071d565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610748565b6040516102779190612a03565b3480156102ae57600080fd5b506102c26102bd3660046128f5565b6107da565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612846565b610874565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b5061030d60115481565b34801561033d57600080fd5b506102fa61034c366004612752565b61098a565b34801561035d57600080fd5b5061030d61036c366004612846565b6109bb565b34801561037d57600080fd5b506102fa610a51565b34801561039257600080fd5b5061039b610a9c565b60405161027791906129bf565b3480156103b457600080fd5b506102fa610b49565b3480156103c957600080fd5b506102fa6103d8366004612752565b610b94565b3480156103e957600080fd5b5061030d6103f83660046126df565b610baf565b34801561040957600080fd5b5061030d6104183660046128f5565b610ced565b34801561042957600080fd5b506102fa6104383660046128ac565b610d80565b34801561044957600080fd5b5061030d66f8b0a10e47000081565b34801561046457600080fd5b5061026b6104733660046128f5565b610dc1565b34801561048457600080fd5b506102c26104933660046128f5565b610de3565b3480156104a457600080fd5b5061030d6104b33660046128f5565b60156020526000908152604090205481565b3480156104d157600080fd5b5061030d6104e03660046126df565b610e5a565b3480156104f157600080fd5b506102fa610ee1565b6102fa6105083660046128f5565b610f55565b6102fa6111fc565b6102fa6105233660046128f5565b61124c565b34801561053457600080fd5b50600a546001600160a01b03166102c2565b34801561055257600080fd5b506102956115db565b34801561056757600080fd5b5061030d60135481565b34801561057d57600080fd5b5061030d6115ea565b34801561059257600080fd5b506102fa6105a1366004612846565b6115fa565b3480156105b257600080fd5b506102fa6105c1366004612813565b611765565b3480156105d257600080fd5b5060105461026b90600160a81b900460ff1681565b3480156105f357600080fd5b5061030d60145481565b34801561060957600080fd5b506102fa610618366004612793565b61182a565b34801561062957600080fd5b506102956106383660046128f5565b611862565b34801561064957600080fd5b50600c5461030d565b34801561065e57600080fd5b5061030d61193d565b34801561067357600080fd5b5061026b610682366004612719565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106bc57600080fd5b5061030d61138881565b3480156106d257600080fd5b5060105461026b90600160a01b900460ff1681565b3480156106f357600080fd5b5061030d61038881565b34801561070957600080fd5b506102fa6107183660046126df565b611954565b60006001600160e01b0319821663780e9d6360e01b1480610742575061074282611a3f565b92915050565b60606000805461075790612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612c17565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087f82610de3565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084f565b336001600160a01b038216148061090957506109098133610682565b61097b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084f565b6109858383611a8f565b505050565b6109943382611afd565b6109b05760405162461bcd60e51b815260040161084f90612b38565b610985838383611bf4565b60006109c683610e5a565b8210610a285760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a7b5760405162461bcd60e51b815260040161084f90612b03565b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b604080516113888082526202712082019092526060916000919060208201620271008036833701905050905060005b611388811015610b4357600081815260156020526040902054600114610b0f5780828281518110610afe57610afe612cbd565b602002602001018181525050610b31565b611388828281518110610b2457610b24612cbd565b6020026020010181815250505b80610b3b81612c4c565b915050610acb565b50919050565b600a546001600160a01b03163314610b735760405162461bcd60e51b815260040161084f90612b03565b6010805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6109858383836040518060200160405280600081525061182a565b6000805b600f546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b158015610bf857600080fd5b505afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c30919061290e565b811015610b4357600f54604051632f745c5960e01b81526001600160a01b038581166004830152602482018490526000921690632f745c599060440160206040518083038186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc919061290e565b9050610cc781610dc1565b15610cda5782610cd681612c4c565b9350505b5080610ce581612c4c565b915050610bb3565b6000610cf860085490565b8210610d5b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084f565b60088281548110610d6e57610d6e612cbd565b90600052602060002001549050919050565b600a546001600160a01b03163314610daa5760405162461bcd60e51b815260040161084f90612b03565b8051610dbd9060129060208401906125d0565b5050565b6000818152601560205260408120546001908114156107425750600092915050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084f565b60006001600160a01b038216610ec55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161084f90612b03565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054600160a01b900460ff16610f7e5760405162461bcd60e51b815260040161084f90612a16565b60115460135410610fa15760405162461bcd60e51b815260040161084f90612ab0565b60115481106110045760405162461bcd60e51b815260206004820152602960248201527f5468652072657175657374656420746f6b656e496420657863656564732075706044820152681c195c88189bdd5b9960ba1b606482015260840161084f565b600f546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561104857600080fd5b505afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906126fc565b6001600160a01b0316146111195760405162461bcd60e51b815260206004820152605460248201527f4d757374206f776e2074686520737065636966696320476f72696c6c61204e6560448201527f6d657369732077697468207468652072657175657374656420746f6b656e4964606482015273103a379036b4b73a103a3434b990223930a3a7a760611b608482015260a40161084f565b3466f8b0a10e47000011156111705760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161084f565b61117981610dc1565b6111bd5760405162461bcd60e51b8152602060048201526015602482015274111c9851d3d388185b1c9958591e481b5a5b9d1959605a1b604482015260640161084f565b60006111c7611d9f565b90506111d33382611f32565b60008281526015602052604081206001905560138054916111f383612c4c565b91905055505050565b600a546001600160a01b031633146112265760405162461bcd60e51b815260040161084f90612b03565b60405133904780156108fc02916000818181858888f1935050505061124a57600080fd5b565b601054600160a01b900460ff166112755760405162461bcd60e51b815260040161084f90612a16565b600081116112c55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206174206c65617374206f6e6520447261474f4e000000604482015260640161084f565b611388816013546112d69190612b89565b11156112f45760405162461bcd60e51b815260040161084f90612ab0565b600f546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611370919061290e565b9050818110156113d85760405162461bcd60e51b815260206004820152602d60248201527f4d75737420686f6c64204e20476f72696c6c61204e656d6573697320746f206d60448201526c696e74204e20447261474f4e5360981b606482015260840161084f565b60006113e333610baf565b90506000811161145b5760405162461bcd60e51b815260206004820152603b60248201527f596f75206d7573742068617665206174206c65617374206f6e6520476f72696c60448201527f6c61204e656d6573697320656c656769626c6520746f206d696e740000000000606482015260840161084f565b828111156114665750815b346114788266f8b0a10e470000612bb5565b11156114c65760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161084f565b6000805b838110156115d457600f54604051632f745c5960e01b8152336004820152602481018390526000916001600160a01b031690632f745c599060440160206040518083038186803b15801561151d57600080fd5b505afa158015611531573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611555919061290e565b905061156081610dc1565b156115b357600061156f611d9f565b905061157b3382611f32565b6000828152601560205260409020600190558361159781612c4c565b6013805491965090915060006115ac83612c4c565b9190505550505b838314156115c157506115d4565b50806115cc81612c4c565b9150506114ca565b5050505050565b60606001805461075790612c17565b60006115f5600b5490565b905090565b600a546001600160a01b031633146116245760405162461bcd60e51b815260040161084f90612b03565b601054600160a81b900460ff166116965760405162461bcd60e51b815260206004820152603060248201527f41697264726f702d7068617365206d7573742062652061637469766520746f2060448201526f30b4b9323937b8103090223930a3a7a760811b606482015260840161084f565b610388816014546116a79190612b89565b111561171b5760405162461bcd60e51b815260206004820152603d60248201527f546865206e756d626572206f6620647261676f6e7320776f756c64206578636560448201527f656420746865206d6178696d756d2061697264726f7020737570706c79000000606482015260840161084f565b60005b81811015610985576000611730611d9f565b905061173c8482611f32565b6014805490600061174c83612c4c565b919050555050808061175d90612c4c565b91505061171e565b6001600160a01b0382163314156117be5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118343383611afd565b6118505760405162461bcd60e51b815260040161084f90612b38565b61185c84848484611f4c565b50505050565b6000818152600260205260409020546060906001600160a01b03166118e15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161084f565b60006118eb611f7f565b9050600081511161190b5760405180602001604052806000815250611936565b8061191584611f8e565b604051602001611926929190612953565b6040516020818303038152906040525b9392505050565b60006119476115ea565b600c546115f59190612bd4565b600a546001600160a01b0316331461197e5760405162461bcd60e51b815260040161084f90612b03565b6001600160a01b0381166119e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084f565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611a7057506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ac482610de3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b765760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084f565b6000611b8183610de3565b9050806001600160a01b0316846001600160a01b03161480611bbc5750836001600160a01b0316611bb1846107da565b6001600160a01b0316145b80611bec57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c0782610de3565b6001600160a01b031614611c6f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084f565b6001600160a01b038216611cd15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084f565b611cdc83838361208c565b611ce7600082611a8f565b6001600160a01b0383166000908152600360205260408120805460019290611d10908490612bd4565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d3e908490612b89565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080611daa61193d565b11611df25760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b604482015260640161084f565b6000611dfc6115ea565b600c54611e099190612bd4565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c611e709190612c67565b6000818152600d602052604081205491925090611e8e575080611e9f565b506000818152600d60205260409020545b600d6000611eae600186612bd4565b81526020019081526020016000205460001415611ee457611ed0600184612bd4565b6000838152600d6020526040902055611f14565b600d6000611ef3600186612bd4565b81526020808201929092526040908101600090812054858252600d90935220555b611f1c612144565b50600e54611f2a9082612b89565b935050505090565b610dbd8282604051806020016040528060008152506121b2565b611f57848484611bf4565b611f63848484846121e5565b61185c5760405162461bcd60e51b815260040161084f90612a5e565b60606012805461075790612c17565b606081611fb25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fdc5780611fc681612c4c565b9150611fd59050600a83612ba1565b9150611fb6565b60008167ffffffffffffffff811115611ff757611ff7612cd3565b6040519080825280601f01601f191660200182016040528015612021576020820181803683370190505b5090505b8415611bec57612036600183612bd4565b9150612043600a86612c67565b61204e906030612b89565b60f81b81838151811061206357612063612cbd565b60200101906001600160f81b031916908160001a905350612085600a86612ba1565b9450612025565b6001600160a01b0383166120e7576120e281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61210a565b816001600160a01b0316836001600160a01b03161461210a5761210a83826122f2565b6001600160a01b038216612121576109858161238f565b826001600160a01b0316826001600160a01b03161461098557610985828261243e565b60008061214f61193d565b116121975760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b604482015260640161084f565b60006121a2600b5490565b90506115f5600b80546001019055565b6121bc8383612482565b6121c960008484846121e5565b6109855760405162461bcd60e51b815260040161084f90612a5e565b60006001600160a01b0384163b156122e757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612229903390899088908890600401612982565b602060405180830381600087803b15801561224357600080fd5b505af1925050508015612273575060408051601f3d908101601f191682019092526122709181019061288f565b60015b6122cd573d8080156122a1576040519150601f19603f3d011682016040523d82523d6000602084013e6122a6565b606091505b5080516122c55760405162461bcd60e51b815260040161084f90612a5e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bec565b506001949350505050565b600060016122ff84610e5a565b6123099190612bd4565b60008381526007602052604090205490915080821461235c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906123a190600190612bd4565b600083815260096020526040812054600880549394509092849081106123c9576123c9612cbd565b9060005260206000200154905080600883815481106123ea576123ea612cbd565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061242257612422612ca7565b6001900381819060005260206000200160009055905550505050565b600061244983610e5a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084f565b6000818152600260205260409020546001600160a01b03161561253d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084f565b6125496000838361208c565b6001600160a01b0382166000908152600360205260408120805460019290612572908490612b89565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546125dc90612c17565b90600052602060002090601f0160209004810192826125fe5760008555612644565b82601f1061261757805160ff1916838001178555612644565b82800160010185558215612644579182015b82811115612644578251825591602001919060010190612629565b50612650929150612654565b5090565b5b808211156126505760008155600101612655565b600067ffffffffffffffff8084111561268457612684612cd3565b604051601f8501601f19908116603f011681019082821181831017156126ac576126ac612cd3565b816040528093508581528686860111156126c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156126f157600080fd5b813561193681612ce9565b60006020828403121561270e57600080fd5b815161193681612ce9565b6000806040838503121561272c57600080fd5b823561273781612ce9565b9150602083013561274781612ce9565b809150509250929050565b60008060006060848603121561276757600080fd5b833561277281612ce9565b9250602084013561278281612ce9565b929592945050506040919091013590565b600080600080608085870312156127a957600080fd5b84356127b481612ce9565b935060208501356127c481612ce9565b925060408501359150606085013567ffffffffffffffff8111156127e757600080fd5b8501601f810187136127f857600080fd5b61280787823560208401612669565b91505092959194509250565b6000806040838503121561282657600080fd5b823561283181612ce9565b91506020830135801515811461274757600080fd5b6000806040838503121561285957600080fd5b823561286481612ce9565b946020939093013593505050565b60006020828403121561288457600080fd5b813561193681612d01565b6000602082840312156128a157600080fd5b815161193681612d01565b6000602082840312156128be57600080fd5b813567ffffffffffffffff8111156128d557600080fd5b8201601f810184136128e657600080fd5b611bec84823560208401612669565b60006020828403121561290757600080fd5b5035919050565b60006020828403121561292057600080fd5b5051919050565b6000815180845261293f816020860160208601612beb565b601f01601f19169290920160200192915050565b60008351612965818460208801612beb565b835190830190612979818360208801612beb565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129b590830184612927565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129f7578351835292840192918401916001016129db565b50909695505050505050565b6020815260006119366020830184612927565b60208082526028908201527f5468652073616c65206d7573742062652061637469766520746f206d696e74206040820152673090223930a3a7a760c11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526033908201527f54686520707572636861736520776f756c642065786365656420746865206d616040820152727820737570706c79206f6620447261474f4e5360681b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612b9c57612b9c612c7b565b500190565b600082612bb057612bb0612c91565b500490565b6000816000190483118215151615612bcf57612bcf612c7b565b500290565b600082821015612be657612be6612c7b565b500390565b60005b83811015612c06578181015183820152602001612bee565b8381111561185c5750506000910152565b600181811c90821680612c2b57607f821691505b60208210811415610b4357634e487b7160e01b600052602260045260246000fd5b6000600019821415612c6057612c60612c7b565b5060010190565b600082612c7657612c76612c91565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612cfe57600080fd5b50565b6001600160e01b031981168114612cfe57600080fdfea2646970667358221220b1f9e34675fdced25ca48d38eae9fb9298fc794ff8807f02f9832521abe678a464736f6c63430008060033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063aa3f3955116100b6578063e14ca3531161007a578063e14ca35314610652578063e985e9c514610667578063eaa0477b146106b0578063eb8d2444146106c6578063f06a9575146106e7578063f2fde38b146106fd57600080fd5b8063aa3f3955146105c6578063b3485104146105e7578063b88d4fde146105fd578063c87b56dd1461061d578063d5abeb011461063d57600080fd5b806395d89b41116100fd57806395d89b41146105465780639dc647d71461055b5780639f181b5e146105715780639ffbaa9214610586578063a22cb465146105a657600080fd5b8063715018a6146104e557806377af7d43146104fa578063853828b61461050d57806388cba990146105155780638da5cb5b1461052857600080fd5b80633e75475f116101c75780635a7fba901161018b5780635a7fba901461043d5780635dd871a3146104585780636352211e146104785780636e5b0d7e1461049857806370a08231146104c557600080fd5b80633e75475f146103a857806342842e0e146103bd5780634947d744146103dd5780634f6ccce7146103fd57806355f804b31461041d57600080fd5b8063216c13ce1161020e578063216c13ce1461031b57806323b872dd146103315780632f745c591461035157806334918dfd1461037157806334f987b41461038657600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b610266366004612872565b61071d565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b50610295610748565b6040516102779190612a03565b3480156102ae57600080fd5b506102c26102bd3660046128f5565b6107da565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004612846565b610874565b005b34801561030857600080fd5b506008545b604051908152602001610277565b34801561032757600080fd5b5061030d60115481565b34801561033d57600080fd5b506102fa61034c366004612752565b61098a565b34801561035d57600080fd5b5061030d61036c366004612846565b6109bb565b34801561037d57600080fd5b506102fa610a51565b34801561039257600080fd5b5061039b610a9c565b60405161027791906129bf565b3480156103b457600080fd5b506102fa610b49565b3480156103c957600080fd5b506102fa6103d8366004612752565b610b94565b3480156103e957600080fd5b5061030d6103f83660046126df565b610baf565b34801561040957600080fd5b5061030d6104183660046128f5565b610ced565b34801561042957600080fd5b506102fa6104383660046128ac565b610d80565b34801561044957600080fd5b5061030d66f8b0a10e47000081565b34801561046457600080fd5b5061026b6104733660046128f5565b610dc1565b34801561048457600080fd5b506102c26104933660046128f5565b610de3565b3480156104a457600080fd5b5061030d6104b33660046128f5565b60156020526000908152604090205481565b3480156104d157600080fd5b5061030d6104e03660046126df565b610e5a565b3480156104f157600080fd5b506102fa610ee1565b6102fa6105083660046128f5565b610f55565b6102fa6111fc565b6102fa6105233660046128f5565b61124c565b34801561053457600080fd5b50600a546001600160a01b03166102c2565b34801561055257600080fd5b506102956115db565b34801561056757600080fd5b5061030d60135481565b34801561057d57600080fd5b5061030d6115ea565b34801561059257600080fd5b506102fa6105a1366004612846565b6115fa565b3480156105b257600080fd5b506102fa6105c1366004612813565b611765565b3480156105d257600080fd5b5060105461026b90600160a81b900460ff1681565b3480156105f357600080fd5b5061030d60145481565b34801561060957600080fd5b506102fa610618366004612793565b61182a565b34801561062957600080fd5b506102956106383660046128f5565b611862565b34801561064957600080fd5b50600c5461030d565b34801561065e57600080fd5b5061030d61193d565b34801561067357600080fd5b5061026b610682366004612719565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106bc57600080fd5b5061030d61138881565b3480156106d257600080fd5b5060105461026b90600160a01b900460ff1681565b3480156106f357600080fd5b5061030d61038881565b34801561070957600080fd5b506102fa6107183660046126df565b611954565b60006001600160e01b0319821663780e9d6360e01b1480610742575061074282611a3f565b92915050565b60606000805461075790612c17565b80601f016020809104026020016040519081016040528092919081815260200182805461078390612c17565b80156107d05780601f106107a5576101008083540402835291602001916107d0565b820191906000526020600020905b8154815290600101906020018083116107b357829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166108585760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061087f82610de3565b9050806001600160a01b0316836001600160a01b031614156108ed5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161084f565b336001600160a01b038216148061090957506109098133610682565b61097b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161084f565b6109858383611a8f565b505050565b6109943382611afd565b6109b05760405162461bcd60e51b815260040161084f90612b38565b610985838383611bf4565b60006109c683610e5a565b8210610a285760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161084f565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b03163314610a7b5760405162461bcd60e51b815260040161084f90612b03565b6010805460ff60a01b198116600160a01b9182900460ff1615909102179055565b604080516113888082526202712082019092526060916000919060208201620271008036833701905050905060005b611388811015610b4357600081815260156020526040902054600114610b0f5780828281518110610afe57610afe612cbd565b602002602001018181525050610b31565b611388828281518110610b2457610b24612cbd565b6020026020010181815250505b80610b3b81612c4c565b915050610acb565b50919050565b600a546001600160a01b03163314610b735760405162461bcd60e51b815260040161084f90612b03565b6010805460ff60a81b198116600160a81b9182900460ff1615909102179055565b6109858383836040518060200160405280600081525061182a565b6000805b600f546040516370a0823160e01b81526001600160a01b038581166004830152909116906370a082319060240160206040518083038186803b158015610bf857600080fd5b505afa158015610c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c30919061290e565b811015610b4357600f54604051632f745c5960e01b81526001600160a01b038581166004830152602482018490526000921690632f745c599060440160206040518083038186803b158015610c8457600080fd5b505afa158015610c98573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cbc919061290e565b9050610cc781610dc1565b15610cda5782610cd681612c4c565b9350505b5080610ce581612c4c565b915050610bb3565b6000610cf860085490565b8210610d5b5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161084f565b60088281548110610d6e57610d6e612cbd565b90600052602060002001549050919050565b600a546001600160a01b03163314610daa5760405162461bcd60e51b815260040161084f90612b03565b8051610dbd9060129060208401906125d0565b5050565b6000818152601560205260408120546001908114156107425750600092915050565b6000818152600260205260408120546001600160a01b0316806107425760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161084f565b60006001600160a01b038216610ec55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161084f565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610f0b5760405162461bcd60e51b815260040161084f90612b03565b600a546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600a80546001600160a01b0319169055565b601054600160a01b900460ff16610f7e5760405162461bcd60e51b815260040161084f90612a16565b60115460135410610fa15760405162461bcd60e51b815260040161084f90612ab0565b60115481106110045760405162461bcd60e51b815260206004820152602960248201527f5468652072657175657374656420746f6b656e496420657863656564732075706044820152681c195c88189bdd5b9960ba1b606482015260840161084f565b600f546040516331a9108f60e11b81526004810183905233916001600160a01b031690636352211e9060240160206040518083038186803b15801561104857600080fd5b505afa15801561105c573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061108091906126fc565b6001600160a01b0316146111195760405162461bcd60e51b815260206004820152605460248201527f4d757374206f776e2074686520737065636966696320476f72696c6c61204e6560448201527f6d657369732077697468207468652072657175657374656420746f6b656e4964606482015273103a379036b4b73a103a3434b990223930a3a7a760611b608482015260a40161084f565b3466f8b0a10e47000011156111705760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161084f565b61117981610dc1565b6111bd5760405162461bcd60e51b8152602060048201526015602482015274111c9851d3d388185b1c9958591e481b5a5b9d1959605a1b604482015260640161084f565b60006111c7611d9f565b90506111d33382611f32565b60008281526015602052604081206001905560138054916111f383612c4c565b91905055505050565b600a546001600160a01b031633146112265760405162461bcd60e51b815260040161084f90612b03565b60405133904780156108fc02916000818181858888f1935050505061124a57600080fd5b565b601054600160a01b900460ff166112755760405162461bcd60e51b815260040161084f90612a16565b600081116112c55760405162461bcd60e51b815260206004820152601d60248201527f4d757374206d696e74206174206c65617374206f6e6520447261474f4e000000604482015260640161084f565b611388816013546112d69190612b89565b11156112f45760405162461bcd60e51b815260040161084f90612ab0565b600f546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a082319060240160206040518083038186803b15801561133857600080fd5b505afa15801561134c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611370919061290e565b9050818110156113d85760405162461bcd60e51b815260206004820152602d60248201527f4d75737420686f6c64204e20476f72696c6c61204e656d6573697320746f206d60448201526c696e74204e20447261474f4e5360981b606482015260840161084f565b60006113e333610baf565b90506000811161145b5760405162461bcd60e51b815260206004820152603b60248201527f596f75206d7573742068617665206174206c65617374206f6e6520476f72696c60448201527f6c61204e656d6573697320656c656769626c6520746f206d696e740000000000606482015260840161084f565b828111156114665750815b346114788266f8b0a10e470000612bb5565b11156114c65760405162461bcd60e51b815260206004820152601f60248201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604482015260640161084f565b6000805b838110156115d457600f54604051632f745c5960e01b8152336004820152602481018390526000916001600160a01b031690632f745c599060440160206040518083038186803b15801561151d57600080fd5b505afa158015611531573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611555919061290e565b905061156081610dc1565b156115b357600061156f611d9f565b905061157b3382611f32565b6000828152601560205260409020600190558361159781612c4c565b6013805491965090915060006115ac83612c4c565b9190505550505b838314156115c157506115d4565b50806115cc81612c4c565b9150506114ca565b5050505050565b60606001805461075790612c17565b60006115f5600b5490565b905090565b600a546001600160a01b031633146116245760405162461bcd60e51b815260040161084f90612b03565b601054600160a81b900460ff166116965760405162461bcd60e51b815260206004820152603060248201527f41697264726f702d7068617365206d7573742062652061637469766520746f2060448201526f30b4b9323937b8103090223930a3a7a760811b606482015260840161084f565b610388816014546116a79190612b89565b111561171b5760405162461bcd60e51b815260206004820152603d60248201527f546865206e756d626572206f6620647261676f6e7320776f756c64206578636560448201527f656420746865206d6178696d756d2061697264726f7020737570706c79000000606482015260840161084f565b60005b81811015610985576000611730611d9f565b905061173c8482611f32565b6014805490600061174c83612c4c565b919050555050808061175d90612c4c565b91505061171e565b6001600160a01b0382163314156117be5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084f565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6118343383611afd565b6118505760405162461bcd60e51b815260040161084f90612b38565b61185c84848484611f4c565b50505050565b6000818152600260205260409020546060906001600160a01b03166118e15760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b606482015260840161084f565b60006118eb611f7f565b9050600081511161190b5760405180602001604052806000815250611936565b8061191584611f8e565b604051602001611926929190612953565b6040516020818303038152906040525b9392505050565b60006119476115ea565b600c546115f59190612bd4565b600a546001600160a01b0316331461197e5760405162461bcd60e51b815260040161084f90612b03565b6001600160a01b0381166119e35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161084f565b600a546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600a80546001600160a01b0319166001600160a01b0392909216919091179055565b60006001600160e01b031982166380ac58cd60e01b1480611a7057506001600160e01b03198216635b5e139f60e01b145b8061074257506301ffc9a760e01b6001600160e01b0319831614610742565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611ac482610de3565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611b765760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161084f565b6000611b8183610de3565b9050806001600160a01b0316846001600160a01b03161480611bbc5750836001600160a01b0316611bb1846107da565b6001600160a01b0316145b80611bec57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611c0782610de3565b6001600160a01b031614611c6f5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161084f565b6001600160a01b038216611cd15760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084f565b611cdc83838361208c565b611ce7600082611a8f565b6001600160a01b0383166000908152600360205260408120805460019290611d10908490612bd4565b90915550506001600160a01b0382166000908152600360205260408120805460019290611d3e908490612b89565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600080611daa61193d565b11611df25760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b604482015260640161084f565b6000611dfc6115ea565b600c54611e099190612bd4565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c611e709190612c67565b6000818152600d602052604081205491925090611e8e575080611e9f565b506000818152600d60205260409020545b600d6000611eae600186612bd4565b81526020019081526020016000205460001415611ee457611ed0600184612bd4565b6000838152600d6020526040902055611f14565b600d6000611ef3600186612bd4565b81526020808201929092526040908101600090812054858252600d90935220555b611f1c612144565b50600e54611f2a9082612b89565b935050505090565b610dbd8282604051806020016040528060008152506121b2565b611f57848484611bf4565b611f63848484846121e5565b61185c5760405162461bcd60e51b815260040161084f90612a5e565b60606012805461075790612c17565b606081611fb25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611fdc5780611fc681612c4c565b9150611fd59050600a83612ba1565b9150611fb6565b60008167ffffffffffffffff811115611ff757611ff7612cd3565b6040519080825280601f01601f191660200182016040528015612021576020820181803683370190505b5090505b8415611bec57612036600183612bd4565b9150612043600a86612c67565b61204e906030612b89565b60f81b81838151811061206357612063612cbd565b60200101906001600160f81b031916908160001a905350612085600a86612ba1565b9450612025565b6001600160a01b0383166120e7576120e281600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61210a565b816001600160a01b0316836001600160a01b03161461210a5761210a83826122f2565b6001600160a01b038216612121576109858161238f565b826001600160a01b0316826001600160a01b03161461098557610985828261243e565b60008061214f61193d565b116121975760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b604482015260640161084f565b60006121a2600b5490565b90506115f5600b80546001019055565b6121bc8383612482565b6121c960008484846121e5565b6109855760405162461bcd60e51b815260040161084f90612a5e565b60006001600160a01b0384163b156122e757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612229903390899088908890600401612982565b602060405180830381600087803b15801561224357600080fd5b505af1925050508015612273575060408051601f3d908101601f191682019092526122709181019061288f565b60015b6122cd573d8080156122a1576040519150601f19603f3d011682016040523d82523d6000602084013e6122a6565b606091505b5080516122c55760405162461bcd60e51b815260040161084f90612a5e565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611bec565b506001949350505050565b600060016122ff84610e5a565b6123099190612bd4565b60008381526007602052604090205490915080821461235c576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906123a190600190612bd4565b600083815260096020526040812054600880549394509092849081106123c9576123c9612cbd565b9060005260206000200154905080600883815481106123ea576123ea612cbd565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061242257612422612ca7565b6001900381819060005260206000200160009055905550505050565b600061244983610e5a565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b0382166124d85760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084f565b6000818152600260205260409020546001600160a01b03161561253d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084f565b6125496000838361208c565b6001600160a01b0382166000908152600360205260408120805460019290612572908490612b89565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546125dc90612c17565b90600052602060002090601f0160209004810192826125fe5760008555612644565b82601f1061261757805160ff1916838001178555612644565b82800160010185558215612644579182015b82811115612644578251825591602001919060010190612629565b50612650929150612654565b5090565b5b808211156126505760008155600101612655565b600067ffffffffffffffff8084111561268457612684612cd3565b604051601f8501601f19908116603f011681019082821181831017156126ac576126ac612cd3565b816040528093508581528686860111156126c557600080fd5b858560208301376000602087830101525050509392505050565b6000602082840312156126f157600080fd5b813561193681612ce9565b60006020828403121561270e57600080fd5b815161193681612ce9565b6000806040838503121561272c57600080fd5b823561273781612ce9565b9150602083013561274781612ce9565b809150509250929050565b60008060006060848603121561276757600080fd5b833561277281612ce9565b9250602084013561278281612ce9565b929592945050506040919091013590565b600080600080608085870312156127a957600080fd5b84356127b481612ce9565b935060208501356127c481612ce9565b925060408501359150606085013567ffffffffffffffff8111156127e757600080fd5b8501601f810187136127f857600080fd5b61280787823560208401612669565b91505092959194509250565b6000806040838503121561282657600080fd5b823561283181612ce9565b91506020830135801515811461274757600080fd5b6000806040838503121561285957600080fd5b823561286481612ce9565b946020939093013593505050565b60006020828403121561288457600080fd5b813561193681612d01565b6000602082840312156128a157600080fd5b815161193681612d01565b6000602082840312156128be57600080fd5b813567ffffffffffffffff8111156128d557600080fd5b8201601f810184136128e657600080fd5b611bec84823560208401612669565b60006020828403121561290757600080fd5b5035919050565b60006020828403121561292057600080fd5b5051919050565b6000815180845261293f816020860160208601612beb565b601f01601f19169290920160200192915050565b60008351612965818460208801612beb565b835190830190612979818360208801612beb565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906129b590830184612927565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156129f7578351835292840192918401916001016129db565b50909695505050505050565b6020815260006119366020830184612927565b60208082526028908201527f5468652073616c65206d7573742062652061637469766520746f206d696e74206040820152673090223930a3a7a760c11b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526033908201527f54686520707572636861736520776f756c642065786365656420746865206d616040820152727820737570706c79206f6620447261474f4e5360681b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115612b9c57612b9c612c7b565b500190565b600082612bb057612bb0612c91565b500490565b6000816000190483118215151615612bcf57612bcf612c7b565b500290565b600082821015612be657612be6612c7b565b500390565b60005b83811015612c06578181015183820152602001612bee565b8381111561185c5750506000910152565b600181811c90821680612c2b57607f821691505b60208210811415610b4357634e487b7160e01b600052602260045260246000fd5b6000600019821415612c6057612c60612c7b565b5060010190565b600082612c7657612c76612c91565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114612cfe57600080fd5b50565b6001600160e01b031981168114612cfe57600080fdfea2646970667358221220b1f9e34675fdced25ca48d38eae9fb9298fc794ff8807f02f9832521abe678a464736f6c63430008060033

Deployed Bytecode Sourcemap

48703:5210:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39916:237;;;;;;;;;;-1:-1:-1;39916:237:0;;;;;:::i;:::-;;:::i;:::-;;;7955:14:1;;7948:22;7930:41;;7918:2;7903:18;39916:237:0;;;;;;;;27121:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;28581:221::-;;;;;;;;;;-1:-1:-1;28581:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;6337:32:1;;;6319:51;;6307:2;6292:18;28581:221:0;6274:102:1;28118:397:0;;;;;;;;;;-1:-1:-1;28118:397:0;;;;;:::i;:::-;;:::i;:::-;;40569:113;;;;;;;;;;-1:-1:-1;40657:10:0;:17;40569:113;;;20401:25:1;;;20389:2;20374:18;40569:113:0;20356:76:1;49136:25:0;;;;;;;;;;;;;;;;29471:305;;;;;;;;;;-1:-1:-1;29471:305:0;;;;;:::i;:::-;;:::i;40237:256::-;;;;;;;;;;-1:-1:-1;40237:256:0;;;;;:::i;:::-;;:::i;49713:83::-;;;;;;;;;;;;;:::i;50573:396::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;49802:92::-;;;;;;;;;;;;;:::i;29847:151::-;;;;;;;;;;-1:-1:-1;29847:151:0;;;;;:::i;:::-;;:::i;50192:373::-;;;;;;;;;;-1:-1:-1;50192:373:0;;;;;:::i;:::-;;:::i;40759:233::-;;;;;;;;;;-1:-1:-1;40759:233:0;;;;;:::i;:::-;;:::i;49625:82::-;;;;;;;;;;-1:-1:-1;49625:82:0;;;;;:::i;:::-;;:::i;48897:55::-;;;;;;;;;;;;48935:17;48897:55;;49939:188;;;;;;;;;;-1:-1:-1;49939:188:0;;;;;:::i;:::-;;:::i;26815:239::-;;;;;;;;;;-1:-1:-1;26815:239:0;;;;;:::i;:::-;;:::i;49286:44::-;;;;;;;;;;-1:-1:-1;49286:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;26545:208;;;;;;;;;;-1:-1:-1;26545:208:0;;;;;:::i;:::-;;:::i;47788:148::-;;;;;;;;;;;;;:::i;51011:740::-;;;;;;:::i;:::-;;:::i;53785:123::-;;;:::i;51792:1292::-;;;;;;:::i;:::-;;:::i;47137:87::-;;;;;;;;;;-1:-1:-1;47210:6:0;;-1:-1:-1;;;;;47210:6:0;47137:87;;27290:104;;;;;;;;;;;;;:::i;49195:37::-;;;;;;;;;;;;;;;;21638:99;;;;;;;;;;;;;:::i;53261:475::-;;;;;;;;;;-1:-1:-1;53261:475:0;;;;;:::i;:::-;;:::i;28874:295::-;;;;;;;;;;-1:-1:-1;28874:295:0;;;;;:::i;:::-;;:::i;49096:35::-;;;;;;;;;;-1:-1:-1;49096:35:0;;;;-1:-1:-1;;;49096:35:0;;;;;;49237:41;;;;;;;;;;;;;;;;30069:285;;;;;;;;;;-1:-1:-1;30069:285:0;;;;;:::i;:::-;;:::i;27465:360::-;;;;;;;;;;-1:-1:-1;27465:360:0;;;;;:::i;:::-;;:::i;21460:87::-;;;;;;;;;;-1:-1:-1;21529:10:0;;21460:87;;21843:113;;;;;;;;;;;;;:::i;29240:164::-;;;;;;;;;;-1:-1:-1;29240:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29361:25:0;;;29337:4;29361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29240:164;48796:44;;;;;;;;;;;;48836:4;48796:44;;49059:32;;;;;;;;;;-1:-1:-1;49059:32:0;;;;-1:-1:-1;;;49059:32:0;;;;;;48845:46;;;;;;;;;;;;48888:3;48845:46;;48091:244;;;;;;;;;;-1:-1:-1;48091:244:0;;;;;:::i;:::-;;:::i;39916:237::-;40018:4;-1:-1:-1;;;;;;40042:50:0;;-1:-1:-1;;;40042:50:0;;:103;;;40109:36;40133:11;40109:23;:36::i;:::-;40035:110;39916:237;-1:-1:-1;;39916:237:0:o;27121:100::-;27175:13;27208:5;27201:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27121:100;:::o;28581:221::-;28657:7;31910:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31910:16:0;28677:73;;;;-1:-1:-1;;;28677:73:0;;15578:2:1;28677:73:0;;;15560:21:1;15617:2;15597:18;;;15590:30;15656:34;15636:18;;;15629:62;-1:-1:-1;;;15707:18:1;;;15700:42;15759:19;;28677:73:0;;;;;;;;;-1:-1:-1;28770:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;28770:24:0;;28581:221::o;28118:397::-;28199:13;28215:23;28230:7;28215:14;:23::i;:::-;28199:39;;28263:5;-1:-1:-1;;;;;28257:11:0;:2;-1:-1:-1;;;;;28257:11:0;;;28249:57;;;;-1:-1:-1;;;28249:57:0;;17528:2:1;28249:57:0;;;17510:21:1;17567:2;17547:18;;;17540:30;17606:34;17586:18;;;17579:62;-1:-1:-1;;;17657:18:1;;;17650:31;17698:19;;28249:57:0;17500:223:1;28249:57:0;15965:10;-1:-1:-1;;;;;28327:21:0;;;;:62;;-1:-1:-1;28352:37:0;28369:5;15965:10;29240:164;:::i;28352:37::-;28319:154;;;;-1:-1:-1;;;28319:154:0;;13971:2:1;28319:154:0;;;13953:21:1;14010:2;13990:18;;;13983:30;14049:34;14029:18;;;14022:62;14120:26;14100:18;;;14093:54;14164:19;;28319:154:0;13943:246:1;28319:154:0;28486:21;28495:2;28499:7;28486:8;:21::i;:::-;28188:327;28118:397;;:::o;29471:305::-;29632:41;15965:10;29665:7;29632:18;:41::i;:::-;29624:103;;;;-1:-1:-1;;;29624:103:0;;;;;;;:::i;:::-;29740:28;29750:4;29756:2;29760:7;29740:9;:28::i;40237:256::-;40334:7;40370:23;40387:5;40370:16;:23::i;:::-;40362:5;:31;40354:87;;;;-1:-1:-1;;;40354:87:0;;8817:2:1;40354:87:0;;;8799:21:1;8856:2;8836:18;;;8829:30;8895:34;8875:18;;;8868:62;-1:-1:-1;;;8946:18:1;;;8939:41;8997:19;;40354:87:0;8789:233:1;40354:87:0;-1:-1:-1;;;;;;40459:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;40237:256::o;49713:83::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;49778:12:::1;::::0;;-1:-1:-1;;;;49762:28:0;::::1;-1:-1:-1::0;;;49778:12:0;;;::::1;;;49777:13;49762:28:::0;;::::1;;::::0;;49713:83::o;50573:396::-;50680:31;;;48836:4;50680:31;;;;;;;;;50621:16;;50648:29;;50680:31;;;;;;;;;;;-1:-1:-1;50680:31:0;50648:63;;50725:9;50720:216;48836:4;50740:1;:20;50720:216;;;50783:12;;;;:9;:12;;;;;;50799:1;50783:17;50779:138;;50834:1;50816:12;50829:1;50816:15;;;;;;;;:::i;:::-;;;;;;:19;;;;;50779:138;;;48836:4;50869:12;50882:1;50869:15;;;;;;;;:::i;:::-;;;;;;:34;;;;;50779:138;50762:3;;;;:::i;:::-;;;;50720:216;;;-1:-1:-1;50951:12:0;50573:396;-1:-1:-1;50573:396:0:o;49802:92::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;49873:15:::1;::::0;;-1:-1:-1;;;;49854:34:0;::::1;-1:-1:-1::0;;;49873:15:0;;;::::1;;;49872:16;49854:34:::0;;::::1;;::::0;;49802:92::o;29847:151::-;29951:39;29968:4;29974:2;29978:7;29951:39;;;;;;;;;;;;:16;:39::i;50192:373::-;50259:27;50334:9;50329:196;50353:4;;:20;;-1:-1:-1;;;50353:20:0;;-1:-1:-1;;;;;6337:32:1;;;50353:20:0;;;6319:51:1;50353:4:0;;;;:14;;6292:18:1;;50353:20:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50349:1;:24;50329:196;;;50411:4;;:33;;-1:-1:-1;;;50411:33:0;;-1:-1:-1;;;;;7066:32:1;;;50411:33:0;;;7048:51:1;7115:18;;;7108:34;;;50393:15:0;;50411:4;;:24;;7021:18:1;;50411:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;50393:51;;50461:16;50469:7;50461;:16::i;:::-;50457:58;;;50494:21;;;;:::i;:::-;;;;50457:58;-1:-1:-1;50375:3:0;;;;:::i;:::-;;;;50329:196;;40759:233;40834:7;40870:30;40657:10;:17;;40569:113;40870:30;40862:5;:38;40854:95;;;;-1:-1:-1;;;40854:95:0;;18348:2:1;40854:95:0;;;18330:21:1;18387:2;18367:18;;;18360:30;18426:34;18406:18;;;18399:62;-1:-1:-1;;;18477:18:1;;;18470:42;18529:19;;40854:95:0;18320:234:1;40854:95:0;40967:10;40978:5;40967:17;;;;;;;;:::i;:::-;;;;;;;;;40960:24;;40759:233;;;:::o;49625:82::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;49688:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;:::-;;49625:82:::0;:::o;49939:188::-;49994:4;50041:18;;;:9;:18;;;;;;50022:4;;50041:23;;50037:66;;;-1:-1:-1;50086:5:0;50118:3;49939:188;-1:-1:-1;;49939:188:0:o;26815:239::-;26887:7;26923:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26923:16:0;26958:19;26950:73;;;;-1:-1:-1;;;26950:73:0;;14807:2:1;26950:73:0;;;14789:21:1;14846:2;14826:18;;;14819:30;14885:34;14865:18;;;14858:62;-1:-1:-1;;;14936:18:1;;;14929:39;14985:19;;26950:73:0;14779:231:1;26545:208:0;26617:7;-1:-1:-1;;;;;26645:19:0;;26637:74;;;;-1:-1:-1;;;26637:74:0;;14396:2:1;26637:74:0;;;14378:21:1;14435:2;14415:18;;;14408:30;14474:34;14454:18;;;14447:62;-1:-1:-1;;;14525:18:1;;;14518:40;14575:19;;26637:74:0;14368:232:1;26637:74:0;-1:-1:-1;;;;;;26729:16:0;;;;;:9;:16;;;;;;;26545:208::o;47788:148::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;47879:6:::1;::::0;47858:40:::1;::::0;47895:1:::1;::::0;-1:-1:-1;;;;;47879:6:0::1;::::0;47858:40:::1;::::0;47895:1;;47858:40:::1;47909:6;:19:::0;;-1:-1:-1;;;;;;47909:19:0::1;::::0;;47788:148::o;51011:740::-;51082:12;;-1:-1:-1;;;51082:12:0;;;;51074:65;;;;-1:-1:-1;;;51074:65:0;;;;;;;:::i;:::-;51175:10;;51154:18;;:31;51146:95;;;;-1:-1:-1;;;51146:95:0;;;;;;;:::i;:::-;51270:10;;51256:11;:24;51248:78;;;;-1:-1:-1;;;51248:78:0;;12021:2:1;51248:78:0;;;12003:21:1;12060:2;12040:18;;;12033:30;12099:34;12079:18;;;12072:62;-1:-1:-1;;;12150:18:1;;;12143:39;12199:19;;51248:78:0;11993:231:1;51248:78:0;51341:4;;:25;;-1:-1:-1;;;51341:25:0;;;;;20401::1;;;51370:10:0;;-1:-1:-1;;;;;51341:4:0;;:12;;20374:18:1;;51341:25:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;51341:39:0;;51333:136;;;;-1:-1:-1;;;51333:136:0;;19178:2:1;51333:136:0;;;19160:21:1;19217:2;19197:18;;;19190:30;19256:34;19236:18;;;19229:62;19327:34;19307:18;;;19300:62;-1:-1:-1;;;19378:19:1;;;19371:51;19439:19;;51333:136:0;19150:314:1;51333:136:0;51499:9;48935:17;51484:24;;51476:68;;;;-1:-1:-1;;;51476:68:0;;12431:2:1;51476:68:0;;;12413:21:1;12470:2;12450:18;;;12443:30;12509:33;12489:18;;;12482:61;12560:18;;51476:68:0;12403:181:1;51476:68:0;51559:20;51567:11;51559:7;:20::i;:::-;51551:54;;;;-1:-1:-1;;;51551:54:0;;16352:2:1;51551:54:0;;;16334:21:1;16391:2;16371:18;;;16364:30;-1:-1:-1;;;16410:18:1;;;16403:51;16471:18;;51551:54:0;16324:171:1;51551:54:0;51614:17;51634:11;:9;:11::i;:::-;51614:31;;51652:32;51662:10;51674:9;51652;:32::i;:::-;51692:22;;;;:9;:22;;;;;51717:1;51692:26;;51725:18;:20;;;;;;:::i;:::-;;;;;;51067:684;51011:740;:::o;53785:123::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;53852:47:::1;::::0;53860:10:::1;::::0;53877:21:::1;53852:47:::0;::::1;;;::::0;::::1;::::0;;;53877:21;53860:10;53852:47;::::1;;;;;;53844:56;;;::::0;::::1;;53785:123::o:0;51792:1292::-;51866:12;;-1:-1:-1;;;51866:12:0;;;;51858:65;;;;-1:-1:-1;;;51858:65:0;;;;;;;:::i;:::-;51953:1;51940:10;:14;51932:56;;;;-1:-1:-1;;;51932:56:0;;20099:2:1;51932:56:0;;;20081:21:1;20138:2;20118:18;;;20111:30;20177:31;20157:18;;;20150:59;20226:18;;51932:56:0;20071:179:1;51932:56:0;48836:4;52026:10;52005:18;;:31;;;;:::i;:::-;:51;;51997:115;;;;-1:-1:-1;;;51997:115:0;;;;;;;:::i;:::-;52140:4;;:26;;-1:-1:-1;;;52140:26:0;;52155:10;52140:26;;;6319:51:1;52121:16:0;;-1:-1:-1;;;;;52140:4:0;;:14;;6292:18:1;;52140:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52121:45;;52198:10;52183:11;:25;;52175:83;;;;-1:-1:-1;;;52175:83:0;;13144:2:1;52175:83:0;;;13126:21:1;13183:2;13163:18;;;13156:30;13222:34;13202:18;;;13195:62;-1:-1:-1;;;13273:18:1;;;13266:43;13326:19;;52175:83:0;13116:235:1;52175:83:0;52267:18;52288:34;52311:10;52288:22;:34::i;:::-;52267:55;;52352:1;52339:10;:14;52331:86;;;;-1:-1:-1;;;52331:86:0;;19671:2:1;52331:86:0;;;19653:21:1;19710:2;19690:18;;;19683:30;19749:34;19729:18;;;19722:62;19820:29;19800:18;;;19793:57;19867:19;;52331:86:0;19643:249:1;52331:86:0;52443:10;52430;:23;52426:82;;;-1:-1:-1;52488:10:0;52426:82;52552:9;52524:24;52538:10;48935:17;52524:24;:::i;:::-;:37;;52516:81;;;;-1:-1:-1;;;52516:81:0;;12431:2:1;52516:81:0;;;12413:21:1;12470:2;12450:18;;;12443:30;12509:33;12489:18;;;12482:61;12560:18;;52516:81:0;12403:181:1;52516:81:0;52608:14;52640:9;52635:444;52659:11;52655:1;:15;52635:444;;;52708:4;;:39;;-1:-1:-1;;;52708:39:0;;52733:10;52708:39;;;7048:51:1;7115:18;;;7108:34;;;52690:15:0;;-1:-1:-1;;;;;52708:4:0;;:24;;7021:18:1;;52708:39:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52690:57;;52766:16;52774:7;52766;:16::i;:::-;52762:234;;;52801:17;52821:11;:9;:11::i;:::-;52801:31;;52849:32;52859:10;52871:9;52849;:32::i;:::-;52898:18;;;;:9;:18;;;;;52919:1;52898:22;;52937:8;;;;:::i;:::-;52962:18;:20;;52937:8;;-1:-1:-1;52962:20:0;;-1:-1:-1;52962:18:0;:20;;;:::i;:::-;;;;;;52784:212;52762:234;53022:10;53012:6;:20;53008:62;;;53051:5;;;53008:62;-1:-1:-1;52672:3:0;;;;:::i;:::-;;;;52635:444;;;;51849:1235;;;51792:1292;:::o;27290:104::-;27346:13;27379:7;27372:14;;;;;:::i;21638:99::-;21681:7;21708:21;:11;20203:14;;20111:114;21708:21;21701:28;;21638:99;:::o;53261:475::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;53344:15:::1;::::0;-1:-1:-1;;;53344:15:0;::::1;;;53336:76;;;::::0;-1:-1:-1;;;53336:76:0;;18761:2:1;53336:76:0::1;::::0;::::1;18743:21:1::0;18800:2;18780:18;;;18773:30;18839:34;18819:18;;;18812:62;-1:-1:-1;;;18890:18:1;;;18883:46;18946:19;;53336:76:0::1;18733:238:1::0;53336:76:0::1;48888:3;53456:5;53431:22;;:30;;;;:::i;:::-;:53;;53423:127;;;::::0;-1:-1:-1;;;53423:127:0;;10832:2:1;53423:127:0::1;::::0;::::1;10814:21:1::0;10871:2;10851:18;;;10844:30;10910:34;10890:18;;;10883:62;10981:31;10961:18;;;10954:59;11030:19;;53423:127:0::1;10804:251:1::0;53423:127:0::1;53567:6;53563:165;53583:5;53579:1;:9;53563:165;;;53610:14;53627:11;:9;:11::i;:::-;53610:28;;53653:24;53663:2;53667:9;53653;:24::i;:::-;53692:22;:24:::0;;;:22:::1;:24;::::0;::::1;:::i;:::-;;;;;;53595:133;53590:3;;;;;:::i;:::-;;;;53563:165;;28874:295:::0;-1:-1:-1;;;;;28977:24:0;;15965:10;28977:24;;28969:62;;;;-1:-1:-1;;;28969:62:0;;11667:2:1;28969:62:0;;;11649:21:1;11706:2;11686:18;;;11679:30;11745:27;11725:18;;;11718:55;11790:18;;28969:62:0;11639:175:1;28969:62:0;15965:10;29044:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;29044:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;29044:53:0;;;;;;;;;;29113:48;;7930:41:1;;;29044:42:0;;15965:10;29113:48;;7903:18:1;29113:48:0;;;;;;;28874:295;;:::o;30069:285::-;30201:41;15965:10;30234:7;30201:18;:41::i;:::-;30193:103;;;;-1:-1:-1;;;30193:103:0;;;;;;;:::i;:::-;30307:39;30321:4;30327:2;30331:7;30340:5;30307:13;:39::i;:::-;30069:285;;;;:::o;27465:360::-;31886:4;31910:16;;;:7;:16;;;;;;27538:13;;-1:-1:-1;;;;;31910:16:0;27564:76;;;;-1:-1:-1;;;27564:76:0;;17112:2:1;27564:76:0;;;17094:21:1;17151:2;17131:18;;;17124:30;17190:34;17170:18;;;17163:62;-1:-1:-1;;;17241:18:1;;;17234:45;17296:19;;27564:76:0;17084:237:1;27564:76:0;27653:21;27677:10;:8;:10::i;:::-;27653:34;;27729:1;27711:7;27705:21;:25;:112;;;;;;;;;;;;;;;;;27770:7;27779:18;:7;:16;:18::i;:::-;27753:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;27705:112;27698:119;27465:360;-1:-1:-1;;;27465:360:0:o;21843:113::-;21895:7;21936:12;:10;:12::i;:::-;21529:10;;21922:26;;;;:::i;48091:244::-;47210:6;;-1:-1:-1;;;;;47210:6:0;15965:10;47357:23;47349:68;;;;-1:-1:-1;;;47349:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;48180:22:0;::::1;48172:73;;;::::0;-1:-1:-1;;;48172:73:0;;9648:2:1;48172:73:0::1;::::0;::::1;9630:21:1::0;9687:2;9667:18;;;9660:30;9726:34;9706:18;;;9699:62;-1:-1:-1;;;9777:18:1;;;9770:36;9823:19;;48172:73:0::1;9620:228:1::0;48172:73:0::1;48282:6;::::0;48261:38:::1;::::0;-1:-1:-1;;;;;48261:38:0;;::::1;::::0;48282:6:::1;::::0;48261:38:::1;::::0;48282:6:::1;::::0;48261:38:::1;48310:6;:17:::0;;-1:-1:-1;;;;;;48310:17:0::1;-1:-1:-1::0;;;;;48310:17:0;;;::::1;::::0;;;::::1;::::0;;48091:244::o;26189:292::-;26291:4;-1:-1:-1;;;;;;26315:40:0;;-1:-1:-1;;;26315:40:0;;:105;;-1:-1:-1;;;;;;;26372:48:0;;-1:-1:-1;;;26372:48:0;26315:105;:158;;;-1:-1:-1;;;;;;;;;;19204:40:0;;;26437:36;19095:157;35698:174;35773:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;35773:29:0;-1:-1:-1;;;;;35773:29:0;;;;;;;;:24;;35827:23;35773:24;35827:14;:23::i;:::-;-1:-1:-1;;;;;35818:46:0;;;;;;;;;;;35698:174;;:::o;32115:348::-;32208:4;31910:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31910:16:0;32225:73;;;;-1:-1:-1;;;32225:73:0;;13558:2:1;32225:73:0;;;13540:21:1;13597:2;13577:18;;;13570:30;13636:34;13616:18;;;13609:62;-1:-1:-1;;;13687:18:1;;;13680:42;13739:19;;32225:73:0;13530:234:1;32225:73:0;32309:13;32325:23;32340:7;32325:14;:23::i;:::-;32309:39;;32378:5;-1:-1:-1;;;;;32367:16:0;:7;-1:-1:-1;;;;;32367:16:0;;:51;;;;32411:7;-1:-1:-1;;;;;32387:31:0;:20;32399:7;32387:11;:20::i;:::-;-1:-1:-1;;;;;32387:31:0;;32367:51;:87;;;-1:-1:-1;;;;;;29361:25:0;;;29337:4;29361:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;32422:32;32359:96;32115:348;-1:-1:-1;;;;32115:348:0:o;35036:544::-;35161:4;-1:-1:-1;;;;;35134:31:0;:23;35149:7;35134:14;:23::i;:::-;-1:-1:-1;;;;;35134:31:0;;35126:85;;;;-1:-1:-1;;;35126:85:0;;16702:2:1;35126:85:0;;;16684:21:1;16741:2;16721:18;;;16714:30;16780:34;16760:18;;;16753:62;-1:-1:-1;;;16831:18:1;;;16824:39;16880:19;;35126:85:0;16674:231:1;35126:85:0;-1:-1:-1;;;;;35230:16:0;;35222:65;;;;-1:-1:-1;;;35222:65:0;;11262:2:1;35222:65:0;;;11244:21:1;11301:2;11281:18;;;11274:30;11340:34;11320:18;;;11313:62;-1:-1:-1;;;11391:18:1;;;11384:34;11435:19;;35222:65:0;11234:226:1;35222:65:0;35300:39;35321:4;35327:2;35331:7;35300:20;:39::i;:::-;35404:29;35421:1;35425:7;35404:8;:29::i;:::-;-1:-1:-1;;;;;35446:15:0;;;;;;:9;:15;;;;;:20;;35465:1;;35446:15;:20;;35465:1;;35446:20;:::i;:::-;;;;-1:-1:-1;;;;;;;35477:13:0;;;;;;:9;:13;;;;;:18;;35494:1;;35477:13;:18;;35494:1;;35477:18;:::i;:::-;;;;-1:-1:-1;;35506:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;35506:21:0;-1:-1:-1;;;;;35506:21:0;;;;;;;;;35545:27;;35506:16;;35545:27;;;;;;;35036:544;;;:::o;23624:1262::-;23691:7;22400:1;22376:21;:19;:21::i;:::-;:25;22368:62;;;;-1:-1:-1;;;22368:62:0;;12791:2:1;22368:62:0;;;12773:21:1;12830:2;12810:18;;;12803:30;-1:-1:-1;;;12849:18:1;;;12842:54;12913:18;;22368:62:0;12763:174:1;22368:62:0;23711:16:::1;23744:12;:10;:12::i;:::-;21529:10:::0;;23730:26:::1;;;;:::i;:::-;23816:195;::::0;-1:-1:-1;;23851:10:0::1;5474:2:1::0;5470:15;;;5466:24;;23816:195:0::1;::::0;::::1;5454:37:1::0;23880:14:0::1;5525:15:1::0;;5521:24;5507:12;;;5500:46;23913:16:0::1;5562:12:1::0;;;5555:28;23948:14:0::1;5599:12:1::0;;;5592:28;23981:15:0::1;5636:13:1::0;;;5629:29;23711:45:0;;-1:-1:-1;23767:14:0::1;::::0;23711:45;;5674:13:1;;23816:195:0::1;;;;;;;;;;;;23792:230;;;;;;23784:239;;:250;;;;:::i;:::-;24047:13;24079:19:::0;;;:11:::1;:19;::::0;;;;;23767:267;;-1:-1:-1;24047:13:0;24075:304:::1;;-1:-1:-1::0;24224:6:0;24075:304:::1;;;-1:-1:-1::0;24348:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;24075:304:::1;24456:11;:25;24468:12;24479:1;24468:8:::0;:12:::1;:::i;:::-;24456:25;;;;;;;;;;;;24485:1;24456:30;24452:331;;;24590:12;24601:1;24590:8:::0;:12:::1;:::i;:::-;24568:19;::::0;;;:11:::1;:19;::::0;;;;:34;24452:331:::1;;;24746:11;:25;24758:12;24769:1;24758:8:::0;:12:::1;:::i;:::-;24746:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;24746:25:0;;;;24724:19;;;:11:::1;:19:::0;;;;:47;24452:331:::1;24824:17;:15;:17::i;:::-;-1:-1:-1::0;24869:9:0::1;::::0;24861:17:::1;::::0;:5;:17:::1;:::i;:::-;24854:24;;;;;23624:1262:::0;:::o;32805:110::-;32881:26;32891:2;32895:7;32881:26;;;;;;;;;;;;:9;:26::i;31236:272::-;31350:28;31360:4;31366:2;31370:7;31350:9;:28::i;:::-;31397:48;31420:4;31426:2;31430:7;31439:5;31397:22;:48::i;:::-;31389:111;;;;-1:-1:-1;;;31389:111:0;;;;;;;:::i;49523:94::-;49575:13;49604:7;49597:14;;;;;:::i;16540:723::-;16596:13;16817:10;16813:53;;-1:-1:-1;;16844:10:0;;;;;;;;;;;;-1:-1:-1;;;16844:10:0;;;;;16540:723::o;16813:53::-;16891:5;16876:12;16932:78;16939:9;;16932:78;;16965:8;;;;:::i;:::-;;-1:-1:-1;16988:10:0;;-1:-1:-1;16996:2:0;16988:10;;:::i;:::-;;;16932:78;;;17020:19;17052:6;17042:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;17042:17:0;;17020:39;;17070:154;17077:10;;17070:154;;17104:11;17114:1;17104:11;;:::i;:::-;;-1:-1:-1;17173:10:0;17181:2;17173:5;:10;:::i;:::-;17160:24;;:2;:24;:::i;:::-;17147:39;;17130:6;17137;17130:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;17130:56:0;;;;;;;;-1:-1:-1;17201:11:0;17210:2;17201:11;;:::i;:::-;;;17070:154;;41605:555;-1:-1:-1;;;;;41777:18:0;;41773:187;;41812:40;41844:7;42987:10;:17;;42960:24;;;;:15;:24;;;;;:44;;;43015:24;;;;;;;;;;;;42883:164;41812:40;41773:187;;;41882:2;-1:-1:-1;;;;;41874:10:0;:4;-1:-1:-1;;;;;41874:10:0;;41870:90;;41901:47;41934:4;41940:7;41901:32;:47::i;:::-;-1:-1:-1;;;;;41974:16:0;;41970:183;;42007:45;42044:7;42007:36;:45::i;41970:183::-;42080:4;-1:-1:-1;;;;;42074:10:0;:2;-1:-1:-1;;;;;42074:10:0;;42070:83;;42101:40;42129:2;42133:7;42101:27;:40::i;22066:192::-;22132:7;22400:1;22376:21;:19;:21::i;:::-;:25;22368:62;;;;-1:-1:-1;;;22368:62:0;;12791:2:1;22368:62:0;;;12773:21:1;12830:2;12810:18;;;12803:30;-1:-1:-1;;;12849:18:1;;;12842:54;12913:18;;22368:62:0;12763:174:1;22368:62:0;22152:13:::1;22168:21;:11;20203:14:::0;;20111:114;22168:21:::1;22152:37;;22202:23;:11;20322:19:::0;;20340:1;20322:19;;;20233:127;33142:250;33238:18;33244:2;33248:7;33238:5;:18::i;:::-;33275:54;33306:1;33310:2;33314:7;33323:5;33275:22;:54::i;:::-;33267:117;;;;-1:-1:-1;;;33267:117:0;;;;;;;:::i;36437:843::-;36558:4;-1:-1:-1;;;;;36584:13:0;;8369:20;8408:8;36580:693;;36620:72;;-1:-1:-1;;;36620:72:0;;-1:-1:-1;;;;;36620:36:0;;;;;:72;;15965:10;;36671:4;;36677:7;;36686:5;;36620:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36620:72:0;;;;;;;;-1:-1:-1;;36620:72:0;;;;;;;;;;;;:::i;:::-;;;36616:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;36866:13:0;;36862:341;;36909:60;;-1:-1:-1;;;36909:60:0;;;;;;;:::i;36862:341::-;37153:6;37147:13;37138:6;37134:2;37130:15;37123:38;36616:602;-1:-1:-1;;;;;;36743:55:0;-1:-1:-1;;;36743:55:0;;-1:-1:-1;36736:62:0;;36580:693;-1:-1:-1;37257:4:0;36437:843;;;;;;:::o;43674:988::-;43940:22;43990:1;43965:22;43982:4;43965:16;:22::i;:::-;:26;;;;:::i;:::-;44002:18;44023:26;;;:17;:26;;;;;;43940:51;;-1:-1:-1;44156:28:0;;;44152:328;;-1:-1:-1;;;;;44223:18:0;;44201:19;44223:18;;;:12;:18;;;;;;;;:34;;;;;;;;;44274:30;;;;;;:44;;;44391:30;;:17;:30;;;;;:43;;;44152:328;-1:-1:-1;44576:26:0;;;;:17;:26;;;;;;;;44569:33;;;-1:-1:-1;;;;;44620:18:0;;;;;:12;:18;;;;;:34;;;;;;;44613:41;43674:988::o;44957:1079::-;45235:10;:17;45210:22;;45235:21;;45255:1;;45235:21;:::i;:::-;45267:18;45288:24;;;:15;:24;;;;;;45661:10;:26;;45210:46;;-1:-1:-1;45288:24:0;;45210:46;;45661:26;;;;;;:::i;:::-;;;;;;;;;45639:48;;45725:11;45700:10;45711;45700:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;45805:28;;;:15;:28;;;;;;;:41;;;45977:24;;;;;45970:31;46012:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45028:1008;;;44957:1079;:::o;42461:221::-;42546:14;42563:20;42580:2;42563:16;:20::i;:::-;-1:-1:-1;;;;;42594:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;42639:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;42461:221:0:o;33728:382::-;-1:-1:-1;;;;;33808:16:0;;33800:61;;;;-1:-1:-1;;;33800:61:0;;15217:2:1;33800:61:0;;;15199:21:1;;;15236:18;;;15229:30;15295:34;15275:18;;;15268:62;15347:18;;33800:61:0;15189:182:1;33800:61:0;31886:4;31910:16;;;:7;:16;;;;;;-1:-1:-1;;;;;31910:16:0;:30;33872:58;;;;-1:-1:-1;;;33872:58:0;;10055:2:1;33872:58:0;;;10037:21:1;10094:2;10074:18;;;10067:30;10133;10113:18;;;10106:58;10181:18;;33872:58:0;10027:178:1;33872:58:0;33943:45;33972:1;33976:2;33980:7;33943:20;:45::i;:::-;-1:-1:-1;;;;;34001:13:0;;;;;;:9;:13;;;;;:18;;34018:1;;34001:13;:18;;34018:1;;34001:18;:::i;:::-;;;;-1:-1:-1;;34030:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34030:21:0;-1:-1:-1;;;;;34030:21:0;;;;;;;;34069:33;;34030:16;;;34069:33;;34030:16;;34069:33;33728:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:247::-;709:6;762:2;750:9;741:7;737:23;733:32;730:2;;;778:1;775;768:12;730:2;817:9;804:23;836:31;861:5;836:31;:::i;902:251::-;972:6;1025:2;1013:9;1004:7;1000:23;996:32;993:2;;;1041:1;1038;1031:12;993:2;1073:9;1067:16;1092:31;1117:5;1092:31;:::i;1158:388::-;1226:6;1234;1287:2;1275:9;1266:7;1262:23;1258:32;1255:2;;;1303:1;1300;1293:12;1255:2;1342:9;1329:23;1361:31;1386:5;1361:31;:::i;:::-;1411:5;-1:-1:-1;1468:2:1;1453:18;;1440:32;1481:33;1440:32;1481:33;:::i;:::-;1533:7;1523:17;;;1245:301;;;;;:::o;1551:456::-;1628:6;1636;1644;1697:2;1685:9;1676:7;1672:23;1668:32;1665:2;;;1713:1;1710;1703:12;1665:2;1752:9;1739:23;1771:31;1796:5;1771:31;:::i;:::-;1821:5;-1:-1:-1;1878:2:1;1863:18;;1850:32;1891:33;1850:32;1891:33;:::i;:::-;1655:352;;1943:7;;-1:-1:-1;;;1997:2:1;1982:18;;;;1969:32;;1655:352::o;2012:794::-;2107:6;2115;2123;2131;2184:3;2172:9;2163:7;2159:23;2155:33;2152:2;;;2201:1;2198;2191:12;2152:2;2240:9;2227:23;2259:31;2284:5;2259:31;:::i;:::-;2309:5;-1:-1:-1;2366:2:1;2351:18;;2338:32;2379:33;2338:32;2379:33;:::i;:::-;2431:7;-1:-1:-1;2485:2:1;2470:18;;2457:32;;-1:-1:-1;2540:2:1;2525:18;;2512:32;2567:18;2556:30;;2553:2;;;2599:1;2596;2589:12;2553:2;2622:22;;2675:4;2667:13;;2663:27;-1:-1:-1;2653:2:1;;2704:1;2701;2694:12;2653:2;2727:73;2792:7;2787:2;2774:16;2769:2;2765;2761:11;2727:73;:::i;:::-;2717:83;;;2142:664;;;;;;;:::o;2811:416::-;2876:6;2884;2937:2;2925:9;2916:7;2912:23;2908:32;2905:2;;;2953:1;2950;2943:12;2905:2;2992:9;2979:23;3011:31;3036:5;3011:31;:::i;:::-;3061:5;-1:-1:-1;3118:2:1;3103:18;;3090:32;3160:15;;3153:23;3141:36;;3131:2;;3191:1;3188;3181:12;3232:315;3300:6;3308;3361:2;3349:9;3340:7;3336:23;3332:32;3329:2;;;3377:1;3374;3367:12;3329:2;3416:9;3403:23;3435:31;3460:5;3435:31;:::i;:::-;3485:5;3537:2;3522:18;;;;3509:32;;-1:-1:-1;;;3319:228:1:o;3552:245::-;3610:6;3663:2;3651:9;3642:7;3638:23;3634:32;3631:2;;;3679:1;3676;3669:12;3631:2;3718:9;3705:23;3737:30;3761:5;3737:30;:::i;3802:249::-;3871:6;3924:2;3912:9;3903:7;3899:23;3895:32;3892:2;;;3940:1;3937;3930:12;3892:2;3972:9;3966:16;3991:30;4015:5;3991:30;:::i;4056:450::-;4125:6;4178:2;4166:9;4157:7;4153:23;4149:32;4146:2;;;4194:1;4191;4184:12;4146:2;4234:9;4221:23;4267:18;4259:6;4256:30;4253:2;;;4299:1;4296;4289:12;4253:2;4322:22;;4375:4;4367:13;;4363:27;-1:-1:-1;4353:2:1;;4404:1;4401;4394:12;4353:2;4427:73;4492:7;4487:2;4474:16;4469:2;4465;4461:11;4427:73;:::i;4511:180::-;4570:6;4623:2;4611:9;4602:7;4598:23;4594:32;4591:2;;;4639:1;4636;4629:12;4591:2;-1:-1:-1;4662:23:1;;4581:110;-1:-1:-1;4581:110:1:o;4696:184::-;4766:6;4819:2;4807:9;4798:7;4794:23;4790:32;4787:2;;;4835:1;4832;4825:12;4787:2;-1:-1:-1;4858:16:1;;4777:103;-1:-1:-1;4777:103:1:o;4885:257::-;4926:3;4964:5;4958:12;4991:6;4986:3;4979:19;5007:63;5063:6;5056:4;5051:3;5047:14;5040:4;5033:5;5029:16;5007:63;:::i;:::-;5124:2;5103:15;-1:-1:-1;;5099:29:1;5090:39;;;;5131:4;5086:50;;4934:208;-1:-1:-1;;4934:208:1:o;5698:470::-;5877:3;5915:6;5909:13;5931:53;5977:6;5972:3;5965:4;5957:6;5953:17;5931:53;:::i;:::-;6047:13;;6006:16;;;;6069:57;6047:13;6006:16;6103:4;6091:17;;6069:57;:::i;:::-;6142:20;;5885:283;-1:-1:-1;;;;5885:283:1:o;6381:488::-;-1:-1:-1;;;;;6650:15:1;;;6632:34;;6702:15;;6697:2;6682:18;;6675:43;6749:2;6734:18;;6727:34;;;6797:3;6792:2;6777:18;;6770:31;;;6575:4;;6818:45;;6843:19;;6835:6;6818:45;:::i;:::-;6810:53;6584:285;-1:-1:-1;;;;;;6584:285:1:o;7153:632::-;7324:2;7376:21;;;7446:13;;7349:18;;;7468:22;;;7295:4;;7324:2;7547:15;;;;7521:2;7506:18;;;7295:4;7590:169;7604:6;7601:1;7598:13;7590:169;;;7665:13;;7653:26;;7734:15;;;;7699:12;;;;7626:1;7619:9;7590:169;;;-1:-1:-1;7776:3:1;;7304:481;-1:-1:-1;;;;;;7304:481:1:o;7982:219::-;8131:2;8120:9;8113:21;8094:4;8151:44;8191:2;8180:9;8176:18;8168:6;8151:44;:::i;8206:404::-;8408:2;8390:21;;;8447:2;8427:18;;;8420:30;8486:34;8481:2;8466:18;;8459:62;-1:-1:-1;;;8552:2:1;8537:18;;8530:38;8600:3;8585:19;;8380:230::o;9027:414::-;9229:2;9211:21;;;9268:2;9248:18;;;9241:30;9307:34;9302:2;9287:18;;9280:62;-1:-1:-1;;;9373:2:1;9358:18;;9351:48;9431:3;9416:19;;9201:240::o;10210:415::-;10412:2;10394:21;;;10451:2;10431:18;;;10424:30;10490:34;10485:2;10470:18;;10463:62;-1:-1:-1;;;10556:2:1;10541:18;;10534:49;10615:3;10600:19;;10384:241::o;15789:356::-;15991:2;15973:21;;;16010:18;;;16003:30;16069:34;16064:2;16049:18;;16042:62;16136:2;16121:18;;15963:182::o;17728:413::-;17930:2;17912:21;;;17969:2;17949:18;;;17942:30;18008:34;18003:2;17988:18;;17981:62;-1:-1:-1;;;18074:2:1;18059:18;;18052:47;18131:3;18116:19;;17902:239::o;20437:128::-;20477:3;20508:1;20504:6;20501:1;20498:13;20495:2;;;20514:18;;:::i;:::-;-1:-1:-1;20550:9:1;;20485:80::o;20570:120::-;20610:1;20636;20626:2;;20641:18;;:::i;:::-;-1:-1:-1;20675:9:1;;20616:74::o;20695:168::-;20735:7;20801:1;20797;20793:6;20789:14;20786:1;20783:21;20778:1;20771:9;20764:17;20760:45;20757:2;;;20808:18;;:::i;:::-;-1:-1:-1;20848:9:1;;20747:116::o;20868:125::-;20908:4;20936:1;20933;20930:8;20927:2;;;20941:18;;:::i;:::-;-1:-1:-1;20978:9:1;;20917:76::o;20998:258::-;21070:1;21080:113;21094:6;21091:1;21088:13;21080:113;;;21170:11;;;21164:18;21151:11;;;21144:39;21116:2;21109:10;21080:113;;;21211:6;21208:1;21205:13;21202:2;;;-1:-1:-1;;21246:1:1;21228:16;;21221:27;21051:205::o;21261:380::-;21340:1;21336:12;;;;21383;;;21404:2;;21458:4;21450:6;21446:17;21436:27;;21404:2;21511;21503:6;21500:14;21480:18;21477:38;21474:2;;;21557:10;21552:3;21548:20;21545:1;21538:31;21592:4;21589:1;21582:15;21620:4;21617:1;21610:15;21646:135;21685:3;-1:-1:-1;;21706:17:1;;21703:2;;;21726:18;;:::i;:::-;-1:-1:-1;21773:1:1;21762:13;;21693:88::o;21786:112::-;21818:1;21844;21834:2;;21849:18;;:::i;:::-;-1:-1:-1;21883:9:1;;21824:74::o;21903:127::-;21964:10;21959:3;21955:20;21952:1;21945:31;21995:4;21992:1;21985:15;22019:4;22016:1;22009:15;22035:127;22096:10;22091:3;22087:20;22084:1;22077:31;22127:4;22124:1;22117:15;22151:4;22148:1;22141:15;22167:127;22228:10;22223:3;22219:20;22216:1;22209:31;22259:4;22256:1;22249:15;22283:4;22280:1;22273:15;22299:127;22360:10;22355:3;22351:20;22348:1;22341:31;22391:4;22388:1;22381:15;22415:4;22412:1;22405:15;22431:127;22492:10;22487:3;22483:20;22480:1;22473:31;22523:4;22520:1;22513:15;22547:4;22544:1;22537:15;22563:131;-1:-1:-1;;;;;22638:31:1;;22628:42;;22618:2;;22684:1;22681;22674:12;22618:2;22608:86;:::o;22699:131::-;-1:-1:-1;;;;;;22773:32:1;;22763:43;;22753:2;;22820:1;22817;22810:12

Swarm Source

ipfs://b1f9e34675fdced25ca48d38eae9fb9298fc794ff8807f02f9832521abe678a4
Loading...
Loading
Loading...
Loading
[ 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.