ETH Price: $2,515.58 (+1.74%)

Token

2Rich Island Tikis (2RIT)
 

Overview

Max Total Supply

1,000 2RIT

Holders

90

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 2RIT
0xc33Ecb0C656E43BF33A92a4559b2ECcca13D3A78
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RichIslandTikis

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: CollectibleContract/@lib/Initializable.sol



pragma solidity ^0.8.1;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

// File: CollectibleContract/@lib/EIP712Base.sol



pragma solidity ^0.8.1;


contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

// File: @openzeppelin/contracts/utils/math/SafeMath.sol


// OpenZeppelin Contracts v4.4.1 (utils/math/SafeMath.sol)

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is generally not needed starting with Solidity 0.8, since the compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

// File: CollectibleContract/@lib/NativeMetaTransaction.sol



pragma solidity ^0.8.1;



contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

// File: CollectibleContract/@lib/ContextMixin.sol



pragma solidity ^0.8.1;

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (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() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

// File: CollectibleContract/@lib/Whitelistable.sol


pragma solidity ^0.8.0;


/// @author nexusque
/// @title Can use whitelist for varius functions
abstract contract Whitelistable is Ownable {

    bool public whitelistRequired = true;

    mapping(address => bool) public whitelist;

    event WhitelistedAddressRemoved(address addr);

    event WhitelistedAddressAdded(address addr);

    event WhitelistedRequirementChanged(bool val);

    /**
     * @dev throws error if called by any wallet that is not whitelisted
     */
    modifier onlyWhitelisted() {
        if (whitelistRequired == true) require(whitelist[msg.sender], "Alert: You're not on the whitelist.");
        _;
    }

    constructor(
        address[] memory _whitelistAddresses
    )  {
        _addAddressesToWhitelist(_whitelistAddresses);
    }

    /**
     * @dev Check if a wallet is whitelisted
     * @param _owner address
     */
    function isWhitelisted(address _owner) external view returns (bool) {
        return whitelist[_owner] == true;
    }

    /**
     * @dev change whitelist requirement
     * @param _val bool
     */
    function setWhitelistRequirement(bool _val)
        external
        onlyOwner
    {
        whitelistRequired = _val;
        emit WhitelistedRequirementChanged(_val);
    }

    /**
     * @dev add addresses to the whitelist
     * @param addrs addresses
     */
    function addAddressesToWhitelist(address[] memory addrs)
        external
        onlyOwner
    {
        _addAddressesToWhitelist(addrs);
    }

    function _addAddressesToWhitelist(address[] memory addrs)
        internal
        onlyOwner
    {
        for (uint32 i = 0; i < addrs.length; i++) {
            whitelist[addrs[i]] = true;
            emit WhitelistedAddressAdded(addrs[i]);
        }
    }

    /**
     * @dev remove addresses from the whitelist
     * @param addrs addresses
     */
    function removeAddressesFromWhitelist(address[] memory addrs)
        external
        onlyOwner
    {
        for (uint32 i = 0; i < addrs.length; i++) {
            whitelist[addrs[i]] = false;
            emit WhitelistedAddressRemoved(addrs[i]);
        }
    }
}
// File: CollectibleContract/@lib/Priceable.sol


pragma solidity ^0.8.0;


/// @author nexusque
/// @title Set price of tokens in contract
abstract contract Priceable is Ownable {
    uint256 private _tokenPrice = 0;

    /**
     * @dev Internal setting price of tokens in eth
     * @param _etherPrice price in eth i.e 0.04
     */
    function _setTokenPrice(uint _etherPrice) internal onlyOwner {
        _tokenPrice = _etherPrice;
    }

    /**
     * @dev Set price of tokens in eth
     * @param _etherPrice price in eth i.e 0.04
     */
    function setTokenPrice(uint _etherPrice) external onlyOwner {
        _setTokenPrice(_etherPrice);
    }

    function getTokenPrice() public
    view 
    returns(uint256) {
        return _tokenPrice;
    }
}
// File: CollectibleContract/@lib/Pauseable.sol


pragma solidity ^0.8.0;


/// @author nexusque
/// @title Pause contract to help stop transactions.
abstract contract Pauseable is Ownable {
    bool public paused = false;

    
    /**
     * @dev pause or resume the pledge function and the claim function
     * @param _state true means paused
     */
    function pause(bool _state) external onlyOwner {
        paused = _state;
    }
}
// File: CollectibleContract/@lib/Claimable.sol


pragma solidity ^0.8.0;





/// @author nexusque
/// @title claim pledged tokens from contract
abstract contract Claimable is 
    Ownable,
    Whitelistable,
    Priceable,
    Pauseable
{
    uint256 public totalPledge = 0;

    uint256 private _maxSupply = 1000;
    uint256 private _limit = 5;

    mapping(address => uint8) public pledgeNum;
    mapping(address => uint8) public claimed;

    constructor(
        uint256 maxSupply,
        uint256 limit,
        address[] memory _whitelistAddresses
    ) Whitelistable(_whitelistAddresses) {
        _maxSupply = maxSupply;
        _limit = limit;
    }

    /**
     * @dev Pledge for the purchase. Each address can only purchase up to 5 Humans. Only whitelisted users can pledge.
     * @param _num Quantity to purchase
     */
    function pledge(uint8 _num) external payable onlyWhitelisted {
        require(!paused, "Alert: Pledge has not started yet.");
        require(
            (_num + pledgeNum[msg.sender] + claimed[msg.sender]) <= _limit,
            "Alert: Each address can only purchase up to 5 collectibles."
        );
        require(
            totalPledge + uint256(_num) <= _maxSupply - totalPledge,
            "Alert: Sorry, all collectibles have been sold."
        );
        require(
            msg.value >= getTokenPrice(),
            "Alert: You need to pay at least the required cost."
        );
        _pledgeAddress(msg.sender, _num);
    }

    function pledgeAddress(address wallet, uint8 _num) public onlyOwner  {
        _pledgeAddress(wallet, _num);
    }

    function _pledgeAddress(address wallet, uint8 _num) private  {
        pledgeNum[wallet] += _num;
        totalPledge += uint256(_num);
    }

    function pledgeRemaining()  external view returns (uint256) {
        return _maxSupply - totalPledge;
    }

    /**
     * @dev Your Tiki can only be claimed at the end of the sale.
     */
    function claim() virtual external {
        require(!paused, "Tiki: Claim has not started yet.");
        claimed[msg.sender] += pledgeNum[msg.sender];
        pledgeNum[msg.sender] = 0;
    }
}
// File: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

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


// OpenZeppelin Contracts v4.4.1 (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/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (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/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts v4.4.1 (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/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (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/token/ERC721/ERC721.sol


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

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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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


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

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (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: CollectibleContract/@lib/WithLimitedSupply.sol


pragma solidity ^0.8.0;



/// @author 1001.digital
/// ReviewedBy nexusque
/// @title A token tracker that limits the token supply and increments token IDs on each new mint.
abstract contract WithLimitedSupply is ERC721Enumerable {
    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 _totalSupply;

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

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

    /// @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 totalSupply() - 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: CollectibleContract/@lib/RandomlyAssigned.sol


pragma solidity ^0.8.0;


/// @author 1001.digital
/// ReviewedBy nexusque
/// @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 _totalSupply how many tokens this collection should hold
    /// @param _startFrom the tokenID with which to start counting
    constructor (uint256 _totalSupply, uint256 _startFrom)
        WithLimitedSupply(_totalSupply)
    {
        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 = totalSupply() - 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;
    }
}
// File: CollectibleContract/Collectible.sol


pragma solidity ^0.8.2;









/// @author nexusque
contract RichIslandTikis is  ContextMixin,  NativeMetaTransaction,  Ownable, Claimable, RandomlyAssigned {
    using SafeMath for uint256;

    address payable public clientAddress;
    address payable public artistAddress;
    address payable public giveawayAddress;
    address payable public paymentAddress;

    string public baseTokenURI = "";
    string public baseExtension = ".json";

    bool public revealed = false;

    string public notRevealedURI = "";

    // For RandomlyAssigned: Max supply is 10000; id start from 1 (instead of 0)
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        string memory _notRevealedURI,
        address _artistAddress,
        address _clientAddress,
        address _giveawayAddress,
        address _paymentAddress,
        address[] memory _whitelistAddresses
    ) ERC721 (_name, _symbol)  RandomlyAssigned(1000, 1) Claimable(1000, 5, _whitelistAddresses) {
        _initializeEIP712(_name);
     
        baseTokenURI = _uri;
        notRevealedURI = _notRevealedURI;

        _setTokenPrice(0.04 ether);

        artistAddress = payable(_artistAddress);
        clientAddress = payable(_clientAddress);
        paymentAddress = payable(_paymentAddress);
        giveawayAddress = payable(_giveawayAddress);

        pledgeAddress(clientAddress, 50);
        pledgeAddress(artistAddress, 10);
        pledgeAddress(giveawayAddress, 50);
    }
    

    /**
     * @dev Your Tiki can only be claimed at the end of the sale.
     */
    function claim() external override(Claimable) {
        require(!paused, "Tiki: Claim has not started yet.");
        _mintList(pledgeNum[msg.sender]);
        claimed[msg.sender] += pledgeNum[msg.sender];
        pledgeNum[msg.sender] = 0;
    }

    /**
     * @dev mint _num of tikis 
     * @param _num Quantity to mint
     */
    function _mintList(uint8 _num) private {
        for (uint8 i = 0; i < _num; i++) {
            _safeMint(msg.sender, nextToken());
        }
    }

    /**
     * @dev set revealed to true (only Owner)
     */
    function reveal() external onlyOwner {
        revealed = true;
    }


    /**
     * @dev change the notRevealedURI (only Owner)
     * @param _notRevealedURI Not revealed URI
     */
    function setNotRevealedURI(string memory _notRevealedURI)
        external
        onlyOwner
    {
        notRevealedURI = _notRevealedURI;
    }

    /**
     * @dev change the baseTokenURI (only Owner)
     * @param _baseTokenURI base token URI
     */
    function setBaseURI(string memory _baseTokenURI) external onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    /**
     * @dev change the setPaymentAddress (only Owner)
     * @param _paymentAddress address to send eth to when withdrawing
     */
    function setPaymentAddress(address _paymentAddress) external onlyOwner {
        paymentAddress = payable(_paymentAddress);
    }

    /**
     * @dev returns the token URI of _tokenId
     * @param _tokenId id of the token
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_exists(_tokenId), "Alert: This token does not exist!");
        if (revealed == false) {
            return string(abi.encodePacked(notRevealedURI, Strings.toString(_tokenId), baseExtension));
        }
        return
            string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId), baseExtension));
    }

    /**
     * @dev this is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    /**
     * @dev set the base extension of the metadata file (only Owner)
     * @param _newBaseExtension extension (empty or with a dot infront)
     */
    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    /**
     * @dev get the ids of the Humans owned by _owner
     * @param _owner address
     */
    function walletOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory tokenIds = new uint256[](ownerTokenCount);
        for (uint256 i; i < ownerTokenCount; i++) {
            tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokenIds;
    }

    /**
    * @dev withdraw all balance of this contract to the paymentAddress contract
    */
    function withdraw() external payable onlyOwner {
        (bool success, ) = payable(paymentAddress).call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"string","name":"_notRevealedURI","type":"string"},{"internalType":"address","name":"_artistAddress","type":"address"},{"internalType":"address","name":"_clientAddress","type":"address"},{"internalType":"address","name":"_giveawayAddress","type":"address"},{"internalType":"address","name":"_paymentAddress","type":"address"},{"internalType":"address[]","name":"_whitelistAddresses","type":"address[]"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"val","type":"bool"}],"name":"WhitelistedRequirementChanged","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","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":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"clientAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giveawayAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"notRevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paymentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"pledge","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"pledgeAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"pledgeNum","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pledgeRemaining","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_paymentAddress","type":"address"}],"name":"setPaymentAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_etherPrice","type":"uint256"}],"name":"setTokenPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_val","type":"bool"}],"name":"setWhitelistRequirement","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":"totalPledge","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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistRequired","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6000805460ff1990811682556003805460ff60a01b1916600160a01b17905560058281556006805490921690915560078290556103e860085560095560a0604081905260808290526200005691601e9190620006c7565b5060408051808201909152600580825264173539b7b760d91b60209092019182526200008591601f91620006c7565b506020805460ff191681556040805191820190819052600091829052620000b09160219190620006c7565b50348015620000be57600080fd5b506040516200450c3803806200450c833981016040819052620000e191620008b6565b6103e86001818b8b826005878062000102620000fc62000230565b6200024c565b6200010d816200029e565b505060089190915560095581516200012d90600c906020850190620006c7565b5080516200014390600d906020840190620006c7565b50505060175560195550620001588962000404565b86516200016d90601e9060208a0190620006c7565b50855162000183906021906020890190620006c7565b5062000196668e1bc9bf04000062000465565b601b80546001600160a01b038088166001600160a01b031992831617909255601a80548784169083168117909155601d8054868516908416179055601c805493871693909216929092179055620001ef906032620004d7565b601b5462000208906001600160a01b0316600a620004d7565b601c5462000221906001600160a01b03166032620004d7565b50505050505050505062000afe565b6000620002476200055060201b62001ea91760201c565b905090565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b620002a862000230565b6001600160a01b0316620002c46003546001600160a01b031690565b6001600160a01b0316146200030f5760405162461bcd60e51b81526020600482018190526024820152600080516020620044ec83398151915260448201526064015b60405180910390fd5b60005b81518163ffffffff1610156200040057600160046000848463ffffffff168151811062000343576200034362000ad2565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f828263ffffffff1681518110620003be57620003be62000ad2565b6020026020010151604051620003e391906001600160a01b0391909116815260200190565b60405180910390a180620003f78162000a95565b91505062000312565b5050565b60005460ff16156200044a5760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640162000306565b6200045581620005af565b506000805460ff19166001179055565b6200046f62000230565b6001600160a01b03166200048b6003546001600160a01b031690565b6001600160a01b031614620004d25760405162461bcd60e51b81526020600482018190526024820152600080516020620044ec833981519152604482015260640162000306565b600555565b620004e162000230565b6001600160a01b0316620004fd6003546001600160a01b031690565b6001600160a01b031614620005445760405162461bcd60e51b81526020600482018190526024820152600080516020620044ec833981519152604482015260640162000306565b62000400828262000662565b600033301415620005a957600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620005ac9050565b50335b90565b6040518060800160405280604f81526020016200449d604f913980516020918201208251838301206040805180820190915260018152603160f81b930192909252907fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc6304660408051602081019690965285019390935260608401919091526001600160a01b0316608083015260a082015260c00160408051601f19818403018152919052805160209091012060015550565b6001600160a01b0382166000908152600a6020526040812080548392906200068f90849060ff1662000a30565b92506101000a81548160ff021916908360ff1602179055508060ff1660076000828254620006be919062000a15565b90915550505050565b828054620006d59062000a58565b90600052602060002090601f016020900481019282620006f9576000855562000744565b82601f106200071457805160ff191683800117855562000744565b8280016001018555821562000744579182015b828111156200074457825182559160200191906001019062000727565b506200075292915062000756565b5090565b5b8082111562000752576000815560010162000757565b80516001600160a01b03811681146200078557600080fd5b919050565b600082601f8301126200079c57600080fd5b815160206001600160401b03821115620007ba57620007ba62000ae8565b8160051b620007cb828201620009e2565b838152828101908684018388018501891015620007e757600080fd5b600093505b85841015620008155762000800816200076d565b835260019390930192918401918401620007ec565b50979650505050505050565b600082601f8301126200083357600080fd5b81516001600160401b038111156200084f576200084f62000ae8565b602062000865601f8301601f19168201620009e2565b82815285828487010111156200087a57600080fd5b60005b838110156200089a5785810183015182820184015282016200087d565b83811115620008ac5760008385840101525b5095945050505050565b60008060008060008060008060006101208a8c031215620008d657600080fd5b89516001600160401b0380821115620008ee57600080fd5b620008fc8d838e0162000821565b9a5060208c01519150808211156200091357600080fd5b620009218d838e0162000821565b995060408c01519150808211156200093857600080fd5b620009468d838e0162000821565b985060608c01519150808211156200095d57600080fd5b6200096b8d838e0162000821565b97506200097b60808d016200076d565b96506200098b60a08d016200076d565b95506200099b60c08d016200076d565b9450620009ab60e08d016200076d565b93506101008c0151915080821115620009c357600080fd5b50620009d28c828d016200078a565b9150509295985092959850929598565b604051601f8201601f191681016001600160401b038111828210171562000a0d5762000a0d62000ae8565b604052919050565b6000821982111562000a2b5762000a2b62000abc565b500190565b600060ff821660ff84168060ff0382111562000a505762000a5062000abc565b019392505050565b600181811c9082168062000a6d57607f821691505b6020821081141562000a8f57634e487b7160e01b600052602260045260246000fd5b50919050565b600063ffffffff8083168181141562000ab25762000ab262000abc565b6001019392505050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b61398f8062000b0e6000396000f3fe6080604052600436106103815760003560e01c80635e1e1004116101d1578063c21a43e411610102578063e14ca353116100a0578063f2fde38b1161006f578063f2fde38b14610a5f578063f697f70914610a7f578063f9d5b27b14610a9f578063fb08f3a114610ab457600080fd5b8063e14ca353146109c1578063e2ec6ec3146109d6578063e985e9c5146109f6578063f2c4ce1e14610a3f57600080fd5b8063c884ef83116100dc578063c884ef831461093c578063d547cfb71461096c578063d7eb3f3a14610981578063da3ef23f146109a157600080fd5b8063c21a43e4146108f1578063c668286214610907578063c87b56dd1461091c57600080fd5b80638da5cb5b1161016f5780639f181b5e116101495780639f181b5e14610887578063a22cb4651461089c578063a475b5dd146108bc578063b88d4fde146108d157600080fd5b80638da5cb5b1461082457806395d89b41146108425780639b19251a1461085757600080fd5b80636a61e5fc116101ab5780636a61e5fc146107ba57806370a08231146107da578063715018a6146107fa578063722503801461080f57600080fd5b80635e1e10041461075a578063633423be1461077a5780636352211e1461079a57600080fd5b80632f745c59116102b65780634b94f50e1161025457806354e9758e1161022357806354e9758e146106cb5780635532e94c146106de57806355f804b3146107205780635c975abb1461074057600080fd5b80634b94f50e146106675780634e71d92d1461067c5780634f6ccce71461069157806351830227146106b157600080fd5b80633af32abf116102905780633af32abf146105d45780633ccfd60b1461061257806342842e0e1461061a578063438b63001461063a57600080fd5b80632f745c59146105815780632fa2bca1146105a15780633408e470146105c157600080fd5b806318160ddd1161032357806324953eaa116102fd57806324953eaa146104eb578063272066901461050b5780632c2ab5ea1461052b5780632d0335ab1461054b57600080fd5b806318160ddd1461049757806320379ee5146104b657806323b872dd146104cb57600080fd5b8063081812fc1161035f578063081812fc146103ff578063095ea7b3146104375780630c53c51c146104575780630f7e59701461046a57600080fd5b806301ffc9a71461038657806302329a29146103bb57806306fdde03146103dd575b600080fd5b34801561039257600080fd5b506103a66103a136600461337b565b610ad5565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103db6103d6366004613360565b610b00565b005b3480156103e957600080fd5b506103f2610b65565b6040516103b29190613634565b34801561040b57600080fd5b5061041f61041a3660046133fe565b610bf7565b6040516001600160a01b0390911681526020016103b2565b34801561044357600080fd5b506103db610452366004613258565b610c8c565b6103f26104653660046131e6565b610db4565b34801561047657600080fd5b506103f2604051806040016040528060018152602001603160f81b81525081565b3480156104a357600080fd5b506017545b6040519081526020016103b2565b3480156104c257600080fd5b506001546104a8565b3480156104d757600080fd5b506103db6104e6366004613118565b610f9e565b3480156104f757600080fd5b506103db6105063660046132ac565b610fd6565b34801561051757600080fd5b506103db610526366004613282565b611109565b34801561053757600080fd5b50601a5461041f906001600160a01b031681565b34801561055757600080fd5b506104a86105663660046130ca565b6001600160a01b031660009081526002602052604090205490565b34801561058d57600080fd5b506104a861059c366004613258565b61115c565b3480156105ad57600080fd5b506103db6105bc366004613360565b6111f2565b3480156105cd57600080fd5b50466104a8565b3480156105e057600080fd5b506103a66105ef3660046130ca565b6001600160a01b031660009081526004602052604090205460ff16151560011490565b6103db611293565b34801561062657600080fd5b506103db610635366004613118565b611375565b34801561064657600080fd5b5061065a6106553660046130ca565b611390565b6040516103b291906135f0565b34801561067357600080fd5b506005546104a8565b34801561068857600080fd5b506103db611432565b34801561069d57600080fd5b506104a86106ac3660046133fe565b611507565b3480156106bd57600080fd5b506020546103a69060ff1681565b6103db6106d9366004613417565b61159a565b3480156106ea57600080fd5b5061070e6106f93660046130ca565b600a6020526000908152604090205460ff1681565b60405160ff90911681526020016103b2565b34801561072c57600080fd5b506103db61073b3660046133b5565b611828565b34801561074c57600080fd5b506006546103a69060ff1681565b34801561076657600080fd5b506103db6107753660046130ca565b611884565b34801561078657600080fd5b50601d5461041f906001600160a01b031681565b3480156107a657600080fd5b5061041f6107b53660046133fe565b6118ef565b3480156107c657600080fd5b506103db6107d53660046133fe565b611966565b3480156107e657600080fd5b506104a86107f53660046130ca565b6119b8565b34801561080657600080fd5b506103db611a3f565b34801561081b57600080fd5b506103f2611a94565b34801561083057600080fd5b506003546001600160a01b031661041f565b34801561084e57600080fd5b506103f2611b22565b34801561086357600080fd5b506103a66108723660046130ca565b60046020526000908152604090205460ff1681565b34801561089357600080fd5b506104a8611b31565b3480156108a857600080fd5b506103db6108b73660046131bc565b611b41565b3480156108c857600080fd5b506103db611b53565b3480156108dd57600080fd5b506103db6108ec366004613154565b611bab565b3480156108fd57600080fd5b506104a860075481565b34801561091357600080fd5b506103f2611bea565b34801561092857600080fd5b506103f26109373660046133fe565b611bf7565b34801561094857600080fd5b5061070e6109573660046130ca565b600b6020526000908152604090205460ff1681565b34801561097857600080fd5b506103f2611cb2565b34801561098d57600080fd5b50601b5461041f906001600160a01b031681565b3480156109ad57600080fd5b506103db6109bc3660046133b5565b611cbf565b3480156109cd57600080fd5b506104a8611d1b565b3480156109e257600080fd5b506103db6109f13660046132ac565b611d32565b348015610a0257600080fd5b506103a6610a113660046130e5565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b348015610a4b57600080fd5b506103db610a5a3660046133b5565b611d84565b348015610a6b57600080fd5b506103db610a7a3660046130ca565b611de0565b348015610a8b57600080fd5b50601c5461041f906001600160a01b031681565b348015610aab57600080fd5b506104a8611e97565b348015610ac057600080fd5b506003546103a690600160a01b900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610afa5750610afa82611f06565b92915050565b610b08611f56565b6001600160a01b0316610b236003546001600160a01b031690565b6001600160a01b031614610b525760405162461bcd60e51b8152600401610b4990613699565b60405180910390fd5b6006805460ff1916911515919091179055565b6060600c8054610b74906137e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906137e4565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000818152600e60205260408120546001600160a01b0316610c705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b49565b506000908152601060205260409020546001600160a01b031690565b6000610c97826118ef565b9050806001600160a01b0316836001600160a01b03161415610d055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b49565b806001600160a01b0316610d17611f56565b6001600160a01b03161480610d335750610d3381610a11611f56565b610da55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b49565b610daf8383611f60565b505050565b60408051606081810183526001600160a01b03881660008181526002602090815290859020548452830152918101869052610df28782878787611fce565b610e485760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b49565b6001600160a01b038716600090815260026020526040902054610e6c9060016120be565b6001600160a01b0388166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ebc90899033908a9061357e565b60405180910390a1600080306001600160a01b0316888a604051602001610ee4929190613514565b60408051601f1981840301815290829052610efe916134f8565b6000604051808303816000865af19150503d8060008114610f3b576040519150601f19603f3d011682016040523d82523d6000602084013e610f40565b606091505b509150915081610f925760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b49565b98975050505050505050565b610faf610fa9611f56565b826120d1565b610fcb5760405162461bcd60e51b8152600401610b49906136ce565b610daf8383836121c8565b610fde611f56565b6001600160a01b0316610ff96003546001600160a01b031690565b6001600160a01b03161461101f5760405162461bcd60e51b8152600401610b4990613699565b60005b81518163ffffffff16101561110557600060046000848463ffffffff168151811061104f5761104f6138d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a828263ffffffff16815181106110c7576110c76138d4565b60200260200101516040516110eb91906001600160a01b0391909116815260200190565b60405180910390a1806110fd8161383a565b915050611022565b5050565b611111611f56565b6001600160a01b031661112c6003546001600160a01b031690565b6001600160a01b0316146111525760405162461bcd60e51b8152600401610b4990613699565b6111058282612373565b6000611167836119b8565b82106111c95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b49565b506001600160a01b03919091166000908152601260209081526040808320938352929052205490565b6111fa611f56565b6001600160a01b03166112156003546001600160a01b031690565b6001600160a01b03161461123b5760405162461bcd60e51b8152600401610b4990613699565b60038054821515600160a01b0260ff60a01b199091161790556040517f629c0d2c896395c4c887f21faca97e5aa80b90b3068ead88c9770ed3a98f70279061128890831515815260200190565b60405180910390a150565b61129b611f56565b6001600160a01b03166112b66003546001600160a01b031690565b6001600160a01b0316146112dc5760405162461bcd60e51b8152600401610b4990613699565b601d546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b50509050806113725760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b49565b50565b610daf83838360405180602001604052806000815250611bab565b6060600061139d836119b8565b905060008167ffffffffffffffff8111156113ba576113ba6138ea565b6040519080825280602002602001820160405280156113e3578160200160208202803683370190505b50905060005b8281101561142a576113fb858261115c565b82828151811061140d5761140d6138d4565b6020908102919091010152806114228161381f565b9150506113e9565b509392505050565b60065460ff16156114855760405162461bcd60e51b815260206004820181905260248201527f54696b693a20436c61696d20686173206e6f742073746172746564207965742e6044820152606401610b49565b336000908152600a60205260409020546114a19060ff166123d4565b336000908152600a6020908152604080832054600b9092528220805460ff9283169391926114d191859116613768565b825460ff9182166101009390930a928302919092021990911617905550336000908152600a60205260409020805460ff19169055565b600061151260145490565b82106115755760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b49565b60148281548110611588576115886138d4565b90600052602060002001549050919050565b600354600160a01b900460ff1615156001141561161c573360009081526004602052604090205460ff1661161c5760405162461bcd60e51b815260206004820152602360248201527f416c6572743a20596f75277265206e6f74206f6e207468652077686974656c6960448201526239ba1760e91b6064820152608401610b49565b60065460ff161561167a5760405162461bcd60e51b815260206004820152602260248201527f416c6572743a20506c6564676520686173206e6f7420737461727465642079656044820152613a1760f11b6064820152608401610b49565b600954336000908152600b6020908152604080832054600a9092529091205460ff918216916116aa911684613768565b6116b49190613768565b60ff16111561172b5760405162461bcd60e51b815260206004820152603b60248201527f416c6572743a204561636820616464726573732063616e206f6e6c792070757260448201527f636861736520757020746f203520636f6c6c65637469626c65732e00000000006064820152608401610b49565b60075460085461173b91906137a1565b8160ff1660075461174c9190613750565b11156117b15760405162461bcd60e51b815260206004820152602e60248201527f416c6572743a20536f7272792c20616c6c20636f6c6c65637469626c6573206860448201526d30bb32903132b2b71039b7b6321760911b6064820152608401610b49565b60055434101561181e5760405162461bcd60e51b815260206004820152603260248201527f416c6572743a20596f75206e65656420746f20706179206174206c65617374206044820152713a3432903932b8bab4b932b21031b7b9ba1760711b6064820152608401610b49565b6113723382612373565b611830611f56565b6001600160a01b031661184b6003546001600160a01b031690565b6001600160a01b0316146118715760405162461bcd60e51b8152600401610b4990613699565b805161110590601e906020840190612f7c565b61188c611f56565b6001600160a01b03166118a76003546001600160a01b031690565b6001600160a01b0316146118cd5760405162461bcd60e51b8152600401610b4990613699565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600e60205260408120546001600160a01b031680610afa5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b49565b61196e611f56565b6001600160a01b03166119896003546001600160a01b031690565b6001600160a01b0316146119af5760405162461bcd60e51b8152600401610b4990613699565b61137281612408565b60006001600160a01b038216611a235760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b49565b506001600160a01b03166000908152600f602052604090205490565b611a47611f56565b6001600160a01b0316611a626003546001600160a01b031690565b6001600160a01b031614611a885760405162461bcd60e51b8152600401610b4990613699565b611a926000612456565b565b60218054611aa1906137e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611acd906137e4565b8015611b1a5780601f10611aef57610100808354040283529160200191611b1a565b820191906000526020600020905b815481529060010190602001808311611afd57829003601f168201915b505050505081565b6060600d8054610b74906137e4565b6000611b3c60165490565b905090565b611105611b4c611f56565b83836124a8565b611b5b611f56565b6001600160a01b0316611b766003546001600160a01b031690565b6001600160a01b031614611b9c5760405162461bcd60e51b8152600401610b4990613699565b6020805460ff19166001179055565b611bbc611bb6611f56565b836120d1565b611bd85760405162461bcd60e51b8152600401610b49906136ce565b611be484848484612577565b50505050565b601f8054611aa1906137e4565b6000818152600e60205260409020546060906001600160a01b0316611c685760405162461bcd60e51b815260206004820152602160248201527f416c6572743a205468697320746f6b656e20646f6573206e6f742065786973746044820152602160f81b6064820152608401610b49565b60205460ff16611ca7576021611c7d836125aa565b601f604051602001611c919392919061354b565b6040516020818303038152906040529050919050565b601e611c7d836125aa565b601e8054611aa1906137e4565b611cc7611f56565b6001600160a01b0316611ce26003546001600160a01b031690565b6001600160a01b031614611d085760405162461bcd60e51b8152600401610b4990613699565b805161110590601f906020840190612f7c565b6000611d25611b31565b601754611b3c91906137a1565b611d3a611f56565b6001600160a01b0316611d556003546001600160a01b031690565b6001600160a01b031614611d7b5760405162461bcd60e51b8152600401610b4990613699565b611372816126a8565b611d8c611f56565b6001600160a01b0316611da76003546001600160a01b031690565b6001600160a01b031614611dcd5760405162461bcd60e51b8152600401610b4990613699565b8051611105906021906020840190612f7c565b611de8611f56565b6001600160a01b0316611e036003546001600160a01b031690565b6001600160a01b031614611e295760405162461bcd60e51b8152600401610b4990613699565b6001600160a01b038116611e8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b61137281612456565b6000600754600854611b3c91906137a1565b600033301415611f0057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611f039050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611f3757506001600160e01b03198216635b5e139f60e01b145b80610afa57506301ffc9a760e01b6001600160e01b0319831614610afa565b6000611b3c611ea9565b600081815260106020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f95826118ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166120345760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b49565b6001612047612042876127d7565b612854565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612095573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120ca8284613750565b9392505050565b6000818152600e60205260408120546001600160a01b031661214a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b49565b6000612155836118ef565b9050806001600160a01b0316846001600160a01b031614806121905750836001600160a01b031661218584610bf7565b6001600160a01b0316145b806121c057506001600160a01b0380821660009081526011602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121db826118ef565b6001600160a01b0316146122435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b49565b6001600160a01b0382166122a55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b49565b6122b0838383612884565b6122bb600082611f60565b6001600160a01b0383166000908152600f602052604081208054600192906122e49084906137a1565b90915550506001600160a01b0382166000908152600f60205260408120805460019290612312908490613750565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600a60205260408120805483929061239e90849060ff16613768565b92506101000a81548160ff021916908360ff1602179055508060ff16600760008282546123cb9190613750565b90915550505050565b60005b8160ff168160ff161015611105576123f6336123f161293c565b612acf565b806124008161385e565b9150506123d7565b612410611f56565b6001600160a01b031661242b6003546001600160a01b031690565b6001600160a01b0316146124515760405162461bcd60e51b8152600401610b4990613699565b600555565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561250a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b49565b6001600160a01b03838116600081815260116020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125828484846121c8565b61258e84848484612ae9565b611be45760405162461bcd60e51b8152600401610b4990613647565b6060816125ce5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125f857806125e28161381f565b91506125f19050600a8361378d565b91506125d2565b60008167ffffffffffffffff811115612613576126136138ea565b6040519080825280601f01601f19166020018201604052801561263d576020820181803683370190505b5090505b84156121c0576126526001836137a1565b915061265f600a8661387e565b61266a906030613750565b60f81b81838151811061267f5761267f6138d4565b60200101906001600160f81b031916908160001a9053506126a1600a8661378d565b9450612641565b6126b0611f56565b6001600160a01b03166126cb6003546001600160a01b031690565b6001600160a01b0316146126f15760405162461bcd60e51b8152600401610b4990613699565b60005b81518163ffffffff16101561110557600160046000848463ffffffff1681518110612721576127216138d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f828263ffffffff1681518110612799576127996138d4565b60200260200101516040516127bd91906001600160a01b0391909116815260200190565b60405180910390a1806127cf8161383a565b9150506126f4565b60006040518060800160405280604381526020016139176043913980516020918201208351848301516040808701518051908601209051612837950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061285f60015490565b60405161190160f01b6020820152602281019190915260428101839052606201612837565b6001600160a01b0383166128df576128da81601480546000838152601560205260408120829055600182018355919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0155565b612902565b816001600160a01b0316836001600160a01b031614612902576129028382612bfd565b6001600160a01b03821661291957610daf81612c9a565b826001600160a01b0316826001600160a01b031614610daf57610daf8282612d49565b600080612947611d1b565b1161298f5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610b49565b6000612999611b31565b6017546129a691906137a1565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c612a0d919061387e565b60008181526018602052604081205491925090612a2b575080612a3c565b506000818152601860205260409020545b60186000612a4b6001866137a1565b81526020019081526020016000205460001415612a8157612a6d6001846137a1565b600083815260186020526040902055612ab1565b60186000612a906001866137a1565b81526020808201929092526040908101600090812054858252601890935220555b612ab9612d8d565b50601954612ac79082613750565b935050505090565b611105828260405180602001604052806000815250612dfb565b60006001600160a01b0384163b15612bf257836001600160a01b031663150b7a02612b12611f56565b8786866040518563ffffffff1660e01b8152600401612b3494939291906135b3565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7e575060408051601f3d908101601f19168201909252612b7b91810190613398565b60015b612bd8573d808015612bac576040519150601f19603f3d011682016040523d82523d6000602084013e612bb1565b606091505b508051612bd05760405162461bcd60e51b8152600401610b4990613647565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121c0565b506001949350505050565b60006001612c0a846119b8565b612c1491906137a1565b600083815260136020526040902054909150808214612c67576001600160a01b03841660009081526012602090815260408083208584528252808320548484528184208190558352601390915290208190555b5060009182526013602090815260408084208490556001600160a01b039094168352601281528383209183525290812055565b601454600090612cac906001906137a1565b60008381526015602052604081205460148054939450909284908110612cd457612cd46138d4565b906000526020600020015490508060148381548110612cf557612cf56138d4565b6000918252602080832090910192909255828152601590915260408082208490558582528120556014805480612d2d57612d2d6138be565b6001900381819060005260206000200160009055905550505050565b6000612d54836119b8565b6001600160a01b039093166000908152601260209081526040808320868452825280832085905593825260139052919091209190915550565b600080612d98611d1b565b11612de05760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610b49565b6000612deb60165490565b9050611b3c601680546001019055565b612e058383612e2e565b612e126000848484612ae9565b610daf5760405162461bcd60e51b8152600401610b4990613647565b6001600160a01b038216612e845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b49565b6000818152600e60205260409020546001600160a01b031615612ee95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b49565b612ef560008383612884565b6001600160a01b0382166000908152600f60205260408120805460019290612f1e908490613750565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f88906137e4565b90600052602060002090601f016020900481019282612faa5760008555612ff0565b82601f10612fc357805160ff1916838001178555612ff0565b82800160010185558215612ff0579182015b82811115612ff0578251825591602001919060010190612fd5565b50612ffc929150613000565b5090565b5b80821115612ffc5760008155600101613001565b600067ffffffffffffffff83111561302f5761302f6138ea565b613042601f8401601f191660200161371f565b905082815283838301111561305657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461308457600080fd5b919050565b8035801515811461308457600080fd5b600082601f8301126130aa57600080fd5b6120ca83833560208501613015565b803560ff8116811461308457600080fd5b6000602082840312156130dc57600080fd5b6120ca8261306d565b600080604083850312156130f857600080fd5b6131018361306d565b915061310f6020840161306d565b90509250929050565b60008060006060848603121561312d57600080fd5b6131368461306d565b92506131446020850161306d565b9150604084013590509250925092565b6000806000806080858703121561316a57600080fd5b6131738561306d565b93506131816020860161306d565b925060408501359150606085013567ffffffffffffffff8111156131a457600080fd5b6131b087828801613099565b91505092959194509250565b600080604083850312156131cf57600080fd5b6131d88361306d565b915061310f60208401613089565b600080600080600060a086880312156131fe57600080fd5b6132078661306d565b9450602086013567ffffffffffffffff81111561322357600080fd5b61322f88828901613099565b945050604086013592506060860135915061324c608087016130b9565b90509295509295909350565b6000806040838503121561326b57600080fd5b6132748361306d565b946020939093013593505050565b6000806040838503121561329557600080fd5b61329e8361306d565b915061310f602084016130b9565b600060208083850312156132bf57600080fd5b823567ffffffffffffffff808211156132d757600080fd5b818501915085601f8301126132eb57600080fd5b8135818111156132fd576132fd6138ea565b8060051b915061330e84830161371f565b8181528481019084860184860187018a101561332957600080fd5b600095505b838610156133535761333f8161306d565b83526001959095019491860191860161332e565b5098975050505050505050565b60006020828403121561337257600080fd5b6120ca82613089565b60006020828403121561338d57600080fd5b81356120ca81613900565b6000602082840312156133aa57600080fd5b81516120ca81613900565b6000602082840312156133c757600080fd5b813567ffffffffffffffff8111156133de57600080fd5b8201601f810184136133ef57600080fd5b6121c084823560208401613015565b60006020828403121561341057600080fd5b5035919050565b60006020828403121561342957600080fd5b6120ca826130b9565b6000815180845261344a8160208601602086016137b8565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061347857607f831692505b602080841082141561349a57634e487b7160e01b600052602260045260246000fd5b8180156134ae57600181146134bf576134ec565b60ff198616895284890196506134ec565b60008881526020902060005b868110156134e45781548b8201529085019083016134cb565b505084890196505b50505050505092915050565b6000825161350a8184602087016137b8565b9190910192915050565b600083516135268184602088016137b8565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6000613557828661345e565b84516135678183602089016137b8565b6135738183018661345e565b979650505050505050565b6001600160a01b038481168252831660208201526060604082018190526000906135aa90830184613432565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135e690830184613432565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156136285783518352928401929184019160010161360c565b50909695505050505050565b6020815260006120ca6020830184613432565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613748576137486138ea565b604052919050565b6000821982111561376357613763613892565b500190565b600060ff821660ff84168060ff0382111561378557613785613892565b019392505050565b60008261379c5761379c6138a8565b500490565b6000828210156137b3576137b3613892565b500390565b60005b838110156137d35781810151838201526020016137bb565b83811115611be45750506000910152565b600181811c908216806137f857607f821691505b6020821081141561381957634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561383357613833613892565b5060010190565b600063ffffffff8083168181141561385457613854613892565b6001019392505050565b600060ff821660ff81141561387557613875613892565b60010192915050565b60008261388d5761388d6138a8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137257600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212202ed907315e48c49ccbcdcae5757e24760d7ef73b1aac7d8cf4f329e5ae76fa6364736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c74294f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65720000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef00000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb0000000000000000000000004156eddf92dadf23ed78c0f51f133d789b4d35fe0000000000000000000000005d4bc6ea2e35d22e65dfcb09679bad08e8c2a71d0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000001232526963682049736c616e642054696b69730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432524954000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6344327a335569456d62576873654538616439665855787a756a436f5932516732685676646f726e34644a512f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53626644504a755a59536f69734d76365a66696e55324745514453414d68525773673861444654367251586b2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef00000000000000000000000009e51b29fd0a7156a661766eb242933f723bdaa5100000000000000000000000092adf854f8e105c2c1c97a3cbb0a05037d973cd300000000000000000000000003f1afcfd7828d88957c4d5c3313b2d3e405f40c000000000000000000000000d0bf2d93aa166b67deb1a7cf9650d008c4a75dcc0000000000000000000000007f7dca6cfae1a104cc0a93546fb430989134a04a0000000000000000000000006ea878f2b2a2f8994a3f2225ea8b546eaa2add7f000000000000000000000000ae1718f88e94f07332f67f39fd7b15986a0d9434000000000000000000000000524a52ecd26471b374804c803e20873ea8f06ae0000000000000000000000000971998c07c8fc63645a9a247318fc9e47789d2170000000000000000000000000d5067899b9124937c82b8ab799d663d84d7e9a70000000000000000000000001dd157c0372c6646bd3ac94353db9e0df9d7877800000000000000000000000073743f68e70ebd463ba70ac8e924f18a2c19512e0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef0000000000000000000000000c33ecb0c656e43bf33a92a4559b2eccca13d3a78000000000000000000000000b1beee81280512b4ca67b4d53664dc1253fd3d7b0000000000000000000000006071e73bc356135d4aac960832b27e00f5721b050000000000000000000000007cf29f382d4868b098d0bf714c1944355856132700000000000000000000000018f77b84c6bf07f5743cfbfc2f1759acc7d7f412

Deployed Bytecode

0x6080604052600436106103815760003560e01c80635e1e1004116101d1578063c21a43e411610102578063e14ca353116100a0578063f2fde38b1161006f578063f2fde38b14610a5f578063f697f70914610a7f578063f9d5b27b14610a9f578063fb08f3a114610ab457600080fd5b8063e14ca353146109c1578063e2ec6ec3146109d6578063e985e9c5146109f6578063f2c4ce1e14610a3f57600080fd5b8063c884ef83116100dc578063c884ef831461093c578063d547cfb71461096c578063d7eb3f3a14610981578063da3ef23f146109a157600080fd5b8063c21a43e4146108f1578063c668286214610907578063c87b56dd1461091c57600080fd5b80638da5cb5b1161016f5780639f181b5e116101495780639f181b5e14610887578063a22cb4651461089c578063a475b5dd146108bc578063b88d4fde146108d157600080fd5b80638da5cb5b1461082457806395d89b41146108425780639b19251a1461085757600080fd5b80636a61e5fc116101ab5780636a61e5fc146107ba57806370a08231146107da578063715018a6146107fa578063722503801461080f57600080fd5b80635e1e10041461075a578063633423be1461077a5780636352211e1461079a57600080fd5b80632f745c59116102b65780634b94f50e1161025457806354e9758e1161022357806354e9758e146106cb5780635532e94c146106de57806355f804b3146107205780635c975abb1461074057600080fd5b80634b94f50e146106675780634e71d92d1461067c5780634f6ccce71461069157806351830227146106b157600080fd5b80633af32abf116102905780633af32abf146105d45780633ccfd60b1461061257806342842e0e1461061a578063438b63001461063a57600080fd5b80632f745c59146105815780632fa2bca1146105a15780633408e470146105c157600080fd5b806318160ddd1161032357806324953eaa116102fd57806324953eaa146104eb578063272066901461050b5780632c2ab5ea1461052b5780632d0335ab1461054b57600080fd5b806318160ddd1461049757806320379ee5146104b657806323b872dd146104cb57600080fd5b8063081812fc1161035f578063081812fc146103ff578063095ea7b3146104375780630c53c51c146104575780630f7e59701461046a57600080fd5b806301ffc9a71461038657806302329a29146103bb57806306fdde03146103dd575b600080fd5b34801561039257600080fd5b506103a66103a136600461337b565b610ad5565b60405190151581526020015b60405180910390f35b3480156103c757600080fd5b506103db6103d6366004613360565b610b00565b005b3480156103e957600080fd5b506103f2610b65565b6040516103b29190613634565b34801561040b57600080fd5b5061041f61041a3660046133fe565b610bf7565b6040516001600160a01b0390911681526020016103b2565b34801561044357600080fd5b506103db610452366004613258565b610c8c565b6103f26104653660046131e6565b610db4565b34801561047657600080fd5b506103f2604051806040016040528060018152602001603160f81b81525081565b3480156104a357600080fd5b506017545b6040519081526020016103b2565b3480156104c257600080fd5b506001546104a8565b3480156104d757600080fd5b506103db6104e6366004613118565b610f9e565b3480156104f757600080fd5b506103db6105063660046132ac565b610fd6565b34801561051757600080fd5b506103db610526366004613282565b611109565b34801561053757600080fd5b50601a5461041f906001600160a01b031681565b34801561055757600080fd5b506104a86105663660046130ca565b6001600160a01b031660009081526002602052604090205490565b34801561058d57600080fd5b506104a861059c366004613258565b61115c565b3480156105ad57600080fd5b506103db6105bc366004613360565b6111f2565b3480156105cd57600080fd5b50466104a8565b3480156105e057600080fd5b506103a66105ef3660046130ca565b6001600160a01b031660009081526004602052604090205460ff16151560011490565b6103db611293565b34801561062657600080fd5b506103db610635366004613118565b611375565b34801561064657600080fd5b5061065a6106553660046130ca565b611390565b6040516103b291906135f0565b34801561067357600080fd5b506005546104a8565b34801561068857600080fd5b506103db611432565b34801561069d57600080fd5b506104a86106ac3660046133fe565b611507565b3480156106bd57600080fd5b506020546103a69060ff1681565b6103db6106d9366004613417565b61159a565b3480156106ea57600080fd5b5061070e6106f93660046130ca565b600a6020526000908152604090205460ff1681565b60405160ff90911681526020016103b2565b34801561072c57600080fd5b506103db61073b3660046133b5565b611828565b34801561074c57600080fd5b506006546103a69060ff1681565b34801561076657600080fd5b506103db6107753660046130ca565b611884565b34801561078657600080fd5b50601d5461041f906001600160a01b031681565b3480156107a657600080fd5b5061041f6107b53660046133fe565b6118ef565b3480156107c657600080fd5b506103db6107d53660046133fe565b611966565b3480156107e657600080fd5b506104a86107f53660046130ca565b6119b8565b34801561080657600080fd5b506103db611a3f565b34801561081b57600080fd5b506103f2611a94565b34801561083057600080fd5b506003546001600160a01b031661041f565b34801561084e57600080fd5b506103f2611b22565b34801561086357600080fd5b506103a66108723660046130ca565b60046020526000908152604090205460ff1681565b34801561089357600080fd5b506104a8611b31565b3480156108a857600080fd5b506103db6108b73660046131bc565b611b41565b3480156108c857600080fd5b506103db611b53565b3480156108dd57600080fd5b506103db6108ec366004613154565b611bab565b3480156108fd57600080fd5b506104a860075481565b34801561091357600080fd5b506103f2611bea565b34801561092857600080fd5b506103f26109373660046133fe565b611bf7565b34801561094857600080fd5b5061070e6109573660046130ca565b600b6020526000908152604090205460ff1681565b34801561097857600080fd5b506103f2611cb2565b34801561098d57600080fd5b50601b5461041f906001600160a01b031681565b3480156109ad57600080fd5b506103db6109bc3660046133b5565b611cbf565b3480156109cd57600080fd5b506104a8611d1b565b3480156109e257600080fd5b506103db6109f13660046132ac565b611d32565b348015610a0257600080fd5b506103a6610a113660046130e5565b6001600160a01b03918216600090815260116020908152604080832093909416825291909152205460ff1690565b348015610a4b57600080fd5b506103db610a5a3660046133b5565b611d84565b348015610a6b57600080fd5b506103db610a7a3660046130ca565b611de0565b348015610a8b57600080fd5b50601c5461041f906001600160a01b031681565b348015610aab57600080fd5b506104a8611e97565b348015610ac057600080fd5b506003546103a690600160a01b900460ff1681565b60006001600160e01b0319821663780e9d6360e01b1480610afa5750610afa82611f06565b92915050565b610b08611f56565b6001600160a01b0316610b236003546001600160a01b031690565b6001600160a01b031614610b525760405162461bcd60e51b8152600401610b4990613699565b60405180910390fd5b6006805460ff1916911515919091179055565b6060600c8054610b74906137e4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ba0906137e4565b8015610bed5780601f10610bc257610100808354040283529160200191610bed565b820191906000526020600020905b815481529060010190602001808311610bd057829003601f168201915b5050505050905090565b6000818152600e60205260408120546001600160a01b0316610c705760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b49565b506000908152601060205260409020546001600160a01b031690565b6000610c97826118ef565b9050806001600160a01b0316836001600160a01b03161415610d055760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b49565b806001600160a01b0316610d17611f56565b6001600160a01b03161480610d335750610d3381610a11611f56565b610da55760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b49565b610daf8383611f60565b505050565b60408051606081810183526001600160a01b03881660008181526002602090815290859020548452830152918101869052610df28782878787611fce565b610e485760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b6064820152608401610b49565b6001600160a01b038716600090815260026020526040902054610e6c9060016120be565b6001600160a01b0388166000908152600260205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610ebc90899033908a9061357e565b60405180910390a1600080306001600160a01b0316888a604051602001610ee4929190613514565b60408051601f1981840301815290829052610efe916134f8565b6000604051808303816000865af19150503d8060008114610f3b576040519150601f19603f3d011682016040523d82523d6000602084013e610f40565b606091505b509150915081610f925760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c000000006044820152606401610b49565b98975050505050505050565b610faf610fa9611f56565b826120d1565b610fcb5760405162461bcd60e51b8152600401610b49906136ce565b610daf8383836121c8565b610fde611f56565b6001600160a01b0316610ff96003546001600160a01b031690565b6001600160a01b03161461101f5760405162461bcd60e51b8152600401610b4990613699565b60005b81518163ffffffff16101561110557600060046000848463ffffffff168151811061104f5761104f6138d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a828263ffffffff16815181106110c7576110c76138d4565b60200260200101516040516110eb91906001600160a01b0391909116815260200190565b60405180910390a1806110fd8161383a565b915050611022565b5050565b611111611f56565b6001600160a01b031661112c6003546001600160a01b031690565b6001600160a01b0316146111525760405162461bcd60e51b8152600401610b4990613699565b6111058282612373565b6000611167836119b8565b82106111c95760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b49565b506001600160a01b03919091166000908152601260209081526040808320938352929052205490565b6111fa611f56565b6001600160a01b03166112156003546001600160a01b031690565b6001600160a01b03161461123b5760405162461bcd60e51b8152600401610b4990613699565b60038054821515600160a01b0260ff60a01b199091161790556040517f629c0d2c896395c4c887f21faca97e5aa80b90b3068ead88c9770ed3a98f70279061128890831515815260200190565b60405180910390a150565b61129b611f56565b6001600160a01b03166112b66003546001600160a01b031690565b6001600160a01b0316146112dc5760405162461bcd60e51b8152600401610b4990613699565b601d546040516000916001600160a01b03169047908381818185875af1925050503d8060008114611329576040519150601f19603f3d011682016040523d82523d6000602084013e61132e565b606091505b50509050806113725760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b6044820152606401610b49565b50565b610daf83838360405180602001604052806000815250611bab565b6060600061139d836119b8565b905060008167ffffffffffffffff8111156113ba576113ba6138ea565b6040519080825280602002602001820160405280156113e3578160200160208202803683370190505b50905060005b8281101561142a576113fb858261115c565b82828151811061140d5761140d6138d4565b6020908102919091010152806114228161381f565b9150506113e9565b509392505050565b60065460ff16156114855760405162461bcd60e51b815260206004820181905260248201527f54696b693a20436c61696d20686173206e6f742073746172746564207965742e6044820152606401610b49565b336000908152600a60205260409020546114a19060ff166123d4565b336000908152600a6020908152604080832054600b9092528220805460ff9283169391926114d191859116613768565b825460ff9182166101009390930a928302919092021990911617905550336000908152600a60205260409020805460ff19169055565b600061151260145490565b82106115755760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b49565b60148281548110611588576115886138d4565b90600052602060002001549050919050565b600354600160a01b900460ff1615156001141561161c573360009081526004602052604090205460ff1661161c5760405162461bcd60e51b815260206004820152602360248201527f416c6572743a20596f75277265206e6f74206f6e207468652077686974656c6960448201526239ba1760e91b6064820152608401610b49565b60065460ff161561167a5760405162461bcd60e51b815260206004820152602260248201527f416c6572743a20506c6564676520686173206e6f7420737461727465642079656044820152613a1760f11b6064820152608401610b49565b600954336000908152600b6020908152604080832054600a9092529091205460ff918216916116aa911684613768565b6116b49190613768565b60ff16111561172b5760405162461bcd60e51b815260206004820152603b60248201527f416c6572743a204561636820616464726573732063616e206f6e6c792070757260448201527f636861736520757020746f203520636f6c6c65637469626c65732e00000000006064820152608401610b49565b60075460085461173b91906137a1565b8160ff1660075461174c9190613750565b11156117b15760405162461bcd60e51b815260206004820152602e60248201527f416c6572743a20536f7272792c20616c6c20636f6c6c65637469626c6573206860448201526d30bb32903132b2b71039b7b6321760911b6064820152608401610b49565b60055434101561181e5760405162461bcd60e51b815260206004820152603260248201527f416c6572743a20596f75206e65656420746f20706179206174206c65617374206044820152713a3432903932b8bab4b932b21031b7b9ba1760711b6064820152608401610b49565b6113723382612373565b611830611f56565b6001600160a01b031661184b6003546001600160a01b031690565b6001600160a01b0316146118715760405162461bcd60e51b8152600401610b4990613699565b805161110590601e906020840190612f7c565b61188c611f56565b6001600160a01b03166118a76003546001600160a01b031690565b6001600160a01b0316146118cd5760405162461bcd60e51b8152600401610b4990613699565b601d80546001600160a01b0319166001600160a01b0392909216919091179055565b6000818152600e60205260408120546001600160a01b031680610afa5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b49565b61196e611f56565b6001600160a01b03166119896003546001600160a01b031690565b6001600160a01b0316146119af5760405162461bcd60e51b8152600401610b4990613699565b61137281612408565b60006001600160a01b038216611a235760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b49565b506001600160a01b03166000908152600f602052604090205490565b611a47611f56565b6001600160a01b0316611a626003546001600160a01b031690565b6001600160a01b031614611a885760405162461bcd60e51b8152600401610b4990613699565b611a926000612456565b565b60218054611aa1906137e4565b80601f0160208091040260200160405190810160405280929190818152602001828054611acd906137e4565b8015611b1a5780601f10611aef57610100808354040283529160200191611b1a565b820191906000526020600020905b815481529060010190602001808311611afd57829003601f168201915b505050505081565b6060600d8054610b74906137e4565b6000611b3c60165490565b905090565b611105611b4c611f56565b83836124a8565b611b5b611f56565b6001600160a01b0316611b766003546001600160a01b031690565b6001600160a01b031614611b9c5760405162461bcd60e51b8152600401610b4990613699565b6020805460ff19166001179055565b611bbc611bb6611f56565b836120d1565b611bd85760405162461bcd60e51b8152600401610b49906136ce565b611be484848484612577565b50505050565b601f8054611aa1906137e4565b6000818152600e60205260409020546060906001600160a01b0316611c685760405162461bcd60e51b815260206004820152602160248201527f416c6572743a205468697320746f6b656e20646f6573206e6f742065786973746044820152602160f81b6064820152608401610b49565b60205460ff16611ca7576021611c7d836125aa565b601f604051602001611c919392919061354b565b6040516020818303038152906040529050919050565b601e611c7d836125aa565b601e8054611aa1906137e4565b611cc7611f56565b6001600160a01b0316611ce26003546001600160a01b031690565b6001600160a01b031614611d085760405162461bcd60e51b8152600401610b4990613699565b805161110590601f906020840190612f7c565b6000611d25611b31565b601754611b3c91906137a1565b611d3a611f56565b6001600160a01b0316611d556003546001600160a01b031690565b6001600160a01b031614611d7b5760405162461bcd60e51b8152600401610b4990613699565b611372816126a8565b611d8c611f56565b6001600160a01b0316611da76003546001600160a01b031690565b6001600160a01b031614611dcd5760405162461bcd60e51b8152600401610b4990613699565b8051611105906021906020840190612f7c565b611de8611f56565b6001600160a01b0316611e036003546001600160a01b031690565b6001600160a01b031614611e295760405162461bcd60e51b8152600401610b4990613699565b6001600160a01b038116611e8e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b49565b61137281612456565b6000600754600854611b3c91906137a1565b600033301415611f0057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611f039050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611f3757506001600160e01b03198216635b5e139f60e01b145b80610afa57506301ffc9a760e01b6001600160e01b0319831614610afa565b6000611b3c611ea9565b600081815260106020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f95826118ef565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b0386166120345760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b6064820152608401610b49565b6001612047612042876127d7565b612854565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612095573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b60006120ca8284613750565b9392505050565b6000818152600e60205260408120546001600160a01b031661214a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b49565b6000612155836118ef565b9050806001600160a01b0316846001600160a01b031614806121905750836001600160a01b031661218584610bf7565b6001600160a01b0316145b806121c057506001600160a01b0380821660009081526011602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166121db826118ef565b6001600160a01b0316146122435760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b49565b6001600160a01b0382166122a55760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b49565b6122b0838383612884565b6122bb600082611f60565b6001600160a01b0383166000908152600f602052604081208054600192906122e49084906137a1565b90915550506001600160a01b0382166000908152600f60205260408120805460019290612312908490613750565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6001600160a01b0382166000908152600a60205260408120805483929061239e90849060ff16613768565b92506101000a81548160ff021916908360ff1602179055508060ff16600760008282546123cb9190613750565b90915550505050565b60005b8160ff168160ff161015611105576123f6336123f161293c565b612acf565b806124008161385e565b9150506123d7565b612410611f56565b6001600160a01b031661242b6003546001600160a01b031690565b6001600160a01b0316146124515760405162461bcd60e51b8152600401610b4990613699565b600555565b600380546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b0316141561250a5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b49565b6001600160a01b03838116600081815260116020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6125828484846121c8565b61258e84848484612ae9565b611be45760405162461bcd60e51b8152600401610b4990613647565b6060816125ce5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156125f857806125e28161381f565b91506125f19050600a8361378d565b91506125d2565b60008167ffffffffffffffff811115612613576126136138ea565b6040519080825280601f01601f19166020018201604052801561263d576020820181803683370190505b5090505b84156121c0576126526001836137a1565b915061265f600a8661387e565b61266a906030613750565b60f81b81838151811061267f5761267f6138d4565b60200101906001600160f81b031916908160001a9053506126a1600a8661378d565b9450612641565b6126b0611f56565b6001600160a01b03166126cb6003546001600160a01b031690565b6001600160a01b0316146126f15760405162461bcd60e51b8152600401610b4990613699565b60005b81518163ffffffff16101561110557600160046000848463ffffffff1681518110612721576127216138d4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507fd1bba68c128cc3f427e5831b3c6f99f480b6efa6b9e80c757768f6124158cc3f828263ffffffff1681518110612799576127996138d4565b60200260200101516040516127bd91906001600160a01b0391909116815260200190565b60405180910390a1806127cf8161383a565b9150506126f4565b60006040518060800160405280604381526020016139176043913980516020918201208351848301516040808701518051908601209051612837950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b600061285f60015490565b60405161190160f01b6020820152602281019190915260428101839052606201612837565b6001600160a01b0383166128df576128da81601480546000838152601560205260408120829055600182018355919091527fce6d7b5282bd9a3661ae061feed1dbda4e52ab073b1f9285be6e155d9c38d4ec0155565b612902565b816001600160a01b0316836001600160a01b031614612902576129028382612bfd565b6001600160a01b03821661291957610daf81612c9a565b826001600160a01b0316826001600160a01b031614610daf57610daf8282612d49565b600080612947611d1b565b1161298f5760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610b49565b6000612999611b31565b6017546129a691906137a1565b6040516bffffffffffffffffffffffff1933606090811b8216602084015241901b166034820152446048820152456068820152426088820152909150600090829060a8016040516020818303038152906040528051906020012060001c612a0d919061387e565b60008181526018602052604081205491925090612a2b575080612a3c565b506000818152601860205260409020545b60186000612a4b6001866137a1565b81526020019081526020016000205460001415612a8157612a6d6001846137a1565b600083815260186020526040902055612ab1565b60186000612a906001866137a1565b81526020808201929092526040908101600090812054858252601890935220555b612ab9612d8d565b50601954612ac79082613750565b935050505090565b611105828260405180602001604052806000815250612dfb565b60006001600160a01b0384163b15612bf257836001600160a01b031663150b7a02612b12611f56565b8786866040518563ffffffff1660e01b8152600401612b3494939291906135b3565b602060405180830381600087803b158015612b4e57600080fd5b505af1925050508015612b7e575060408051601f3d908101601f19168201909252612b7b91810190613398565b60015b612bd8573d808015612bac576040519150601f19603f3d011682016040523d82523d6000602084013e612bb1565b606091505b508051612bd05760405162461bcd60e51b8152600401610b4990613647565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506121c0565b506001949350505050565b60006001612c0a846119b8565b612c1491906137a1565b600083815260136020526040902054909150808214612c67576001600160a01b03841660009081526012602090815260408083208584528252808320548484528184208190558352601390915290208190555b5060009182526013602090815260408084208490556001600160a01b039094168352601281528383209183525290812055565b601454600090612cac906001906137a1565b60008381526015602052604081205460148054939450909284908110612cd457612cd46138d4565b906000526020600020015490508060148381548110612cf557612cf56138d4565b6000918252602080832090910192909255828152601590915260408082208490558582528120556014805480612d2d57612d2d6138be565b6001900381819060005260206000200160009055905550505050565b6000612d54836119b8565b6001600160a01b039093166000908152601260209081526040808320868452825280832085905593825260139052919091209190915550565b600080612d98611d1b565b11612de05760405162461bcd60e51b81526020600482015260186024820152774e6f206d6f726520746f6b656e7320617661696c61626c6560401b6044820152606401610b49565b6000612deb60165490565b9050611b3c601680546001019055565b612e058383612e2e565b612e126000848484612ae9565b610daf5760405162461bcd60e51b8152600401610b4990613647565b6001600160a01b038216612e845760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b49565b6000818152600e60205260409020546001600160a01b031615612ee95760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b49565b612ef560008383612884565b6001600160a01b0382166000908152600f60205260408120805460019290612f1e908490613750565b90915550506000818152600e602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612f88906137e4565b90600052602060002090601f016020900481019282612faa5760008555612ff0565b82601f10612fc357805160ff1916838001178555612ff0565b82800160010185558215612ff0579182015b82811115612ff0578251825591602001919060010190612fd5565b50612ffc929150613000565b5090565b5b80821115612ffc5760008155600101613001565b600067ffffffffffffffff83111561302f5761302f6138ea565b613042601f8401601f191660200161371f565b905082815283838301111561305657600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b038116811461308457600080fd5b919050565b8035801515811461308457600080fd5b600082601f8301126130aa57600080fd5b6120ca83833560208501613015565b803560ff8116811461308457600080fd5b6000602082840312156130dc57600080fd5b6120ca8261306d565b600080604083850312156130f857600080fd5b6131018361306d565b915061310f6020840161306d565b90509250929050565b60008060006060848603121561312d57600080fd5b6131368461306d565b92506131446020850161306d565b9150604084013590509250925092565b6000806000806080858703121561316a57600080fd5b6131738561306d565b93506131816020860161306d565b925060408501359150606085013567ffffffffffffffff8111156131a457600080fd5b6131b087828801613099565b91505092959194509250565b600080604083850312156131cf57600080fd5b6131d88361306d565b915061310f60208401613089565b600080600080600060a086880312156131fe57600080fd5b6132078661306d565b9450602086013567ffffffffffffffff81111561322357600080fd5b61322f88828901613099565b945050604086013592506060860135915061324c608087016130b9565b90509295509295909350565b6000806040838503121561326b57600080fd5b6132748361306d565b946020939093013593505050565b6000806040838503121561329557600080fd5b61329e8361306d565b915061310f602084016130b9565b600060208083850312156132bf57600080fd5b823567ffffffffffffffff808211156132d757600080fd5b818501915085601f8301126132eb57600080fd5b8135818111156132fd576132fd6138ea565b8060051b915061330e84830161371f565b8181528481019084860184860187018a101561332957600080fd5b600095505b838610156133535761333f8161306d565b83526001959095019491860191860161332e565b5098975050505050505050565b60006020828403121561337257600080fd5b6120ca82613089565b60006020828403121561338d57600080fd5b81356120ca81613900565b6000602082840312156133aa57600080fd5b81516120ca81613900565b6000602082840312156133c757600080fd5b813567ffffffffffffffff8111156133de57600080fd5b8201601f810184136133ef57600080fd5b6121c084823560208401613015565b60006020828403121561341057600080fd5b5035919050565b60006020828403121561342957600080fd5b6120ca826130b9565b6000815180845261344a8160208601602086016137b8565b601f01601f19169290920160200192915050565b8054600090600181811c908083168061347857607f831692505b602080841082141561349a57634e487b7160e01b600052602260045260246000fd5b8180156134ae57600181146134bf576134ec565b60ff198616895284890196506134ec565b60008881526020902060005b868110156134e45781548b8201529085019083016134cb565b505084890196505b50505050505092915050565b6000825161350a8184602087016137b8565b9190910192915050565b600083516135268184602088016137b8565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b6000613557828661345e565b84516135678183602089016137b8565b6135738183018661345e565b979650505050505050565b6001600160a01b038481168252831660208201526060604082018190526000906135aa90830184613432565b95945050505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906135e690830184613432565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156136285783518352928401929184019160010161360c565b50909695505050505050565b6020815260006120ca6020830184613432565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613748576137486138ea565b604052919050565b6000821982111561376357613763613892565b500190565b600060ff821660ff84168060ff0382111561378557613785613892565b019392505050565b60008261379c5761379c6138a8565b500490565b6000828210156137b3576137b3613892565b500390565b60005b838110156137d35781810151838201526020016137bb565b83811115611be45750506000910152565b600181811c908216806137f857607f821691505b6020821081141561381957634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561383357613833613892565b5060010190565b600063ffffffff8083168181141561385457613854613892565b6001019392505050565b600060ff821660ff81141561387557613875613892565b60010192915050565b60008261388d5761388d6138a8565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461137257600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a26469706673582212202ed907315e48c49ccbcdcae5757e24760d7ef73b1aac7d8cf4f329e5ae76fa6364736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef00000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb0000000000000000000000004156eddf92dadf23ed78c0f51f133d789b4d35fe0000000000000000000000005d4bc6ea2e35d22e65dfcb09679bad08e8c2a71d0000000000000000000000000000000000000000000000000000000000000260000000000000000000000000000000000000000000000000000000000000001232526963682049736c616e642054696b69730000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000432524954000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d6344327a335569456d62576873654538616439665855787a756a436f5932516732685676646f726e34644a512f000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d53626644504a755a59536f69734d76365a66696e55324745514453414d68525773673861444654367251586b2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000140000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef00000000000000000000000009e51b29fd0a7156a661766eb242933f723bdaa5100000000000000000000000092adf854f8e105c2c1c97a3cbb0a05037d973cd300000000000000000000000003f1afcfd7828d88957c4d5c3313b2d3e405f40c000000000000000000000000d0bf2d93aa166b67deb1a7cf9650d008c4a75dcc0000000000000000000000007f7dca6cfae1a104cc0a93546fb430989134a04a0000000000000000000000006ea878f2b2a2f8994a3f2225ea8b546eaa2add7f000000000000000000000000ae1718f88e94f07332f67f39fd7b15986a0d9434000000000000000000000000524a52ecd26471b374804c803e20873ea8f06ae0000000000000000000000000971998c07c8fc63645a9a247318fc9e47789d2170000000000000000000000000d5067899b9124937c82b8ab799d663d84d7e9a70000000000000000000000001dd157c0372c6646bd3ac94353db9e0df9d7877800000000000000000000000073743f68e70ebd463ba70ac8e924f18a2c19512e0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef0000000000000000000000000c33ecb0c656e43bf33a92a4559b2eccca13d3a78000000000000000000000000b1beee81280512b4ca67b4d53664dc1253fd3d7b0000000000000000000000006071e73bc356135d4aac960832b27e00f5721b050000000000000000000000007cf29f382d4868b098d0bf714c1944355856132700000000000000000000000018f77b84c6bf07f5743cfbfc2f1759acc7d7f412

-----Decoded View---------------
Arg [0] : _name (string): 2Rich Island Tikis
Arg [1] : _symbol (string): 2RIT
Arg [2] : _uri (string): ipfs://QmcD2z3UiEmbWhseE8ad9fXUxzujCoY2Qg2hVvdorn4dJQ/
Arg [3] : _notRevealedURI (string): ipfs://QmSbfDPJuZYSoisMv6ZfinU2GEQDSAMhRWsg8aDFT6rQXk/
Arg [4] : _artistAddress (address): 0x4391e10d3Fbe2110e79f46ac98eCB6b0a8B36ef0
Arg [5] : _clientAddress (address): 0x8a5cEaDAacDE9c6424C539b3Ca6F990Be934f7Fb
Arg [6] : _giveawayAddress (address): 0x4156EdDF92dAdf23ed78C0f51F133D789B4d35fE
Arg [7] : _paymentAddress (address): 0x5D4Bc6eA2e35d22E65dfcB09679BAD08e8c2a71D
Arg [8] : _whitelistAddresses (address[]): 0x8a5cEaDAacDE9c6424C539b3Ca6F990Be934f7Fb,0x4391e10d3Fbe2110e79f46ac98eCB6b0a8B36ef0,0x9e51B29fD0a7156a661766eb242933f723BdAa51,0x92ADF854f8E105C2C1c97a3cBB0A05037d973CD3,0x03F1AfcFd7828d88957C4d5c3313B2D3E405F40C,0xD0Bf2d93aa166B67deb1A7CF9650D008c4a75dcC,0x7F7Dca6CfAE1A104cc0A93546Fb430989134a04A,0x6EA878F2B2a2F8994a3F2225eA8b546EaA2AdD7f,0xaE1718F88E94f07332F67F39fd7b15986a0D9434,0x524A52eCD26471b374804c803e20873EA8F06ae0,0x971998C07c8Fc63645A9a247318fC9e47789d217,0x0d5067899B9124937c82B8Ab799d663D84d7E9a7,0x1dd157C0372C6646bd3ac94353dB9E0Df9D78778,0x73743f68E70ebd463Ba70aC8e924F18a2c19512E,0x4391e10d3Fbe2110e79f46ac98eCB6b0a8B36ef0,0xc33Ecb0C656E43BF33A92a4559b2ECcca13D3A78,0xB1BeeE81280512B4ca67b4D53664dc1253fd3D7B,0x6071E73Bc356135d4aac960832B27e00f5721B05,0x7Cf29f382D4868b098D0bF714c19443558561327,0x18F77B84C6bf07F5743CFBfc2f1759acc7D7f412

-----Encoded View---------------
40 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000200
Arg [4] : 0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef0
Arg [5] : 0000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb
Arg [6] : 0000000000000000000000004156eddf92dadf23ed78c0f51f133d789b4d35fe
Arg [7] : 0000000000000000000000005d4bc6ea2e35d22e65dfcb09679bad08e8c2a71d
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [10] : 32526963682049736c616e642054696b69730000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [12] : 3252495400000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [14] : 697066733a2f2f516d6344327a335569456d6257687365453861643966585578
Arg [15] : 7a756a436f5932516732685676646f726e34644a512f00000000000000000000
Arg [16] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [17] : 697066733a2f2f516d53626644504a755a59536f69734d76365a66696e553247
Arg [18] : 45514453414d68525773673861444654367251586b2f00000000000000000000
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [20] : 0000000000000000000000008a5ceadaacde9c6424c539b3ca6f990be934f7fb
Arg [21] : 0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef0
Arg [22] : 0000000000000000000000009e51b29fd0a7156a661766eb242933f723bdaa51
Arg [23] : 00000000000000000000000092adf854f8e105c2c1c97a3cbb0a05037d973cd3
Arg [24] : 00000000000000000000000003f1afcfd7828d88957c4d5c3313b2d3e405f40c
Arg [25] : 000000000000000000000000d0bf2d93aa166b67deb1a7cf9650d008c4a75dcc
Arg [26] : 0000000000000000000000007f7dca6cfae1a104cc0a93546fb430989134a04a
Arg [27] : 0000000000000000000000006ea878f2b2a2f8994a3f2225ea8b546eaa2add7f
Arg [28] : 000000000000000000000000ae1718f88e94f07332f67f39fd7b15986a0d9434
Arg [29] : 000000000000000000000000524a52ecd26471b374804c803e20873ea8f06ae0
Arg [30] : 000000000000000000000000971998c07c8fc63645a9a247318fc9e47789d217
Arg [31] : 0000000000000000000000000d5067899b9124937c82b8ab799d663d84d7e9a7
Arg [32] : 0000000000000000000000001dd157c0372c6646bd3ac94353db9e0df9d78778
Arg [33] : 00000000000000000000000073743f68e70ebd463ba70ac8e924f18a2c19512e
Arg [34] : 0000000000000000000000004391e10d3fbe2110e79f46ac98ecb6b0a8b36ef0
Arg [35] : 000000000000000000000000c33ecb0c656e43bf33a92a4559b2eccca13d3a78
Arg [36] : 000000000000000000000000b1beee81280512b4ca67b4d53664dc1253fd3d7b
Arg [37] : 0000000000000000000000006071e73bc356135d4aac960832b27e00f5721b05
Arg [38] : 0000000000000000000000007cf29f382d4868b098d0bf714c19443558561327
Arg [39] : 00000000000000000000000018f77b84c6bf07f5743cfbfc2f1759acc7d7f412


Deployed Bytecode Sourcemap

71432:5007:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60848:224;;;;;;;;;;-1:-1:-1;60848:224:0;;;;;:::i;:::-;;:::i;:::-;;;12076:14:1;;12069:22;12051:41;;12039:2;12024:18;60848:224:0;;;;;;;;23810:81;;;;;;;;;;-1:-1:-1;23810:81:0;;;;;:::i;:::-;;:::i;:::-;;46337:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;47896:221::-;;;;;;;;;;-1:-1:-1;47896:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10077:32:1;;;10059:51;;10047:2;10032:18;47896:221:0;9913:203:1;47419:411:0;;;;;;;;;;-1:-1:-1;47419:411:0;;;;;:::i;:::-;;:::i;11903:1151::-;;;;;;:::i;:::-;;:::i;2032:43::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;2032:43:0;;;;;67817:100;;;;;;;;;;-1:-1:-1;67897:12:0;;67817:100;;;12249:25:1;;;12237:2;12222:18;67817:100:0;12103:177:1;3027:101:0;;;;;;;;;;-1:-1:-1;3105:15:0;;3027:101;;48646:339;;;;;;;;;;-1:-1:-1;48646:339:0;;;;;:::i;:::-;;:::i;22362:273::-;;;;;;;;;;-1:-1:-1;22362:273:0;;;;;:::i;:::-;;:::i;25444:116::-;;;;;;;;;;-1:-1:-1;25444:116:0;;;;;:::i;:::-;;:::i;71579:36::-;;;;;;;;;;-1:-1:-1;71579:36:0;;;;-1:-1:-1;;;;;71579:36:0;;;13480:107;;;;;;;;;;-1:-1:-1;13480:107:0;;;;;:::i;:::-;-1:-1:-1;;;;;13567:12:0;13533:13;13567:12;;;:6;:12;;;;;;;13480:107;61156:256;;;;;;;;;;-1:-1:-1;61156:256:0;;;;;:::i;:::-;;:::i;21552:180::-;;;;;;;;;;-1:-1:-1;21552:180:0;;;;;:::i;:::-;;:::i;3136:161::-;;;;;;;;;;-1:-1:-1;3250:9:0;3136:161;;21340:119;;;;;;;;;;-1:-1:-1;21340:119:0;;;;;:::i;:::-;-1:-1:-1;;;;;21426:17:0;21402:4;21426:17;;;:9;:17;;;;;;;;:25;;:17;:25;;21340:119;76242:194;;;:::i;49056:185::-;;;;;;;;;;-1:-1:-1;49056:185:0;;;;;:::i;:::-;;:::i;75744:392::-;;;;;;;;;;-1:-1:-1;75744:392:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;23328:102::-;;;;;;;;;;-1:-1:-1;23411:11:0;;23328:102;;73026:251;;;;;;;;;;;;;:::i;61678:233::-;;;;;;;;;;-1:-1:-1;61678:233:0;;;;;:::i;:::-;;:::i;71840:28::-;;;;;;;;;;-1:-1:-1;71840:28:0;;;;;;;;24776:660;;;;;;:::i;:::-;;:::i;24272:42::-;;;;;;;;;;-1:-1:-1;24272:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25396:4:1;25384:17;;;25366:36;;25354:2;25339:18;24272:42:0;25224:184:1;74067:115:0;;;;;;;;;;-1:-1:-1;74067:115:0;;;;;:::i;:::-;;:::i;23639:26::-;;;;;;;;;;-1:-1:-1;23639:26:0;;;;;;;;74334:131;;;;;;;;;;-1:-1:-1;74334:131:0;;;;;:::i;:::-;;:::i;71710:37::-;;;;;;;;;;-1:-1:-1;71710:37:0;;;;-1:-1:-1;;;;;71710:37:0;;;46031:239;;;;;;;;;;-1:-1:-1;46031:239:0;;;;;:::i;:::-;;:::i;23214:106::-;;;;;;;;;;-1:-1:-1;23214:106:0;;;;;:::i;:::-;;:::i;45761:208::-;;;;;;;;;;-1:-1:-1;45761:208:0;;;;;:::i;:::-;;:::i;19566:103::-;;;;;;;;;;;;;:::i;71877:33::-;;;;;;;;;;;;;:::i;18915:87::-;;;;;;;;;;-1:-1:-1;18988:6:0;;-1:-1:-1;;;;;18988:6:0;18915:87;;46506:104;;;;;;;;;;;;;:::i;20639:41::-;;;;;;;;;;-1:-1:-1;20639:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;68008:99;;;;;;;;;;;;;:::i;48189:155::-;;;;;;;;;;-1:-1:-1;48189:155:0;;;;;:::i;:::-;;:::i;73597:71::-;;;;;;;;;;;;;:::i;49312:328::-;;;;;;;;;;-1:-1:-1;49312:328:0;;;;;:::i;:::-;;:::i;24158:30::-;;;;;;;;;;;;;;;;71794:37;;;;;;;;;;;;;:::i;74578:466::-;;;;;;;;;;-1:-1:-1;74578:466:0;;;;;:::i;:::-;;:::i;24321:40::-;;;;;;;;;;-1:-1:-1;24321:40:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;71756:31;;;;;;;;;;;;;:::i;71622:36::-;;;;;;;;;;-1:-1:-1;71622:36:0;;;;-1:-1:-1;;;;;71622:36:0;;;75482:151;;;;;;;;;;-1:-1:-1;75482:151:0;;;;;:::i;:::-;;:::i;68213:115::-;;;;;;;;;;;;;:::i;21833:149::-;;;;;;;;;;-1:-1:-1;21833:149:0;;;;;:::i;:::-;;:::i;48415:164::-;;;;;;;;;;-1:-1:-1;48415:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;48536:25:0;;;48512:4;48536:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;48415:164;73796:151;;;;;;;;;;-1:-1:-1;73796:151:0;;;;;:::i;:::-;;:::i;19824:201::-;;;;;;;;;;-1:-1:-1;19824:201:0;;;;;:::i;:::-;;:::i;71665:38::-;;;;;;;;;;-1:-1:-1;71665:38:0;;;;-1:-1:-1;;;;;71665:38:0;;;25720:110;;;;;;;;;;;;;:::i;20594:36::-;;;;;;;;;;-1:-1:-1;20594:36:0;;;;-1:-1:-1;;;20594:36:0;;;;;;60848:224;60950:4;-1:-1:-1;;;;;;60974:50:0;;-1:-1:-1;;;60974:50:0;;:90;;;61028:36;61052:11;61028:23;:36::i;:::-;60967:97;60848:224;-1:-1:-1;;60848:224:0:o;23810:81::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;;;;;;;;;23868:6:::1;:15:::0;;-1:-1:-1;;23868:15:0::1;::::0;::::1;;::::0;;;::::1;::::0;;23810:81::o;46337:100::-;46391:13;46424:5;46417:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46337:100;:::o;47896:221::-;47972:7;51239:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51239:16:0;47992:73;;;;-1:-1:-1;;;47992:73:0;;20842:2:1;47992:73:0;;;20824:21:1;20881:2;20861:18;;;20854:30;20920:34;20900:18;;;20893:62;-1:-1:-1;;;20971:18:1;;;20964:42;21023:19;;47992:73:0;20640:408:1;47992:73:0;-1:-1:-1;48085:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;48085:24:0;;47896:221::o;47419:411::-;47500:13;47516:23;47531:7;47516:14;:23::i;:::-;47500:39;;47564:5;-1:-1:-1;;;;;47558:11:0;:2;-1:-1:-1;;;;;47558:11:0;;;47550:57;;;;-1:-1:-1;;;47550:57:0;;22428:2:1;47550:57:0;;;22410:21:1;22467:2;22447:18;;;22440:30;22506:34;22486:18;;;22479:62;-1:-1:-1;;;22557:18:1;;;22550:31;22598:19;;47550:57:0;22226:397:1;47550:57:0;47658:5;-1:-1:-1;;;;;47642:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;47642:21:0;;:62;;;;47667:37;47684:5;47691:12;:10;:12::i;47667:37::-;47620:168;;;;-1:-1:-1;;;47620:168:0;;18832:2:1;47620:168:0;;;18814:21:1;18871:2;18851:18;;;18844:30;18910:34;18890:18;;;18883:62;18981:26;18961:18;;;18954:54;19025:19;;47620:168:0;18630:420:1;47620:168:0;47801:21;47810:2;47814:7;47801:8;:21::i;:::-;47489:341;47419:411;;:::o;11903:1151::-;12161:152;;;12104:12;12161:152;;;;;-1:-1:-1;;;;;12199:19:0;;12129:29;12199:19;;;:6;:19;;;;;;;;;12161:152;;;;;;;;;;;12348:45;12206:11;12161:152;12376:4;12382;12388;12348:6;:45::i;:::-;12326:128;;;;-1:-1:-1;;;12326:128:0;;22026:2:1;12326:128:0;;;22008:21:1;22065:2;22045:18;;;22038:30;22104:34;22084:18;;;22077:62;-1:-1:-1;;;22155:18:1;;;22148:31;22196:19;;12326:128:0;21824:397:1;12326:128:0;-1:-1:-1;;;;;12543:19:0;;;;;;:6;:19;;;;;;:26;;12567:1;12543:23;:26::i;:::-;-1:-1:-1;;;;;12521:19:0;;;;;;:6;:19;;;;;;;:48;;;;12587:126;;;;;12528:11;;12659:10;;12685:17;;12587:126;:::i;:::-;;;;;;;;12824:12;12838:23;12873:4;-1:-1:-1;;;;;12865:18:0;12915:17;12934:11;12898:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;12898:48:0;;;;;;;;;;12865:92;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12823:134;;;;12976:7;12968:48;;;;-1:-1:-1;;;12968:48:0;;15398:2:1;12968:48:0;;;15380:21:1;15437:2;15417:18;;;15410:30;15476;15456:18;;;15449:58;15524:18;;12968:48:0;15196:352:1;12968:48:0;13036:10;11903:1151;-1:-1:-1;;;;;;;;11903:1151:0:o;48646:339::-;48841:41;48860:12;:10;:12::i;:::-;48874:7;48841:18;:41::i;:::-;48833:103;;;;-1:-1:-1;;;48833:103:0;;;;;;;:::i;:::-;48949:28;48959:4;48965:2;48969:7;48949:9;:28::i;22362:273::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;22482:8:::1;22477:151;22500:5;:12;22496:1;:16;;;22477:151;;;22556:5;22534:9;:19;22544:5;22550:1;22544:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;22534:19:0::1;-1:-1:-1::0;;;;;22534:19:0::1;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;22581:35;22607:5;22613:1;22607:8;;;;;;;;;;:::i;:::-;;;;;;;22581:35;;;;;-1:-1:-1::0;;;;;10077:32:1;;;;10059:51;;10047:2;10032:18;;9913:203;22581:35:0::1;;;;;;;;22514:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22477:151;;;;22362:273:::0;:::o;25444:116::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;25524:28:::1;25539:6;25547:4;25524:14;:28::i;61156:256::-:0;61253:7;61289:23;61306:5;61289:16;:23::i;:::-;61281:5;:31;61273:87;;;;-1:-1:-1;;;61273:87:0;;13758:2:1;61273:87:0;;;13740:21:1;13797:2;13777:18;;;13770:30;13836:34;13816:18;;;13809:62;-1:-1:-1;;;13887:18:1;;;13880:41;13938:19;;61273:87:0;13556:407:1;61273:87:0;-1:-1:-1;;;;;;61378:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;61156:256::o;21552:180::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;21649:17:::1;:24:::0;;;::::1;;-1:-1:-1::0;;;21649:24:0::1;-1:-1:-1::0;;;;21649:24:0;;::::1;;::::0;;21689:35:::1;::::0;::::1;::::0;::::1;::::0;21669:4;12076:14:1;12069:22;12051:41;;12039:2;12024:18;;11911:187;21689:35:0::1;;;;;;;;21552:180:::0;:::o;76242:194::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;76327:14:::1;::::0;76319:62:::1;::::0;76301:12:::1;::::0;-1:-1:-1;;;;;76327:14:0::1;::::0;76355:21:::1;::::0;76301:12;76319:62;76301:12;76319:62;76355:21;76327:14;76319:62:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76300:81;;;76400:7;76392:36;;;::::0;-1:-1:-1;;;76392:36:0;;22830:2:1;76392:36:0::1;::::0;::::1;22812:21:1::0;22869:2;22849:18;;;22842:30;-1:-1:-1;;;22888:18:1;;;22881:46;22944:18;;76392:36:0::1;22628:340:1::0;76392:36:0::1;76289:147;76242:194::o:0;49056:185::-;49194:39;49211:4;49217:2;49221:7;49194:39;;;;;;;;;;;;:16;:39::i;75744:392::-;75833:16;75867:23;75893:17;75903:6;75893:9;:17::i;:::-;75867:43;;75921:25;75963:15;75949:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;75949:30:0;;75921:58;;75995:9;75990:113;76010:15;76006:1;:19;75990:113;;;76061:30;76081:6;76089:1;76061:19;:30::i;:::-;76047:8;76056:1;76047:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;76027:3;;;;:::i;:::-;;;;75990:113;;;-1:-1:-1;76120:8:0;75744:392;-1:-1:-1;;;75744:392:0:o;73026:251::-;73092:6;;;;73091:7;73083:52;;;;-1:-1:-1;;;73083:52:0;;16540:2:1;73083:52:0;;;16522:21:1;;;16559:18;;;16552:30;16618:34;16598:18;;;16591:62;16670:18;;73083:52:0;16338:356:1;73083:52:0;73166:10;73156:21;;;;:9;:21;;;;;;73146:32;;73156:21;;73146:9;:32::i;:::-;73222:10;73212:21;;;;:9;:21;;;;;;;;;73189:7;:19;;;;;:44;;73212:21;;;;;73189:19;;:44;;73212:21;;73189:44;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;73254:10:0;-1:-1:-1;73244:21:0;;;:9;:21;;;;;:25;;-1:-1:-1;;73244:25:0;;;73026:251::o;61678:233::-;61753:7;61789:30;61576:10;:17;;61488:113;61789:30;61781:5;:38;61773:95;;;;-1:-1:-1;;;61773:95:0;;23593:2:1;61773:95:0;;;23575:21:1;23632:2;23612:18;;;23605:30;23671:34;23651:18;;;23644:62;-1:-1:-1;;;23722:18:1;;;23715:42;23774:19;;61773:95:0;23391:408:1;61773:95:0;61886:10;61897:5;61886:17;;;;;;;;:::i;:::-;;;;;;;;;61879:24;;61678:233;;;:::o;24776:660::-;20983:17;;-1:-1:-1;;;20983:17:0;;;;:25;;21004:4;20983:25;20979:100;;;21028:10;21018:21;;;;:9;:21;;;;;;;;21010:69;;;;-1:-1:-1;;;21010:69:0;;24840:2:1;21010:69:0;;;24822:21:1;24879:2;24859:18;;;24852:30;24918:34;24898:18;;;24891:62;-1:-1:-1;;;24969:18:1;;;24962:33;25012:19;;21010:69:0;24638:399:1;21010:69:0;24857:6:::1;::::0;::::1;;24856:7;24848:54;;;::::0;-1:-1:-1;;;24848:54:0;;20078:2:1;24848:54:0::1;::::0;::::1;20060:21:1::0;20117:2;20097:18;;;20090:30;20156:34;20136:18;;;20129:62;-1:-1:-1;;;20207:18:1;;;20200:32;20249:19;;24848:54:0::1;19876:398:1::0;24848:54:0::1;24991:6;::::0;24975:10:::1;24967:19;::::0;;;:7:::1;:19;::::0;;;;;;;;24943:9:::1;:21:::0;;;;;;;24967:19:::1;::::0;;::::1;::::0;24936:28:::1;::::0;24943:21:::1;24936:4:::0;:28:::1;:::i;:::-;:50;;;;:::i;:::-;24935:62;;;;24913:171;;;::::0;-1:-1:-1;;;24913:171:0;;16112:2:1;24913:171:0::1;::::0;::::1;16094:21:1::0;16151:2;16131:18;;;16124:30;16190:34;16170:18;;;16163:62;16261:29;16241:18;;;16234:57;16308:19;;24913:171:0::1;15910:423:1::0;24913:171:0::1;25161:11;;25148:10;;:24;;;;:::i;:::-;25139:4;25131:13;;25117:11;;:27;;;;:::i;:::-;:55;;25095:151;;;::::0;-1:-1:-1;;;25095:151:0;;24425:2:1;25095:151:0::1;::::0;::::1;24407:21:1::0;24464:2;24444:18;;;24437:30;24503:34;24483:18;;;24476:62;-1:-1:-1;;;24554:18:1;;;24547:44;24608:19;;25095:151:0::1;24223:410:1::0;25095:151:0::1;23411:11:::0;;25279:9:::1;:28;;25257:128;;;::::0;-1:-1:-1;;;25257:128:0;;24006:2:1;25257:128:0::1;::::0;::::1;23988:21:1::0;24045:2;24025:18;;;24018:30;24084:34;24064:18;;;24057:62;-1:-1:-1;;;24135:18:1;;;24128:48;24193:19;;25257:128:0::1;23804:414:1::0;25257:128:0::1;25396:32;25411:10;25423:4;25396:14;:32::i;74067:115::-:0;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;74146:28;;::::1;::::0;:12:::1;::::0;:28:::1;::::0;::::1;::::0;::::1;:::i;74334:131::-:0;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;74416:14:::1;:41:::0;;-1:-1:-1;;;;;;74416:41:0::1;-1:-1:-1::0;;;;;74416:41:0;;;::::1;::::0;;;::::1;::::0;;74334:131::o;46031:239::-;46103:7;46139:16;;;:7;:16;;;;;;-1:-1:-1;;;;;46139:16:0;46174:19;46166:73;;;;-1:-1:-1;;;46166:73:0;;19668:2:1;46166:73:0;;;19650:21:1;19707:2;19687:18;;;19680:30;19746:34;19726:18;;;19719:62;-1:-1:-1;;;19797:18:1;;;19790:39;19846:19;;46166:73:0;19466:405:1;23214:106:0;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;23285:27:::1;23300:11;23285:14;:27::i;45761:208::-:0;45833:7;-1:-1:-1;;;;;45861:19:0;;45853:74;;;;-1:-1:-1;;;45853:74:0;;19257:2:1;45853:74:0;;;19239:21:1;19296:2;19276:18;;;19269:30;19335:34;19315:18;;;19308:62;-1:-1:-1;;;19386:18:1;;;19379:40;19436:19;;45853:74:0;19055:406:1;45853:74:0;-1:-1:-1;;;;;;45945:16:0;;;;;:9;:16;;;;;;;45761:208::o;19566:103::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;19631:30:::1;19658:1;19631:18;:30::i;:::-;19566:103::o:0;71877:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;46506:104::-;46562:13;46595:7;46588:14;;;;;:::i;68008:99::-;68051:7;68078:21;:11;997:14;;905:114;68078:21;68071:28;;68008:99;:::o;48189:155::-;48284:52;48303:12;:10;:12::i;:::-;48317:8;48327;48284:18;:52::i;73597:71::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;73645:8:::1;:15:::0;;-1:-1:-1;;73645:15:0::1;73656:4;73645:15;::::0;;73597:71::o;49312:328::-;49487:41;49506:12;:10;:12::i;:::-;49520:7;49487:18;:41::i;:::-;49479:103;;;;-1:-1:-1;;;49479:103:0;;;;;;;:::i;:::-;49593:39;49607:4;49613:2;49617:7;49626:5;49593:13;:39::i;:::-;49312:328;;;;:::o;71794:37::-;;;;;;;:::i;74578:466::-;51215:4;51239:16;;;:7;:16;;;;;;74680:13;;-1:-1:-1;;;;;51239:16:0;74711:63;;;;-1:-1:-1;;;74711:63:0;;14589:2:1;74711:63:0;;;14571:21:1;14628:2;14608:18;;;14601:30;14667:34;14647:18;;;14640:62;-1:-1:-1;;;14718:18:1;;;14711:31;14759:19;;74711:63:0;14387:397:1;74711:63:0;74789:8;;;;74785:140;;74854:14;74870:26;74887:8;74870:16;:26::i;:::-;74898:13;74837:75;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74823:90;;74578:466;;;:::o;74785:140::-;74979:12;74993:26;75010:8;74993:16;:26::i;71756:31::-;;;;;;;:::i;75482:151::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;75592:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;68213:115::-:0;68265:7;68308:12;:10;:12::i;:::-;67897;;68292:28;;;;:::i;21833:149::-;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;21943:31:::1;21968:5;21943:24;:31::i;73796:151::-:0;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;73907:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;19824:201::-:0;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19913:22:0;::::1;19905:73;;;::::0;-1:-1:-1;;;19905:73:0;;14991:2:1;19905:73:0::1;::::0;::::1;14973:21:1::0;15030:2;15010:18;;;15003:30;15069:34;15049:18;;;15042:62;-1:-1:-1;;;15120:18:1;;;15113:36;15166:19;;19905:73:0::1;14789:402:1::0;19905:73:0::1;19989:28;20008:8;19989:18;:28::i;25720:110::-:0;25771:7;25811:11;;25798:10;;:24;;;;:::i;14211:618::-;14255:22;14294:10;14316:4;14294:27;14290:508;;;14338:18;14359:8;;14338:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;14398:8:0;14609:17;14603:24;-1:-1:-1;;;;;14577:134:0;;-1:-1:-1;14290:508:0;;-1:-1:-1;14290:508:0;;-1:-1:-1;14775:10:0;14290:508;14211:618;:::o;45392:305::-;45494:4;-1:-1:-1;;;;;;45531:40:0;;-1:-1:-1;;;45531:40:0;;:105;;-1:-1:-1;;;;;;;45588:48:0;;-1:-1:-1;;;45588:48:0;45531:105;:158;;;-1:-1:-1;;;;;;;;;;37197:40:0;;;45653:36;37088:157;75193:120;75247:14;75281:24;:22;:24::i;55132:174::-;55207:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;55207:29:0;-1:-1:-1;;;;;55207:29:0;;;;;;;;:24;;55261:23;55207:24;55261:14;:23::i;:::-;-1:-1:-1;;;;;55252:46:0;;;;;;;;;;;55132:174;;:::o;13595:486::-;13773:4;-1:-1:-1;;;;;13798:20:0;;13790:70;;;;-1:-1:-1;;;13790:70:0;;18426:2:1;13790:70:0;;;18408:21:1;18465:2;18445:18;;;18438:30;18504:34;18484:18;;;18477:62;-1:-1:-1;;;18555:18:1;;;18548:35;18600:19;;13790:70:0;18224:401:1;13790:70:0;13914:159;13942:47;13961:27;13981:6;13961:19;:27::i;:::-;13942:18;:47::i;:::-;13914:159;;;;;;;;;;;;12934:25:1;;;;13007:4;12995:17;;12975:18;;;12968:45;13029:18;;;13022:34;;;13072:18;;;13065:34;;;12906:19;;13914:159:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;13891:182:0;:6;-1:-1:-1;;;;;13891:182:0;;13871:202;;13595:486;;;;;;;:::o;6793:98::-;6851:7;6878:5;6882:1;6878;:5;:::i;:::-;6871:12;6793:98;-1:-1:-1;;;6793:98:0:o;51444:348::-;51537:4;51239:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51239:16:0;51554:73;;;;-1:-1:-1;;;51554:73:0;;18013:2:1;51554:73:0;;;17995:21:1;18052:2;18032:18;;;18025:30;18091:34;18071:18;;;18064:62;-1:-1:-1;;;18142:18:1;;;18135:42;18194:19;;51554:73:0;17811:408:1;51554:73:0;51638:13;51654:23;51669:7;51654:14;:23::i;:::-;51638:39;;51707:5;-1:-1:-1;;;;;51696:16:0;:7;-1:-1:-1;;;;;51696:16:0;;:51;;;;51740:7;-1:-1:-1;;;;;51716:31:0;:20;51728:7;51716:11;:20::i;:::-;-1:-1:-1;;;;;51716:31:0;;51696:51;:87;;;-1:-1:-1;;;;;;48536:25:0;;;48512:4;48536:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;51751:32;51688:96;51444:348;-1:-1:-1;;;;51444:348:0:o;54436:578::-;54595:4;-1:-1:-1;;;;;54568:31:0;:23;54583:7;54568:14;:23::i;:::-;-1:-1:-1;;;;;54568:31:0;;54560:85;;;;-1:-1:-1;;;54560:85:0;;21616:2:1;54560:85:0;;;21598:21:1;21655:2;21635:18;;;21628:30;21694:34;21674:18;;;21667:62;-1:-1:-1;;;21745:18:1;;;21738:39;21794:19;;54560:85:0;21414:405:1;54560:85:0;-1:-1:-1;;;;;54664:16:0;;54656:65;;;;-1:-1:-1;;;54656:65:0;;16901:2:1;54656:65:0;;;16883:21:1;16940:2;16920:18;;;16913:30;16979:34;16959:18;;;16952:62;-1:-1:-1;;;17030:18:1;;;17023:34;17074:19;;54656:65:0;16699:400:1;54656:65:0;54734:39;54755:4;54761:2;54765:7;54734:20;:39::i;:::-;54838:29;54855:1;54859:7;54838:8;:29::i;:::-;-1:-1:-1;;;;;54880:15:0;;;;;;:9;:15;;;;;:20;;54899:1;;54880:15;:20;;54899:1;;54880:20;:::i;:::-;;;;-1:-1:-1;;;;;;;54911:13:0;;;;;;:9;:13;;;;;:18;;54928:1;;54911:13;:18;;54928:1;;54911:18;:::i;:::-;;;;-1:-1:-1;;54940:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;54940:21:0;-1:-1:-1;;;;;54940:21:0;;;;;;;;;54979:27;;54940:16;;54979:27;;;;;;;54436:578;;;:::o;25568:144::-;-1:-1:-1;;;;;25640:17:0;;;;;;:9;:17;;;;;:25;;25661:4;;25640:17;:25;;25661:4;;25640:25;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;25699:4;25691:13;;25676:11;;:28;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;25568:144:0:o;73373:151::-;73428:7;73423:94;73445:4;73441:8;;:1;:8;;;73423:94;;;73471:34;73481:10;73493:11;:9;:11::i;:::-;73471:9;:34::i;:::-;73451:3;;;;:::i;:::-;;;;73423:94;;22994:105;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;23066:11:::1;:25:::0;22994:105::o;20185:191::-;20278:6;;;-1:-1:-1;;;;;20295:17:0;;;-1:-1:-1;;;;;;20295:17:0;;;;;;;20328:40;;20278:6;;;20295:17;20278:6;;20328:40;;20259:16;;20328:40;20248:128;20185:191;:::o;55448:315::-;55603:8;-1:-1:-1;;;;;55594:17:0;:5;-1:-1:-1;;;;;55594:17:0;;;55586:55;;;;-1:-1:-1;;;55586:55:0;;17306:2:1;55586:55:0;;;17288:21:1;17345:2;17325:18;;;17318:30;17384:27;17364:18;;;17357:55;17429:18;;55586:55:0;17104:349:1;55586:55:0;-1:-1:-1;;;;;55652:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;55652:46:0;;;;;;;;;;55714:41;;12051::1;;;55714::0;;12024:18:1;55714:41:0;;;;;;;55448:315;;;:::o;50522:::-;50679:28;50689:4;50695:2;50699:7;50679:9;:28::i;:::-;50726:48;50749:4;50755:2;50759:7;50768:5;50726:22;:48::i;:::-;50718:111;;;;-1:-1:-1;;;50718:111:0;;;;;;;:::i;15201:723::-;15257:13;15478:10;15474:53;;-1:-1:-1;;15505:10:0;;;;;;;;;;;;-1:-1:-1;;;15505:10:0;;;;;15201:723::o;15474:53::-;15552:5;15537:12;15593:78;15600:9;;15593:78;;15626:8;;;;:::i;:::-;;-1:-1:-1;15649:10:0;;-1:-1:-1;15657:2:0;15649:10;;:::i;:::-;;;15593:78;;;15681:19;15713:6;15703:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;15703:17:0;;15681:39;;15731:154;15738:10;;15731:154;;15765:11;15775:1;15765:11;;:::i;:::-;;-1:-1:-1;15834:10:0;15842:2;15834:5;:10;:::i;:::-;15821:24;;:2;:24;:::i;:::-;15808:39;;15791:6;15798;15791:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;15791:56:0;;;;;;;;-1:-1:-1;15862:11:0;15871:2;15862:11;;:::i;:::-;;;15731:154;;21990:266;19146:12;:10;:12::i;:::-;-1:-1:-1;;;;;19135:23:0;:7;18988:6;;-1:-1:-1;;;;;18988:6:0;;18915:87;19135:7;-1:-1:-1;;;;;19135:23:0;;19127:68;;;;-1:-1:-1;;;19127:68:0;;;;;;;:::i;:::-;22106:8:::1;22101:148;22124:5;:12;22120:1;:16;;;22101:148;;;22180:4;22158:9;:19;22168:5;22174:1;22168:8;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;22158:19:0::1;-1:-1:-1::0;;;;;22158:19:0::1;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;22204:33;22228:5;22234:1;22228:8;;;;;;;;;;:::i;:::-;;;;;;;22204:33;;;;;-1:-1:-1::0;;;;;10077:32:1;;;;10059:51;;10047:2;10032:18;;9913:203;22204:33:0::1;;;;;;;;22138:3:::0;::::1;::::0;::::1;:::i;:::-;;;;22101:148;;13062:410:::0;13172:7;11227:108;;;;;;;;;;;;;;;;;11203:143;;;;;;;13326:12;;13361:11;;;;13405:24;;;;;13395:35;;;;;;13245:204;;;;;12516:25:1;;;12572:2;12557:18;;12550:34;;;;-1:-1:-1;;;;;12620:32:1;12615:2;12600:18;;12593:60;12684:2;12669:18;;12662:34;12503:3;12488:19;;12285:417;13245:204:0;;;;;;;;;;;;;13217:247;;;;;;13197:267;;13062:410;;;:::o;3666:258::-;3765:7;3867:20;3105:15;;;3027:101;3867:20;3838:63;;-1:-1:-1;;;3838:63:0;;;9564:27:1;9607:11;;;9600:27;;;;9643:12;;;9636:28;;;9680:12;;3838:63:0;9306:392:1;62524:589:0;-1:-1:-1;;;;;62730:18:0;;62726:187;;62765:40;62797:7;63940:10;:17;;63913:24;;;;:15;:24;;;;;:44;;;63968:24;;;;;;;;;;;;63836:164;62765:40;62726:187;;;62835:2;-1:-1:-1;;;;;62827:10:0;:4;-1:-1:-1;;;;;62827:10:0;;62823:90;;62854:47;62887:4;62893:7;62854:32;:47::i;:::-;-1:-1:-1;;;;;62927:16:0;;62923:183;;62960:45;62997:7;62960:36;:45::i;62923:183::-;63033:4;-1:-1:-1;;;;;63027:10:0;:2;-1:-1:-1;;;;;63027:10:0;;63023:83;;63054:40;63082:2;63086:7;63054:27;:40::i;70048:1264::-;70115:7;68772:1;68748:21;:19;:21::i;:::-;:25;68740:62;;;;-1:-1:-1;;;68740:62:0;;17660:2:1;68740:62:0;;;17642:21:1;17699:2;17679:18;;;17672:30;-1:-1:-1;;;17718:18:1;;;17711:54;17782:18;;68740:62:0;17458:348:1;68740:62:0;70135:16:::1;70170:12;:10;:12::i;:::-;67897::::0;;70154:28:::1;;;;:::i;:::-;70242:195;::::0;-1:-1:-1;;70277:10:0::1;7922:2:1::0;7918:15;;;7914:24;;70242:195:0::1;::::0;::::1;7902:37:1::0;70306:14:0::1;7973:15:1::0;;7969:24;7955:12;;;7948:46;70339:16:0::1;8010:12:1::0;;;8003:28;70374:14:0::1;8047:12:1::0;;;8040:28;70407:15:0::1;8084:13:1::0;;;8077:29;70135:47:0;;-1:-1:-1;70193:14:0::1;::::0;70135:47;;8122:13:1;;70242:195:0::1;;;;;;;;;;;;70218:230;;;;;;70210:239;;:250;;;;:::i;:::-;70473:13;70505:19:::0;;;:11:::1;:19;::::0;;;;;70193:267;;-1:-1:-1;70473:13:0;70501:304:::1;;-1:-1:-1::0;70650:6:0;70501:304:::1;;;-1:-1:-1::0;70774:19:0::1;::::0;;;:11:::1;:19;::::0;;;;;70501:304:::1;70882:11;:25;70894:12;70905:1;70894:8:::0;:12:::1;:::i;:::-;70882:25;;;;;;;;;;;;70911:1;70882:30;70878:331;;;71016:12;71027:1;71016:8:::0;:12:::1;:::i;:::-;70994:19;::::0;;;:11:::1;:19;::::0;;;;:34;70878:331:::1;;;71172:11;:25;71184:12;71195:1;71184:8:::0;:12:::1;:::i;:::-;71172:25:::0;;::::1;::::0;;::::1;::::0;;;;;;;;-1:-1:-1;71172:25:0;;;;71150:19;;;:11:::1;:19:::0;;;;:47;70878:331:::1;71250:17;:15;:17::i;:::-;-1:-1:-1::0;71295:9:0::1;::::0;71287:17:::1;::::0;:5;:17:::1;:::i;:::-;71280:24;;;;;70048:1264:::0;:::o;52134:110::-;52210:26;52220:2;52224:7;52210:26;;;;;;;;;;;;:9;:26::i;56328:799::-;56483:4;-1:-1:-1;;;;;56504:13:0;;27267:20;27315:8;56500:620;;56556:2;-1:-1:-1;;;;;56540:36:0;;56577:12;:10;:12::i;:::-;56591:4;56597:7;56606:5;56540:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56540:72:0;;;;;;;;-1:-1:-1;;56540:72:0;;;;;;;;;;;;:::i;:::-;;;56536:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;56782:13:0;;56778:272;;56825:60;;-1:-1:-1;;;56825:60:0;;;;;;;:::i;56778:272::-;57000:6;56994:13;56985:6;56981:2;56977:15;56970:38;56536:529;-1:-1:-1;;;;;;56663:51:0;-1:-1:-1;;;56663:51:0;;-1:-1:-1;56656:58:0;;56500:620;-1:-1:-1;57104:4:0;56328:799;;;;;;:::o;64627:988::-;64893:22;64943:1;64918:22;64935:4;64918:16;:22::i;:::-;:26;;;;:::i;:::-;64955:18;64976:26;;;:17;:26;;;;;;64893:51;;-1:-1:-1;65109:28:0;;;65105:328;;-1:-1:-1;;;;;65176:18:0;;65154:19;65176:18;;;:12;:18;;;;;;;;:34;;;;;;;;;65227:30;;;;;;:44;;;65344:30;;:17;:30;;;;;:43;;;65105:328;-1:-1:-1;65529:26:0;;;;:17;:26;;;;;;;;65522:33;;;-1:-1:-1;;;;;65573:18:0;;;;;:12;:18;;;;;:34;;;;;;;65566:41;64627:988::o;65910:1079::-;66188:10;:17;66163:22;;66188:21;;66208:1;;66188:21;:::i;:::-;66220:18;66241:24;;;:15;:24;;;;;;66614:10;:26;;66163:46;;-1:-1:-1;66241:24:0;;66163:46;;66614:26;;;;;;:::i;:::-;;;;;;;;;66592:48;;66678:11;66653:10;66664;66653:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;66758:28;;;:15;:28;;;;;;;:41;;;66930:24;;;;;66923:31;66965:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;65981:1008;;;65910:1079;:::o;63414:221::-;63499:14;63516:20;63533:2;63516:16;:20::i;:::-;-1:-1:-1;;;;;63547:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;63592:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;63414:221:0:o;68438:192::-;68504:7;68772:1;68748:21;:19;:21::i;:::-;:25;68740:62;;;;-1:-1:-1;;;68740:62:0;;17660:2:1;68740:62:0;;;17642:21:1;17699:2;17679:18;;;17672:30;-1:-1:-1;;;17718:18:1;;;17711:54;17782:18;;68740:62:0;17458:348:1;68740:62:0;68524:13:::1;68540:21;:11;997:14:::0;;905:114;68540:21:::1;68524:37;;68574:23;:11;1116:19:::0;;1134:1;1116:19;;;1027:127;52471:321;52601:18;52607:2;52611:7;52601:5;:18::i;:::-;52652:54;52683:1;52687:2;52691:7;52700:5;52652:22;:54::i;:::-;52630:154;;;;-1:-1:-1;;;52630:154:0;;;;;;;:::i;53128:382::-;-1:-1:-1;;;;;53208:16:0;;53200:61;;;;-1:-1:-1;;;53200:61:0;;20481:2:1;53200:61:0;;;20463:21:1;;;20500:18;;;20493:30;20559:34;20539:18;;;20532:62;20611:18;;53200:61:0;20279:356:1;53200:61:0;51215:4;51239:16;;;:7;:16;;;;;;-1:-1:-1;;;;;51239:16:0;:30;53272:58;;;;-1:-1:-1;;;53272:58:0;;15755:2:1;53272:58:0;;;15737:21:1;15794:2;15774:18;;;15767:30;15833;15813:18;;;15806:58;15881:18;;53272:58:0;15553:352:1;53272:58:0;53343:45;53372:1;53376:2;53380:7;53343:20;:45::i;:::-;-1:-1:-1;;;;;53401:13:0;;;;;;:9;:13;;;;;:18;;53418:1;;53401:13;:18;;53418:1;;53401:18;:::i;:::-;;;;-1:-1:-1;;53430:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;53430:21:0;-1:-1:-1;;;;;53430:21:0;;;;;;;;53469:33;;53430:16;;;53469:33;;53430:16;;53469:33;53128:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:1;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:1;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:160::-;668:20;;724:13;;717:21;707:32;;697:60;;753:1;750;743:12;768:220;810:5;863:3;856:4;848:6;844:17;840:27;830:55;;881:1;878;871:12;830:55;903:79;978:3;969:6;956:20;949:4;941:6;937:17;903:79;:::i;993:156::-;1059:20;;1119:4;1108:16;;1098:27;;1088:55;;1139:1;1136;1129:12;1154:186;1213:6;1266:2;1254:9;1245:7;1241:23;1237:32;1234:52;;;1282:1;1279;1272:12;1234:52;1305:29;1324:9;1305:29;:::i;1345:260::-;1413:6;1421;1474:2;1462:9;1453:7;1449:23;1445:32;1442:52;;;1490:1;1487;1480:12;1442:52;1513:29;1532:9;1513:29;:::i;:::-;1503:39;;1561:38;1595:2;1584:9;1580:18;1561:38;:::i;:::-;1551:48;;1345:260;;;;;:::o;1610:328::-;1687:6;1695;1703;1756:2;1744:9;1735:7;1731:23;1727:32;1724:52;;;1772:1;1769;1762:12;1724:52;1795:29;1814:9;1795:29;:::i;:::-;1785:39;;1843:38;1877:2;1866:9;1862:18;1843:38;:::i;:::-;1833:48;;1928:2;1917:9;1913:18;1900:32;1890:42;;1610:328;;;;;:::o;1943:537::-;2038:6;2046;2054;2062;2115:3;2103:9;2094:7;2090:23;2086:33;2083:53;;;2132:1;2129;2122:12;2083:53;2155:29;2174:9;2155:29;:::i;:::-;2145:39;;2203:38;2237:2;2226:9;2222:18;2203:38;:::i;:::-;2193:48;;2288:2;2277:9;2273:18;2260:32;2250:42;;2343:2;2332:9;2328:18;2315:32;2370:18;2362:6;2359:30;2356:50;;;2402:1;2399;2392:12;2356:50;2425:49;2466:7;2457:6;2446:9;2442:22;2425:49;:::i;:::-;2415:59;;;1943:537;;;;;;;:::o;2485:254::-;2550:6;2558;2611:2;2599:9;2590:7;2586:23;2582:32;2579:52;;;2627:1;2624;2617:12;2579:52;2650:29;2669:9;2650:29;:::i;:::-;2640:39;;2698:35;2729:2;2718:9;2714:18;2698:35;:::i;2744:602::-;2846:6;2854;2862;2870;2878;2931:3;2919:9;2910:7;2906:23;2902:33;2899:53;;;2948:1;2945;2938:12;2899:53;2971:29;2990:9;2971:29;:::i;:::-;2961:39;;3051:2;3040:9;3036:18;3023:32;3078:18;3070:6;3067:30;3064:50;;;3110:1;3107;3100:12;3064:50;3133:49;3174:7;3165:6;3154:9;3150:22;3133:49;:::i;:::-;3123:59;;;3229:2;3218:9;3214:18;3201:32;3191:42;;3280:2;3269:9;3265:18;3252:32;3242:42;;3303:37;3335:3;3324:9;3320:19;3303:37;:::i;:::-;3293:47;;2744:602;;;;;;;;:::o;3351:254::-;3419:6;3427;3480:2;3468:9;3459:7;3455:23;3451:32;3448:52;;;3496:1;3493;3486:12;3448:52;3519:29;3538:9;3519:29;:::i;:::-;3509:39;3595:2;3580:18;;;;3567:32;;-1:-1:-1;;;3351:254:1:o;3610:256::-;3676:6;3684;3737:2;3725:9;3716:7;3712:23;3708:32;3705:52;;;3753:1;3750;3743:12;3705:52;3776:29;3795:9;3776:29;:::i;:::-;3766:39;;3824:36;3856:2;3845:9;3841:18;3824:36;:::i;3871:963::-;3955:6;3986:2;4029;4017:9;4008:7;4004:23;4000:32;3997:52;;;4045:1;4042;4035:12;3997:52;4085:9;4072:23;4114:18;4155:2;4147:6;4144:14;4141:34;;;4171:1;4168;4161:12;4141:34;4209:6;4198:9;4194:22;4184:32;;4254:7;4247:4;4243:2;4239:13;4235:27;4225:55;;4276:1;4273;4266:12;4225:55;4312:2;4299:16;4334:2;4330;4327:10;4324:36;;;4340:18;;:::i;:::-;4386:2;4383:1;4379:10;4369:20;;4409:28;4433:2;4429;4425:11;4409:28;:::i;:::-;4471:15;;;4502:12;;;;4534:11;;;4564;;;4560:20;;4557:33;-1:-1:-1;4554:53:1;;;4603:1;4600;4593:12;4554:53;4625:1;4616:10;;4635:169;4649:2;4646:1;4643:9;4635:169;;;4706:23;4725:3;4706:23;:::i;:::-;4694:36;;4667:1;4660:9;;;;;4750:12;;;;4782;;4635:169;;;-1:-1:-1;4823:5:1;3871:963;-1:-1:-1;;;;;;;;3871:963:1:o;4839:180::-;4895:6;4948:2;4936:9;4927:7;4923:23;4919:32;4916:52;;;4964:1;4961;4954:12;4916:52;4987:26;5003:9;4987:26;:::i;5024:245::-;5082:6;5135:2;5123:9;5114:7;5110:23;5106:32;5103:52;;;5151:1;5148;5141:12;5103:52;5190:9;5177:23;5209:30;5233:5;5209:30;:::i;5274:249::-;5343:6;5396:2;5384:9;5375:7;5371:23;5367:32;5364:52;;;5412:1;5409;5402:12;5364:52;5444:9;5438:16;5463:30;5487:5;5463:30;:::i;5528:450::-;5597:6;5650:2;5638:9;5629:7;5625:23;5621:32;5618:52;;;5666:1;5663;5656:12;5618:52;5706:9;5693:23;5739:18;5731:6;5728:30;5725:50;;;5771:1;5768;5761:12;5725:50;5794:22;;5847:4;5839:13;;5835:27;-1:-1:-1;5825:55:1;;5876:1;5873;5866:12;5825:55;5899:73;5964:7;5959:2;5946:16;5941:2;5937;5933:11;5899:73;:::i;5983:180::-;6042:6;6095:2;6083:9;6074:7;6070:23;6066:32;6063:52;;;6111:1;6108;6101:12;6063:52;-1:-1:-1;6134:23:1;;5983:180;-1:-1:-1;5983:180:1:o;6168:182::-;6225:6;6278:2;6266:9;6257:7;6253:23;6249:32;6246:52;;;6294:1;6291;6284:12;6246:52;6317:27;6334:9;6317:27;:::i;6355:257::-;6396:3;6434:5;6428:12;6461:6;6456:3;6449:19;6477:63;6533:6;6526:4;6521:3;6517:14;6510:4;6503:5;6499:16;6477:63;:::i;:::-;6594:2;6573:15;-1:-1:-1;;6569:29:1;6560:39;;;;6601:4;6556:50;;6355:257;-1:-1:-1;;6355:257:1:o;6617:973::-;6702:12;;6667:3;;6757:1;6777:18;;;;6830;;;;6857:61;;6911:4;6903:6;6899:17;6889:27;;6857:61;6937:2;6985;6977:6;6974:14;6954:18;6951:38;6948:161;;;7031:10;7026:3;7022:20;7019:1;7012:31;7066:4;7063:1;7056:15;7094:4;7091:1;7084:15;6948:161;7125:18;7152:104;;;;7270:1;7265:319;;;;7118:466;;7152:104;-1:-1:-1;;7185:24:1;;7173:37;;7230:16;;;;-1:-1:-1;7152:104:1;;7265:319;25766:1;25759:14;;;25803:4;25790:18;;7359:1;7373:165;7387:6;7384:1;7381:13;7373:165;;;7465:14;;7452:11;;;7445:35;7508:16;;;;7402:10;;7373:165;;;7377:3;;7567:6;7562:3;7558:16;7551:23;;7118:466;;;;;;;6617:973;;;;:::o;8146:274::-;8275:3;8313:6;8307:13;8329:53;8375:6;8370:3;8363:4;8355:6;8351:17;8329:53;:::i;:::-;8398:16;;;;;8146:274;-1:-1:-1;;8146:274:1:o;8425:415::-;8582:3;8620:6;8614:13;8636:53;8682:6;8677:3;8670:4;8662:6;8658:17;8636:53;:::i;:::-;8758:2;8754:15;;;;-1:-1:-1;;8750:53:1;8711:16;;;;8736:68;;;8831:2;8820:14;;8425:415;-1:-1:-1;;8425:415:1:o;8845:456::-;9066:3;9094:38;9128:3;9120:6;9094:38;:::i;:::-;9161:6;9155:13;9177:52;9222:6;9218:2;9211:4;9203:6;9199:17;9177:52;:::i;:::-;9245:50;9287:6;9283:2;9279:15;9271:6;9245:50;:::i;:::-;9238:57;8845:456;-1:-1:-1;;;;;;;8845:456:1:o;10345:431::-;-1:-1:-1;;;;;10602:15:1;;;10584:34;;10654:15;;10649:2;10634:18;;10627:43;10706:2;10701;10686:18;;10679:30;;;10527:4;;10726:44;;10751:18;;10743:6;10726:44;:::i;:::-;10718:52;10345:431;-1:-1:-1;;;;;10345:431:1:o;10781:488::-;-1:-1:-1;;;;;11050:15:1;;;11032:34;;11102:15;;11097:2;11082:18;;11075:43;11149:2;11134:18;;11127:34;;;11197:3;11192:2;11177:18;;11170:31;;;10975:4;;11218:45;;11243:19;;11235:6;11218:45;:::i;:::-;11210:53;10781:488;-1:-1:-1;;;;;;10781:488:1:o;11274:632::-;11445:2;11497:21;;;11567:13;;11470:18;;;11589:22;;;11416:4;;11445:2;11668:15;;;;11642:2;11627:18;;;11416:4;11711:169;11725:6;11722:1;11719:13;11711:169;;;11786:13;;11774:26;;11855:15;;;;11820:12;;;;11747:1;11740:9;11711:169;;;-1:-1:-1;11897:3:1;;11274:632;-1:-1:-1;;;;;;11274:632:1:o;13110:217::-;13257:2;13246:9;13239:21;13220:4;13277:44;13317:2;13306:9;13302:18;13294:6;13277:44;:::i;13968:414::-;14170:2;14152:21;;;14209:2;14189:18;;;14182:30;14248:34;14243:2;14228:18;;14221:62;-1:-1:-1;;;14314:2:1;14299:18;;14292:48;14372:3;14357:19;;13968:414::o;21053:356::-;21255:2;21237:21;;;21274:18;;;21267:30;21333:34;21328:2;21313:18;;21306:62;21400:2;21385:18;;21053:356::o;22973:413::-;23175:2;23157:21;;;23214:2;23194:18;;;23187:30;23253:34;23248:2;23233:18;;23226:62;-1:-1:-1;;;23319:2:1;23304:18;;23297:47;23376:3;23361:19;;22973:413::o;25413:275::-;25484:2;25478:9;25549:2;25530:13;;-1:-1:-1;;25526:27:1;25514:40;;25584:18;25569:34;;25605:22;;;25566:62;25563:88;;;25631:18;;:::i;:::-;25667:2;25660:22;25413:275;;-1:-1:-1;25413:275:1:o;25819:128::-;25859:3;25890:1;25886:6;25883:1;25880:13;25877:39;;;25896:18;;:::i;:::-;-1:-1:-1;25932:9:1;;25819:128::o;25952:204::-;25990:3;26026:4;26023:1;26019:12;26058:4;26055:1;26051:12;26093:3;26087:4;26083:14;26078:3;26075:23;26072:49;;;26101:18;;:::i;:::-;26137:13;;25952:204;-1:-1:-1;;;25952:204:1:o;26161:120::-;26201:1;26227;26217:35;;26232:18;;:::i;:::-;-1:-1:-1;26266:9:1;;26161:120::o;26286:125::-;26326:4;26354:1;26351;26348:8;26345:34;;;26359:18;;:::i;:::-;-1:-1:-1;26396:9:1;;26286:125::o;26416:258::-;26488:1;26498:113;26512:6;26509:1;26506:13;26498:113;;;26588:11;;;26582:18;26569:11;;;26562:39;26534:2;26527:10;26498:113;;;26629:6;26626:1;26623:13;26620:48;;;-1:-1:-1;;26664:1:1;26646:16;;26639:27;26416:258::o;26679:380::-;26758:1;26754:12;;;;26801;;;26822:61;;26876:4;26868:6;26864:17;26854:27;;26822:61;26929:2;26921:6;26918:14;26898:18;26895:38;26892:161;;;26975:10;26970:3;26966:20;26963:1;26956:31;27010:4;27007:1;27000:15;27038:4;27035:1;27028:15;26892:161;;26679:380;;;:::o;27064:135::-;27103:3;-1:-1:-1;;27124:17:1;;27121:43;;;27144:18;;:::i;:::-;-1:-1:-1;27191:1:1;27180:13;;27064:135::o;27204:201::-;27242:3;27270:10;27315:2;27308:5;27304:14;27342:2;27333:7;27330:15;27327:41;;;27348:18;;:::i;:::-;27397:1;27384:15;;27204:201;-1:-1:-1;;;27204:201:1:o;27410:175::-;27447:3;27491:4;27484:5;27480:16;27520:4;27511:7;27508:17;27505:43;;;27528:18;;:::i;:::-;27577:1;27564:15;;27410:175;-1:-1:-1;;27410:175:1:o;27590:112::-;27622:1;27648;27638:35;;27653:18;;:::i;:::-;-1:-1:-1;27687:9:1;;27590:112::o;27707:127::-;27768:10;27763:3;27759:20;27756:1;27749:31;27799:4;27796:1;27789:15;27823:4;27820:1;27813:15;27839:127;27900:10;27895:3;27891:20;27888:1;27881:31;27931:4;27928:1;27921:15;27955:4;27952:1;27945:15;27971:127;28032:10;28027:3;28023:20;28020:1;28013:31;28063:4;28060:1;28053:15;28087:4;28084:1;28077:15;28103:127;28164:10;28159:3;28155:20;28152:1;28145:31;28195:4;28192:1;28185:15;28219:4;28216:1;28209:15;28235:127;28296:10;28291:3;28287:20;28284:1;28277:31;28327:4;28324:1;28317:15;28351:4;28348:1;28341:15;28367:131;-1:-1:-1;;;;;;28441:32:1;;28431:43;;28421:71;;28488:1;28485;28478:12

Swarm Source

ipfs://2ed907315e48c49ccbcdcae5757e24760d7ef73b1aac7d8cf4f329e5ae76fa63
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

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