ETH Price: $2,648.27 (+0.22%)

Token

Metakicks Portal Key (MTKSKEY)
 

Overview

Max Total Supply

0 MTKSKEY

Holders

382

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
Null: 0x000...000
Balance
0 MTKSKEY
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Metakicks Portal Key acts like a pass, and is your key to the Metakicks universe. Each key holder is eligible for monthly physical airdrops and retail drops of highly coveted Sneakers & Streetwear

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
PortalKey

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
/// @dev Note that balanceOf does not revert if passed the zero address, in defiance of the ERC.
abstract contract ERC721 {
    /*///////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*///////////////////////////////////////////////////////////////
                          METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*///////////////////////////////////////////////////////////////
                            ERC721 STORAGE                        
    //////////////////////////////////////////////////////////////*/

    mapping(address => uint256) public balanceOf;

    mapping(uint256 => address) public ownerOf;

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*///////////////////////////////////////////////////////////////
                              CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*///////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || msg.sender == getApproved[id] || isApprovedForAll[from][msg.sender],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            balanceOf[from]--;

            balanceOf[to]++;
        }

        ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes memory data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*///////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public pure virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*///////////////////////////////////////////////////////////////
                       INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            balanceOf[to]++;
        }

        ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = ownerOf[id];

        require(ownerOf[id] != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            balanceOf[owner]--;
        }

        delete ownerOf[id];

        delete getApproved[id];

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

    /*///////////////////////////////////////////////////////////////
                       INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/tokens/ERC721.sol)
interface ERC721TokenReceiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 id,
        bytes calldata data
    ) external returns (bytes4);
}

// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

// OpenZeppelin Contracts (last updated v4.7.0) (utils/math/Math.sol)

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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

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

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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);
    }
}

/// @notice Gas optimized reentrancy protection for smart contracts.
/// @author Solmate (https://github.com/Rari-Capital/solmate/blob/main/src/utils/ReentrancyGuard.sol)
/// @author Modified from OpenZeppelin (https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/security/ReentrancyGuard.sol)
abstract contract ReentrancyGuard {
    uint256 private locked = 1;

    modifier nonReentrant() {
        require(locked == 1, "REENTRANCY");

        locked = 2;

        _;

        locked = 1;
    }
}

/// @title Mintable ERC721 Metakicks Portal Key
contract PortalKey is ERC721, Ownable, ReentrancyGuard {
    using Strings for uint256;

    enum SaleStatus {
        NotStarted,
        Whitelist,
        Public,
        Migration
    }

    /*///////////////////////////////////////////////////////////////
                              EVENTS
    //////////////////////////////////////////////////////////////*/

    /// @dev Emitted when the mint price is updated
    /// @param mintPrice The new mintPrice
    event MintPriceUpdated(uint256 mintPrice);

    /// @dev Emitted when the current sale status is updated
    /// @param status The new sale status
    event CurrentSaleStatusUpdated(SaleStatus status);

    /// @dev Emitted when the baseURI is updated
    /// @param baseURI The new baseURI
    event BaseUriUpdated(string baseURI);

    /// @dev Emitted when maxPerTx is updated
    /// @param maxPerTx The new maxPerTx
    event MaxPerTxUpdated(uint256 maxPerTx);

    /// @dev Emitted when the funds are withdrawed to the treasury
    /// @param amount The amount withdrawed
    event FundsWithdrawed(uint256 amount);

    /*///////////////////////////////////////////////////////////////
                        IMMUTABLE/CONSTANTS
    //////////////////////////////////////////////////////////////*/

    /// @notice Treasury (multisig) address to receiving the funds
    address public immutable treasury;

    /// @notice Max amount, can't mint more
    uint256 public constant MAX_AMOUNT = 555;

    /*///////////////////////////////////////////////////////////////
                             VARIABLES
    //////////////////////////////////////////////////////////////*/

    /// @notice The mint price for each key
    uint256 public mintPrice = 0.15 ether;

    /// @notice Current tokenID
    uint256 public currentTokenId;

    /// @notice Max amount to mint per address (public sale)
    uint256 public maxPerTx = 2;

    /// @notice baseURI for the keys
    string public baseURI;

    /// @notice Current sale status (inital is "NotStarted")
    SaleStatus public currentSaleStatus;

    /// @notice Whitelisted addresses with allowed quantity to mint (whitelist sale)
    mapping(address => uint256) public whitelist;

    /// @notice Whitelisted addresses with allowed quantity to mint (private sale)
    mapping(address => uint256) public privateList;

    /// @notice Addresses that have already minted (public sale) with the amount.
    mapping(address => uint256) public minted;

    /*///////////////////////////////////////////////////////////////
                             CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _baseURI, address _treasury)
        ERC721("Metakicks Portal Key", "MTKSKEY")
    {
        require(_treasury != address(0), "Invalid address");
        baseURI = _baseURI;
        treasury = _treasury;
    }

    /*///////////////////////////////////////////////////////////////
                           METADATA LOGIC
    //////////////////////////////////////////////////////////////*/

    /// @inheritdoc ERC721
    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            bytes(baseURI).length > 0
                ? string(abi.encodePacked(baseURI, tokenId.toString()))
                : "";
    }

    /*///////////////////////////////////////////////////////////////
                           MINT FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Public sale, 1 Token/Amount per users
    /// @param amount The amount to mint (ERC1155 amount)
    function publicSale(uint256 amount) external payable nonReentrant {
        _publicSale(msg.value, amount, msg.sender);
    }

    /// @notice Public sale, 1 Token/Amount per users
    /// @param amount The amount to mint (ERC1155 amount)
    /// @param to The address receiving the Portal Key
    function publicSale(uint256 amount, address to)
        external
        payable
        nonReentrant
    {
        _publicSale(msg.value, amount, to);
    }

    /// @notice Whitelist sale for whitelisted users
    /// @param amount The amount to mint
    /// Note: Will mint the amount specified during the whitelist (by the owner)
    function whitelistSale(uint256 amount) external payable nonReentrant {
        _whitelistSale(msg.value, msg.sender, amount);
    }

    /// @notice Whitelist sale for whitelisted users
    /// @param amount The amount to mint
    /// @param to The address receiving the Portal Key
    /// Note: Will mint the amount specified during the whitelist (by the owner)
    function whitelistSale(uint256 amount, address to)
        external
        payable
        nonReentrant
    {
        _whitelistSale(msg.value, to, amount);
    }

    /// @notice Private sale (free)
    /// Note: Will mint the amount specified while adding to the private list
    ///       (by the owner). The private sale is during the whitelist sale.
    function privateSale() external nonReentrant {
        require(
            currentSaleStatus == SaleStatus.Whitelist,
            "MINT: not in private sale"
        );
        uint256 amount = privateList[msg.sender];
        require(amount != 0, "MINT: Not allowed");
        require(
            currentTokenId + amount <= MAX_AMOUNT,
            "MINT: Max amount reached"
        );

        privateList[msg.sender] = 0;
        unchecked {
            minted[msg.sender] += amount;
        }

        for (uint256 i = 0; i < amount; ++i) {
            unchecked {
                currentTokenId++;
            }
            _safeMint(msg.sender, currentTokenId);
        }
    }

    /*///////////////////////////////////////////////////////////////
                           OWNER FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    /// @notice Update the price for the Whitelist and Public Sale
    /// @param _mintPrice The new mint price
    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
        emit MintPriceUpdated(_mintPrice);
    }

    /// @notice Update the sale status
    /// @param _status The new status
    function setCurrentSaleStatus(SaleStatus _status) external onlyOwner {
        currentSaleStatus = _status;
        emit CurrentSaleStatusUpdated(_status);
    }

    /// @notice Update the maximum amount per Tx (public sale)
    /// @param _maxPerTx The new amount
    function setMaxPerTx(uint256 _maxPerTx) external onlyOwner {
        require(_maxPerTx != 0, "Invalid amount");
        maxPerTx = _maxPerTx;
        emit MaxPerTxUpdated(_maxPerTx);
    }

    /// @notice Add addresses to the whitelist
    /// Note: If an address is already added, it will update the amount
    /// @param addrs List of addresses to whitelist
    /// @param amounts Respective amounts for each addresses
    function addToWhitelist(address[] memory addrs, uint256[] memory amounts)
        external
        onlyOwner
    {
        require(addrs.length == amounts.length, "Length error");
        uint256 length = addrs.length;
        for (uint256 i; i < length; ) {
            whitelist[addrs[i]] = amounts[i];
            unchecked {
                i++;
            }
        }
    }

    /// @notice Add addresses to the private list
    /// Note: If an address is already added, it will update the amount
    /// @param addrs List of addresses to add to the private list
    /// @param amounts Respective amounts for each addresses
    function addToPrivateList(address[] memory addrs, uint256[] memory amounts)
        external
        onlyOwner
    {
        require(addrs.length == amounts.length, "Length error");
        uint256 length = addrs.length;
        for (uint256 i; i < length; ) {
            privateList[addrs[i]] = amounts[i];
            unchecked {
                i++;
            }
        }
    }

    /// @notice Update the baseURI
    /// @param _baseURI the new _baseURI
    function setBaseUri(string memory _baseURI) external onlyOwner {
        baseURI = _baseURI;
        emit BaseUriUpdated(_baseURI);
    }

    /// @notice Allow the owner to withdraw the funds from the sale.
    function withdrawFunds() external onlyOwner {
        uint256 toWithdraw = address(this).balance;
        payable(treasury).transfer(toWithdraw);
        emit FundsWithdrawed(toWithdraw);
    }

    /*///////////////////////////////////////////////////////////////
                          PRIVATE FUNCTIONS
    //////////////////////////////////////////////////////////////*/

    function _publicSale(
        uint256 msgValue,
        uint256 amount,
        address to
    ) private {
        require(amount != 0, "MINT: invalid amount");
        require(
            currentSaleStatus == SaleStatus.Public,
            "MINT: not in public sale"
        );
        require(minted[to] + amount <= maxPerTx, "MINT: Can't mint more");
        require(msgValue >= mintPrice * amount, "MINT: Not enough eth");
        require(
            currentTokenId + amount <= MAX_AMOUNT,
            "MINT: Max amount reached"
        );

        unchecked {
            minted[to] += amount;
        }

        for (uint256 i = 0; i < amount; ++i) {
            unchecked {
                currentTokenId++;
            }
            _safeMint(to, currentTokenId);
        }
    }

    function _whitelistSale(
        uint256 msgValue,
        address to,
        uint256 amount
    ) private {
        require(
            currentSaleStatus == SaleStatus.Whitelist,
            "MINT: not in whitelist sale"
        );
        uint256 amountAllowed = whitelist[to];
        require(amount != 0 && amount <= amountAllowed, "MINT: Not allowed");
        require(msgValue >= mintPrice * amount, "MINT: Not enough eth");
        require(
            currentTokenId + amount <= MAX_AMOUNT,
            "MINT: Max amount reached"
        );

        whitelist[to] -= amount;

        unchecked {
            minted[to] += amount;
        }

        for (uint256 i = 0; i < amount; ++i) {
            unchecked {
                currentTokenId++;
            }
            _safeMint(to, currentTokenId);
        }
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_treasury","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","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":"string","name":"baseURI","type":"string"}],"name":"BaseUriUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum PortalKey.SaleStatus","name":"status","type":"uint8"}],"name":"CurrentSaleStatusUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"FundsWithdrawed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"maxPerTx","type":"uint256"}],"name":"MaxPerTxUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"MintPriceUpdated","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_AMOUNT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addToPrivateList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSaleStatus","outputs":[{"internalType":"enum PortalKey.SaleStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"privateList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","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":"_baseURI","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum PortalKey.SaleStatus","name":"_status","type":"uint8"}],"name":"setCurrentSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPerTx","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"treasury","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"address","name":"to","type":"address"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"whitelistSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a06040526001600755670214e8348c4f00006008556002600a553480156200002757600080fd5b506040516200271c3803806200271c8339810160408190526200004a9162000286565b604080518082018252601481527f4d6574616b69636b7320506f7274616c204b65790000000000000000000000006020808301918252835180850190945260078452664d544b534b455960c81b908401528151919291620000ae91600091620001ad565b508051620000c4906001906020840190620001ad565b505050620000e1620000db6200015760201b60201c565b6200015b565b6001600160a01b0381166200012e5760405162461bcd60e51b815260206004820152600f60248201526e496e76616c6964206164647265737360881b604482015260640160405180910390fd5b81516200014390600b906020850190620001ad565b506001600160a01b031660805250620003b3565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620001bb9062000377565b90600052602060002090601f016020900481019282620001df57600085556200022a565b82601f10620001fa57805160ff19168380011785556200022a565b828001600101855582156200022a579182015b828111156200022a5782518255916020019190600101906200020d565b50620002389291506200023c565b5090565b5b808211156200023857600081556001016200023d565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b03811681146200028157600080fd5b919050565b600080604083850312156200029a57600080fd5b82516001600160401b0380821115620002b257600080fd5b818501915085601f830112620002c757600080fd5b815181811115620002dc57620002dc62000253565b604051601f8201601f19908116603f0116810190838211818310171562000307576200030762000253565b816040528281526020935088848487010111156200032457600080fd5b600091505b8282101562000348578482018401518183018501529083019062000329565b828211156200035a5760008484830101525b95506200036c91505085820162000269565b925050509250929050565b600181811c908216806200038c57607f821691505b602082108103620003ad57634e487b7160e01b600052602260045260246000fd5b50919050565b608051612346620003d6600039600081816103ce0152610b3b01526123466000f3fe6080604052600436106102245760003560e01c80637bddc97c11610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610678578063f2fde38b146106b3578063f4a0a528146106d3578063f8d50542146106f3578063f968adbe1461071357600080fd5b8063b88d4fde146105ed578063ba1f879f1461060d578063c6f6f21614610622578063c87b56dd14610642578063d40dc8701461066257600080fd5b80639b19251a116100f25780639b19251a1461054d578063a0bcfc7f1461057a578063a22cb4651461059a578063ab619cfe146105ba578063b287c8ed146105da57600080fd5b80637bddc97c146104cd5780638da5cb5b146104ed57806394667c171461050b57806395d89b411461053857600080fd5b806324600fc3116101b15780636c0360eb116101755780636c0360eb1461043c5780636ed09aae1461045157806370a0823114610478578063715018a6146104a5578063787c19b2146104ba57600080fd5b806324600fc31461038757806342842e0e1461039c57806361d027b3146103bc5780636352211e146103f05780636817c76c1461042657600080fd5b8063095ea7b3116101f8578063095ea7b3146102f25780630aa148561461031457806318a74876146103275780631e7269c51461033a57806323b872dd1461036757600080fd5b80629a9b7b1461022957806301ffc9a71461025257806306fdde0314610282578063081812fc146102a4575b600080fd5b34801561023557600080fd5b5061023f60095481565b6040519081526020015b60405180910390f35b34801561025e57600080fd5b5061027261026d366004611bb1565b610729565b6040519015158152602001610249565b34801561028e57600080fd5b5061029761077b565b6040516102499190611c2d565b3480156102b057600080fd5b506102da6102bf366004611c40565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610249565b3480156102fe57600080fd5b5061031261030d366004611c75565b610809565b005b610312610322366004611c9f565b6108f0565b610312610335366004611c9f565b61092b565b34801561034657600080fd5b5061023f610355366004611ccb565b600f6020526000908152604090205481565b34801561037357600080fd5b50610312610382366004611ce6565b61095d565b34801561039357600080fd5b50610312610b24565b3480156103a857600080fd5b506103126103b7366004611ce6565b610bbc565b3480156103c857600080fd5b506102da7f000000000000000000000000000000000000000000000000000000000000000081565b3480156103fc57600080fd5b506102da61040b366004611c40565b6003602052600090815260409020546001600160a01b031681565b34801561043257600080fd5b5061023f60085481565b34801561044857600080fd5b50610297610c91565b34801561045d57600080fd5b50600c5461046b9060ff1681565b6040516102499190611d38565b34801561048457600080fd5b5061023f610493366004611ccb565b60026020526000908152604090205481565b3480156104b157600080fd5b50610312610c9e565b6103126104c8366004611c40565b610cb2565b3480156104d957600080fd5b506103126104e8366004611d60565b610cec565b3480156104f957600080fd5b506006546001600160a01b03166102da565b34801561051757600080fd5b5061023f610526366004611ccb565b600e6020526000908152604090205481565b34801561054457600080fd5b50610297610d47565b34801561055957600080fd5b5061023f610568366004611ccb565b600d6020526000908152604090205481565b34801561058657600080fd5b50610312610595366004611e20565b610d54565b3480156105a657600080fd5b506103126105b5366004611e71565b610d9f565b3480156105c657600080fd5b506103126105d5366004611f3c565b610e0b565b6103126105e8366004611c40565b610ec2565b3480156105f957600080fd5b50610312610608366004611ffc565b610ef4565b34801561061957600080fd5b50610312610fb0565b34801561062e57600080fd5b5061031261063d366004611c40565b611111565b34801561064e57600080fd5b5061029761065d366004611c40565b61118f565b34801561066e57600080fd5b5061023f61022b81565b34801561068457600080fd5b50610272610693366004612078565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106bf57600080fd5b506103126106ce366004611ccb565b6111ed565b3480156106df57600080fd5b506103126106ee366004611c40565b611266565b3480156106ff57600080fd5b5061031261070e366004611f3c565b6112a3565b34801561071f57600080fd5b5061023f600a5481565b60006301ffc9a760e01b6001600160e01b03198316148061075a57506380ac58cd60e01b6001600160e01b03198316145b806107755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60008054610788906120a2565b80601f01602080910402602001604051908101604052809291908181526020018280546107b4906120a2565b80156108015780601f106107d657610100808354040283529160200191610801565b820191906000526020600020905b8154815290600101906020018083116107e457829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b03163381148061085257506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6007546001146109125760405162461bcd60e51b815260040161088b906120dc565b6002600755610922348383611354565b50506001600755565b60075460011461094d5760405162461bcd60e51b815260040161088b906120dc565b600260075561092234828461153e565b6000818152600360205260409020546001600160a01b038481169116146109b35760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161088b565b6001600160a01b0382166109fd5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161088b565b336001600160a01b0384161480610a2a57506000818152600460205260409020546001600160a01b031633145b80610a5857506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b610a955760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161088b565b6001600160a01b0380841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b2c611710565b60405147906001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000169082156108fc029083906000818181858888f19350505050158015610b84573d6000803e3d6000fd5b506040518181527f52e174983257f2fd1e3b62cc7654880dc728a2e843ef321a751266081588c1cb906020015b60405180910390a150565b610bc783838361095d565b6001600160a01b0382163b1580610c705750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c649190612100565b6001600160e01b031916145b610c8c5760405162461bcd60e51b815260040161088b9061211d565b505050565b600b8054610788906120a2565b610ca6611710565b610cb0600061176a565b565b600754600114610cd45760405162461bcd60e51b815260040161088b906120dc565b6002600755610ce434338361153e565b506001600755565b610cf4611710565b600c805482919060ff19166001836003811115610d1357610d13611d22565b02179055507f1564ace3118e34f8ae9bced001a47ec02dd804494128adebece481288f4c35d681604051610bb19190611d38565b60018054610788906120a2565b610d5c611710565b8051610d6f90600b906020840190611b02565b507f24a9152dc695ecc801ad580886331ee12d7aac0fa2ae341a5ae3c2ccae36cb4f81604051610bb19190611c2d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e13611710565b8051825114610e535760405162461bcd60e51b815260206004820152600c60248201526b2632b733ba341032b93937b960a11b604482015260640161088b565b815160005b81811015610ebc57828181518110610e7257610e72612147565b6020026020010151600e6000868481518110610e9057610e90612147565b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610e58565b50505050565b600754600114610ee45760405162461bcd60e51b815260040161088b906120dc565b6002600755610ce4348233611354565b610eff84848461095d565b6001600160a01b0383163b1580610f945750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610f4590339089908890889060040161215d565b6020604051808303816000875af1158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190612100565b6001600160e01b031916145b610ebc5760405162461bcd60e51b815260040161088b9061211d565b600754600114610fd25760405162461bcd60e51b815260040161088b906120dc565b60026007556001600c5460ff166003811115610ff057610ff0611d22565b1461103d5760405162461bcd60e51b815260206004820152601960248201527f4d494e543a206e6f7420696e20707269766174652073616c6500000000000000604482015260640161088b565b336000908152600e6020526040812054908190036110915760405162461bcd60e51b8152602060048201526011602482015270135253950e88139bdd08185b1b1bddd959607a1b604482015260640161088b565b61022b816009546110a291906121b0565b11156110c05760405162461bcd60e51b815260040161088b906121c8565b336000908152600e60209081526040808320839055600f90915281208054830190555b818110156109225760098054600101908190556111019033906117bc565b61110a816121ff565b90506110e3565b611119611710565b8060000361115a5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161088b565b600a8190556040518181527fc9d409c775d2f15b728463cf72bc5e79ee59240c272bbb27a2ed19478333dac090602001610bb1565b60606000600b80546111a0906120a2565b9050116111bc5760405180602001604052806000815250610775565b600b6111c78361188c565b6040516020016111d8929190612234565b60405160208183030381529060405292915050565b6111f5611710565b6001600160a01b03811661125a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b6112638161176a565b50565b61126e611710565b60088190556040518181527f525b762709cc2a983aec5ccdfd807a061f993c91090b5bcd7da92ca254976aaa90602001610bb1565b6112ab611710565b80518251146112eb5760405162461bcd60e51b815260206004820152600c60248201526b2632b733ba341032b93937b960a11b604482015260640161088b565b815160005b81811015610ebc5782818151811061130a5761130a612147565b6020026020010151600d600086848151811061132857611328612147565b6020908102919091018101516001600160a01b03168252810191909152604001600020556001016112f0565b8160000361139b5760405162461bcd60e51b8152602060048201526014602482015273135253950e881a5b9d985b1a5908185b5bdd5b9d60621b604482015260640161088b565b6002600c5460ff1660038111156113b4576113b4611d22565b146114015760405162461bcd60e51b815260206004820152601860248201527f4d494e543a206e6f7420696e207075626c69632073616c650000000000000000604482015260640161088b565b600a546001600160a01b0382166000908152600f60205260409020546114289084906121b0565b111561146e5760405162461bcd60e51b81526020600482015260156024820152744d494e543a2043616e2774206d696e74206d6f726560581b604482015260640161088b565b8160085461147c91906122da565b8310156114c25760405162461bcd60e51b815260206004820152601460248201527309a929ca874409cdee840cadcdeeaced040cae8d60631b604482015260640161088b565b61022b826009546114d391906121b0565b11156114f15760405162461bcd60e51b815260040161088b906121c8565b6001600160a01b0381166000908152600f602052604081208054840190555b82811015610ebc57600980546001019081905561152e9083906117bc565b611537816121ff565b9050611510565b6001600c5460ff16600381111561155757611557611d22565b146115a45760405162461bcd60e51b815260206004820152601b60248201527f4d494e543a206e6f7420696e2077686974656c6973742073616c650000000000604482015260640161088b565b6001600160a01b0382166000908152600d602052604090205481158015906115cc5750808211155b61160c5760405162461bcd60e51b8152602060048201526011602482015270135253950e88139bdd08185b1b1bddd959607a1b604482015260640161088b565b8160085461161a91906122da565b8410156116605760405162461bcd60e51b815260206004820152601460248201527309a929ca874409cdee840cadcdeeaced040cae8d60631b604482015260640161088b565b61022b8260095461167191906121b0565b111561168f5760405162461bcd60e51b815260040161088b906121c8565b6001600160a01b0383166000908152600d6020526040812080548492906116b79084906122f9565b90915550506001600160a01b0383166000908152600f602052604081208054840190555b828110156117095760098054600101908190556116f99085906117bc565b611702816121ff565b90506116db565b5050505050565b6006546001600160a01b03163314610cb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088b565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6117c6828261191f565b6001600160a01b0382163b158061186c5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af115801561183c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118609190612100565b6001600160e01b031916145b6118885760405162461bcd60e51b815260040161088b9061211d565b5050565b6060600061189983611a2a565b600101905060008167ffffffffffffffff8111156118b9576118b9611d81565b6040519080825280601f01601f1916602001820160405280156118e3576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846118ed57509392505050565b6001600160a01b0382166119695760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161088b565b6000818152600360205260409020546001600160a01b0316156119bf5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161088b565b6001600160a01b038216600081815260026020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a695772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a95576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ab357662386f26fc10000830492506010015b6305f5e1008310611acb576305f5e100830492506008015b6127108310611adf57612710830492506004015b60648310611af1576064830492506002015b600a83106107755760010192915050565b828054611b0e906120a2565b90600052602060002090601f016020900481019282611b305760008555611b76565b82601f10611b4957805160ff1916838001178555611b76565b82800160010185558215611b76579182015b82811115611b76578251825591602001919060010190611b5b565b50611b82929150611b86565b5090565b5b80821115611b825760008155600101611b87565b6001600160e01b03198116811461126357600080fd5b600060208284031215611bc357600080fd5b8135611bce81611b9b565b9392505050565b60005b83811015611bf0578181015183820152602001611bd8565b83811115610ebc5750506000910152565b60008151808452611c19816020860160208601611bd5565b601f01601f19169290920160200192915050565b602081526000611bce6020830184611c01565b600060208284031215611c5257600080fd5b5035919050565b80356001600160a01b0381168114611c7057600080fd5b919050565b60008060408385031215611c8857600080fd5b611c9183611c59565b946020939093013593505050565b60008060408385031215611cb257600080fd5b82359150611cc260208401611c59565b90509250929050565b600060208284031215611cdd57600080fd5b611bce82611c59565b600080600060608486031215611cfb57600080fd5b611d0484611c59565b9250611d1260208501611c59565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611d5a57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215611d7257600080fd5b813560048110611bce57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dc057611dc0611d81565b604052919050565b600067ffffffffffffffff831115611de257611de2611d81565b611df5601f8401601f1916602001611d97565b9050828152838383011115611e0957600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e3257600080fd5b813567ffffffffffffffff811115611e4957600080fd5b8201601f81018413611e5a57600080fd5b611e6984823560208401611dc8565b949350505050565b60008060408385031215611e8457600080fd5b611e8d83611c59565b915060208301358015158114611ea257600080fd5b809150509250929050565b600067ffffffffffffffff821115611ec757611ec7611d81565b5060051b60200190565b600082601f830112611ee257600080fd5b81356020611ef7611ef283611ead565b611d97565b82815260059290921b84018101918181019086841115611f1657600080fd5b8286015b84811015611f315780358352918301918301611f1a565b509695505050505050565b60008060408385031215611f4f57600080fd5b823567ffffffffffffffff80821115611f6757600080fd5b818501915085601f830112611f7b57600080fd5b81356020611f8b611ef283611ead565b82815260059290921b84018101918181019089841115611faa57600080fd5b948201945b83861015611fcf57611fc086611c59565b82529482019490820190611faf565b96505086013592505080821115611fe557600080fd5b50611ff285828601611ed1565b9150509250929050565b6000806000806080858703121561201257600080fd5b61201b85611c59565b935061202960208601611c59565b925060408501359150606085013567ffffffffffffffff81111561204c57600080fd5b8501601f8101871361205d57600080fd5b61206c87823560208401611dc8565b91505092959194509250565b6000806040838503121561208b57600080fd5b61209483611c59565b9150611cc260208401611c59565b600181811c908216806120b657607f821691505b6020821081036120d657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b60006020828403121561211257600080fd5b8151611bce81611b9b565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219090830184611c01565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156121c3576121c361219a565b500190565b60208082526018908201527f4d494e543a204d617820616d6f756e7420726561636865640000000000000000604082015260600190565b6000600182016122115761221161219a565b5060010190565b6000815161222a818560208601611bd5565b9290920192915050565b600080845481600182811c91508083168061225057607f831692505b6020808410820361226f57634e487b7160e01b86526022600452602486fd5b8180156122835760018114612294576122c1565b60ff198616895284890196506122c1565b60008b81526020902060005b868110156122b95781548b8201529085019083016122a0565b505084890196505b5050505050506122d18185612218565b95945050505050565b60008160001904831182151516156122f4576122f461219a565b500290565b60008282101561230b5761230b61219a565b50039056fea26469706673582212205efae5f215369e474cc977f3347db75b1385d7a0f0e49da4574eccd5125f421964736f6c634300080d00330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000673ab74486e90b87f992961981e9d7c1f849f2ad00000000000000000000000000000000000000000000000000000000000000047572692f00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102245760003560e01c80637bddc97c11610123578063b88d4fde116100ab578063e985e9c51161006f578063e985e9c514610678578063f2fde38b146106b3578063f4a0a528146106d3578063f8d50542146106f3578063f968adbe1461071357600080fd5b8063b88d4fde146105ed578063ba1f879f1461060d578063c6f6f21614610622578063c87b56dd14610642578063d40dc8701461066257600080fd5b80639b19251a116100f25780639b19251a1461054d578063a0bcfc7f1461057a578063a22cb4651461059a578063ab619cfe146105ba578063b287c8ed146105da57600080fd5b80637bddc97c146104cd5780638da5cb5b146104ed57806394667c171461050b57806395d89b411461053857600080fd5b806324600fc3116101b15780636c0360eb116101755780636c0360eb1461043c5780636ed09aae1461045157806370a0823114610478578063715018a6146104a5578063787c19b2146104ba57600080fd5b806324600fc31461038757806342842e0e1461039c57806361d027b3146103bc5780636352211e146103f05780636817c76c1461042657600080fd5b8063095ea7b3116101f8578063095ea7b3146102f25780630aa148561461031457806318a74876146103275780631e7269c51461033a57806323b872dd1461036757600080fd5b80629a9b7b1461022957806301ffc9a71461025257806306fdde0314610282578063081812fc146102a4575b600080fd5b34801561023557600080fd5b5061023f60095481565b6040519081526020015b60405180910390f35b34801561025e57600080fd5b5061027261026d366004611bb1565b610729565b6040519015158152602001610249565b34801561028e57600080fd5b5061029761077b565b6040516102499190611c2d565b3480156102b057600080fd5b506102da6102bf366004611c40565b6004602052600090815260409020546001600160a01b031681565b6040516001600160a01b039091168152602001610249565b3480156102fe57600080fd5b5061031261030d366004611c75565b610809565b005b610312610322366004611c9f565b6108f0565b610312610335366004611c9f565b61092b565b34801561034657600080fd5b5061023f610355366004611ccb565b600f6020526000908152604090205481565b34801561037357600080fd5b50610312610382366004611ce6565b61095d565b34801561039357600080fd5b50610312610b24565b3480156103a857600080fd5b506103126103b7366004611ce6565b610bbc565b3480156103c857600080fd5b506102da7f000000000000000000000000673ab74486e90b87f992961981e9d7c1f849f2ad81565b3480156103fc57600080fd5b506102da61040b366004611c40565b6003602052600090815260409020546001600160a01b031681565b34801561043257600080fd5b5061023f60085481565b34801561044857600080fd5b50610297610c91565b34801561045d57600080fd5b50600c5461046b9060ff1681565b6040516102499190611d38565b34801561048457600080fd5b5061023f610493366004611ccb565b60026020526000908152604090205481565b3480156104b157600080fd5b50610312610c9e565b6103126104c8366004611c40565b610cb2565b3480156104d957600080fd5b506103126104e8366004611d60565b610cec565b3480156104f957600080fd5b506006546001600160a01b03166102da565b34801561051757600080fd5b5061023f610526366004611ccb565b600e6020526000908152604090205481565b34801561054457600080fd5b50610297610d47565b34801561055957600080fd5b5061023f610568366004611ccb565b600d6020526000908152604090205481565b34801561058657600080fd5b50610312610595366004611e20565b610d54565b3480156105a657600080fd5b506103126105b5366004611e71565b610d9f565b3480156105c657600080fd5b506103126105d5366004611f3c565b610e0b565b6103126105e8366004611c40565b610ec2565b3480156105f957600080fd5b50610312610608366004611ffc565b610ef4565b34801561061957600080fd5b50610312610fb0565b34801561062e57600080fd5b5061031261063d366004611c40565b611111565b34801561064e57600080fd5b5061029761065d366004611c40565b61118f565b34801561066e57600080fd5b5061023f61022b81565b34801561068457600080fd5b50610272610693366004612078565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106bf57600080fd5b506103126106ce366004611ccb565b6111ed565b3480156106df57600080fd5b506103126106ee366004611c40565b611266565b3480156106ff57600080fd5b5061031261070e366004611f3c565b6112a3565b34801561071f57600080fd5b5061023f600a5481565b60006301ffc9a760e01b6001600160e01b03198316148061075a57506380ac58cd60e01b6001600160e01b03198316145b806107755750635b5e139f60e01b6001600160e01b03198316145b92915050565b60008054610788906120a2565b80601f01602080910402602001604051908101604052809291908181526020018280546107b4906120a2565b80156108015780601f106107d657610100808354040283529160200191610801565b820191906000526020600020905b8154815290600101906020018083116107e457829003601f168201915b505050505081565b6000818152600360205260409020546001600160a01b03163381148061085257506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6108945760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b60448201526064015b60405180910390fd5b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6007546001146109125760405162461bcd60e51b815260040161088b906120dc565b6002600755610922348383611354565b50506001600755565b60075460011461094d5760405162461bcd60e51b815260040161088b906120dc565b600260075561092234828461153e565b6000818152600360205260409020546001600160a01b038481169116146109b35760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161088b565b6001600160a01b0382166109fd5760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161088b565b336001600160a01b0384161480610a2a57506000818152600460205260409020546001600160a01b031633145b80610a5857506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b610a955760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161088b565b6001600160a01b0380841660008181526002602090815260408083208054600019019055938616808352848320805460010190558583526003825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610b2c611710565b60405147906001600160a01b037f000000000000000000000000673ab74486e90b87f992961981e9d7c1f849f2ad169082156108fc029083906000818181858888f19350505050158015610b84573d6000803e3d6000fd5b506040518181527f52e174983257f2fd1e3b62cc7654880dc728a2e843ef321a751266081588c1cb906020015b60405180910390a150565b610bc783838361095d565b6001600160a01b0382163b1580610c705750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610c40573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c649190612100565b6001600160e01b031916145b610c8c5760405162461bcd60e51b815260040161088b9061211d565b505050565b600b8054610788906120a2565b610ca6611710565b610cb0600061176a565b565b600754600114610cd45760405162461bcd60e51b815260040161088b906120dc565b6002600755610ce434338361153e565b506001600755565b610cf4611710565b600c805482919060ff19166001836003811115610d1357610d13611d22565b02179055507f1564ace3118e34f8ae9bced001a47ec02dd804494128adebece481288f4c35d681604051610bb19190611d38565b60018054610788906120a2565b610d5c611710565b8051610d6f90600b906020840190611b02565b507f24a9152dc695ecc801ad580886331ee12d7aac0fa2ae341a5ae3c2ccae36cb4f81604051610bb19190611c2d565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610e13611710565b8051825114610e535760405162461bcd60e51b815260206004820152600c60248201526b2632b733ba341032b93937b960a11b604482015260640161088b565b815160005b81811015610ebc57828181518110610e7257610e72612147565b6020026020010151600e6000868481518110610e9057610e90612147565b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610e58565b50505050565b600754600114610ee45760405162461bcd60e51b815260040161088b906120dc565b6002600755610ce4348233611354565b610eff84848461095d565b6001600160a01b0383163b1580610f945750604051630a85bd0160e11b808252906001600160a01b0385169063150b7a0290610f4590339089908890889060040161215d565b6020604051808303816000875af1158015610f64573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f889190612100565b6001600160e01b031916145b610ebc5760405162461bcd60e51b815260040161088b9061211d565b600754600114610fd25760405162461bcd60e51b815260040161088b906120dc565b60026007556001600c5460ff166003811115610ff057610ff0611d22565b1461103d5760405162461bcd60e51b815260206004820152601960248201527f4d494e543a206e6f7420696e20707269766174652073616c6500000000000000604482015260640161088b565b336000908152600e6020526040812054908190036110915760405162461bcd60e51b8152602060048201526011602482015270135253950e88139bdd08185b1b1bddd959607a1b604482015260640161088b565b61022b816009546110a291906121b0565b11156110c05760405162461bcd60e51b815260040161088b906121c8565b336000908152600e60209081526040808320839055600f90915281208054830190555b818110156109225760098054600101908190556111019033906117bc565b61110a816121ff565b90506110e3565b611119611710565b8060000361115a5760405162461bcd60e51b815260206004820152600e60248201526d125b9d985b1a5908185b5bdd5b9d60921b604482015260640161088b565b600a8190556040518181527fc9d409c775d2f15b728463cf72bc5e79ee59240c272bbb27a2ed19478333dac090602001610bb1565b60606000600b80546111a0906120a2565b9050116111bc5760405180602001604052806000815250610775565b600b6111c78361188c565b6040516020016111d8929190612234565b60405160208183030381529060405292915050565b6111f5611710565b6001600160a01b03811661125a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161088b565b6112638161176a565b50565b61126e611710565b60088190556040518181527f525b762709cc2a983aec5ccdfd807a061f993c91090b5bcd7da92ca254976aaa90602001610bb1565b6112ab611710565b80518251146112eb5760405162461bcd60e51b815260206004820152600c60248201526b2632b733ba341032b93937b960a11b604482015260640161088b565b815160005b81811015610ebc5782818151811061130a5761130a612147565b6020026020010151600d600086848151811061132857611328612147565b6020908102919091018101516001600160a01b03168252810191909152604001600020556001016112f0565b8160000361139b5760405162461bcd60e51b8152602060048201526014602482015273135253950e881a5b9d985b1a5908185b5bdd5b9d60621b604482015260640161088b565b6002600c5460ff1660038111156113b4576113b4611d22565b146114015760405162461bcd60e51b815260206004820152601860248201527f4d494e543a206e6f7420696e207075626c69632073616c650000000000000000604482015260640161088b565b600a546001600160a01b0382166000908152600f60205260409020546114289084906121b0565b111561146e5760405162461bcd60e51b81526020600482015260156024820152744d494e543a2043616e2774206d696e74206d6f726560581b604482015260640161088b565b8160085461147c91906122da565b8310156114c25760405162461bcd60e51b815260206004820152601460248201527309a929ca874409cdee840cadcdeeaced040cae8d60631b604482015260640161088b565b61022b826009546114d391906121b0565b11156114f15760405162461bcd60e51b815260040161088b906121c8565b6001600160a01b0381166000908152600f602052604081208054840190555b82811015610ebc57600980546001019081905561152e9083906117bc565b611537816121ff565b9050611510565b6001600c5460ff16600381111561155757611557611d22565b146115a45760405162461bcd60e51b815260206004820152601b60248201527f4d494e543a206e6f7420696e2077686974656c6973742073616c650000000000604482015260640161088b565b6001600160a01b0382166000908152600d602052604090205481158015906115cc5750808211155b61160c5760405162461bcd60e51b8152602060048201526011602482015270135253950e88139bdd08185b1b1bddd959607a1b604482015260640161088b565b8160085461161a91906122da565b8410156116605760405162461bcd60e51b815260206004820152601460248201527309a929ca874409cdee840cadcdeeaced040cae8d60631b604482015260640161088b565b61022b8260095461167191906121b0565b111561168f5760405162461bcd60e51b815260040161088b906121c8565b6001600160a01b0383166000908152600d6020526040812080548492906116b79084906122f9565b90915550506001600160a01b0383166000908152600f602052604081208054840190555b828110156117095760098054600101908190556116f99085906117bc565b611702816121ff565b90506116db565b5050505050565b6006546001600160a01b03163314610cb05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161088b565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6117c6828261191f565b6001600160a01b0382163b158061186c5750604051630a85bd0160e11b80825233600483015260006024830181905260448301849052608060648401526084830152906001600160a01b0384169063150b7a029060a4016020604051808303816000875af115801561183c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906118609190612100565b6001600160e01b031916145b6118885760405162461bcd60e51b815260040161088b9061211d565b5050565b6060600061189983611a2a565b600101905060008167ffffffffffffffff8111156118b9576118b9611d81565b6040519080825280601f01601f1916602001820160405280156118e3576020820181803683370190505b5090508181016020015b600019016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a85049450846118ed57509392505050565b6001600160a01b0382166119695760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161088b565b6000818152600360205260409020546001600160a01b0316156119bf5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161088b565b6001600160a01b038216600081815260026020908152604080832080546001019055848352600390915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b8310611a695772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef81000000008310611a95576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc100008310611ab357662386f26fc10000830492506010015b6305f5e1008310611acb576305f5e100830492506008015b6127108310611adf57612710830492506004015b60648310611af1576064830492506002015b600a83106107755760010192915050565b828054611b0e906120a2565b90600052602060002090601f016020900481019282611b305760008555611b76565b82601f10611b4957805160ff1916838001178555611b76565b82800160010185558215611b76579182015b82811115611b76578251825591602001919060010190611b5b565b50611b82929150611b86565b5090565b5b80821115611b825760008155600101611b87565b6001600160e01b03198116811461126357600080fd5b600060208284031215611bc357600080fd5b8135611bce81611b9b565b9392505050565b60005b83811015611bf0578181015183820152602001611bd8565b83811115610ebc5750506000910152565b60008151808452611c19816020860160208601611bd5565b601f01601f19169290920160200192915050565b602081526000611bce6020830184611c01565b600060208284031215611c5257600080fd5b5035919050565b80356001600160a01b0381168114611c7057600080fd5b919050565b60008060408385031215611c8857600080fd5b611c9183611c59565b946020939093013593505050565b60008060408385031215611cb257600080fd5b82359150611cc260208401611c59565b90509250929050565b600060208284031215611cdd57600080fd5b611bce82611c59565b600080600060608486031215611cfb57600080fd5b611d0484611c59565b9250611d1260208501611c59565b9150604084013590509250925092565b634e487b7160e01b600052602160045260246000fd5b6020810160048310611d5a57634e487b7160e01b600052602160045260246000fd5b91905290565b600060208284031215611d7257600080fd5b813560048110611bce57600080fd5b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611dc057611dc0611d81565b604052919050565b600067ffffffffffffffff831115611de257611de2611d81565b611df5601f8401601f1916602001611d97565b9050828152838383011115611e0957600080fd5b828260208301376000602084830101529392505050565b600060208284031215611e3257600080fd5b813567ffffffffffffffff811115611e4957600080fd5b8201601f81018413611e5a57600080fd5b611e6984823560208401611dc8565b949350505050565b60008060408385031215611e8457600080fd5b611e8d83611c59565b915060208301358015158114611ea257600080fd5b809150509250929050565b600067ffffffffffffffff821115611ec757611ec7611d81565b5060051b60200190565b600082601f830112611ee257600080fd5b81356020611ef7611ef283611ead565b611d97565b82815260059290921b84018101918181019086841115611f1657600080fd5b8286015b84811015611f315780358352918301918301611f1a565b509695505050505050565b60008060408385031215611f4f57600080fd5b823567ffffffffffffffff80821115611f6757600080fd5b818501915085601f830112611f7b57600080fd5b81356020611f8b611ef283611ead565b82815260059290921b84018101918181019089841115611faa57600080fd5b948201945b83861015611fcf57611fc086611c59565b82529482019490820190611faf565b96505086013592505080821115611fe557600080fd5b50611ff285828601611ed1565b9150509250929050565b6000806000806080858703121561201257600080fd5b61201b85611c59565b935061202960208601611c59565b925060408501359150606085013567ffffffffffffffff81111561204c57600080fd5b8501601f8101871361205d57600080fd5b61206c87823560208401611dc8565b91505092959194509250565b6000806040838503121561208b57600080fd5b61209483611c59565b9150611cc260208401611c59565b600181811c908216806120b657607f821691505b6020821081036120d657634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252600a90820152695245454e5452414e435960b01b604082015260600190565b60006020828403121561211257600080fd5b8151611bce81611b9b565b60208082526010908201526f155394d0519157d49150d2541251539560821b604082015260600190565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061219090830184611c01565b9695505050505050565b634e487b7160e01b600052601160045260246000fd5b600082198211156121c3576121c361219a565b500190565b60208082526018908201527f4d494e543a204d617820616d6f756e7420726561636865640000000000000000604082015260600190565b6000600182016122115761221161219a565b5060010190565b6000815161222a818560208601611bd5565b9290920192915050565b600080845481600182811c91508083168061225057607f831692505b6020808410820361226f57634e487b7160e01b86526022600452602486fd5b8180156122835760018114612294576122c1565b60ff198616895284890196506122c1565b60008b81526020902060005b868110156122b95781548b8201529085019083016122a0565b505084890196505b5050505050506122d18185612218565b95945050505050565b60008160001904831182151516156122f4576122f461219a565b500290565b60008282101561230b5761230b61219a565b50039056fea26469706673582212205efae5f215369e474cc977f3347db75b1385d7a0f0e49da4574eccd5125f421964736f6c634300080d0033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000673ab74486e90b87f992961981e9d7c1f849f2ad00000000000000000000000000000000000000000000000000000000000000047572692f00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): uri/
Arg [1] : _treasury (address): 0x673ab74486E90B87f992961981E9D7C1f849f2aD

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000673ab74486e90b87f992961981e9d7c1f849f2ad
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [3] : 7572692f00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

26136:10574:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27962:29;;;;;;;;;;;;;;;;;;;160:25:1;;;148:2;133:18;27962:29:0;;;;;;;;4422:340;;;;;;;;;;-1:-1:-1;4422:340:0;;;;;:::i;:::-;;:::i;:::-;;;747:14:1;;740:22;722:41;;710:2;695:18;4422:340:0;582:187:1;1007:18:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;1460:46::-;;;;;;;;;;-1:-1:-1;1460:46:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1460:46:0;;;;;;-1:-1:-1;;;;;1896:32:1;;;1878:51;;1866:2;1851:18;1460:46:0;1732:203:1;2087:289:0;;;;;;;;;;-1:-1:-1;2087:289:0;;;;;:::i;:::-;;:::i;:::-;;30224:163;;;;;;:::i;:::-;;:::i;30948:169::-;;;;;;:::i;:::-;;:::i;28633:41::-;;;;;;;;;;-1:-1:-1;28633:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;2599:764;;;;;;;;;;-1:-1:-1;2599:764:0;;;;;:::i;:::-;;:::i;34633:197::-;;;;;;;;;;;;;:::i;3371:409::-;;;;;;;;;;-1:-1:-1;3371:409:0;;;;;:::i;:::-;;:::i;27519:33::-;;;;;;;;;;;;;;;1409:42;;;;;;;;;;-1:-1:-1;1409:42:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;1409:42:0;;;27883:37;;;;;;;;;;;;;;;;28136:21;;;;;;;;;;;;;:::i;28228:35::-;;;;;;;;;;-1:-1:-1;28228:35:0;;;;;;;;;;;;;;;:::i;1356:44::-;;;;;;;;;;-1:-1:-1;1356:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;24729:103;;;;;;;;;;;;;:::i;30573:133::-;;;;;;:::i;:::-;;:::i;32569:164::-;;;;;;;;;;-1:-1:-1;32569:164:0;;;;;:::i;:::-;;:::i;24081:87::-;;;;;;;;;;-1:-1:-1;24154:6:0;;-1:-1:-1;;;;;24154:6:0;24081:87;;28495:46;;;;;;;;;;-1:-1:-1;28495:46:0;;;;;:::i;:::-;;;;;;;;;;;;;;1034:20;;;;;;;;;;;;;:::i;28358:44::-;;;;;;;;;;-1:-1:-1;28358:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;34415:140;;;;;;;;;;-1:-1:-1;34415:140:0;;;;;:::i;:::-;;:::i;2384:207::-;;;;;;;;;;-1:-1:-1;2384:207:0;;;;;:::i;:::-;;:::i;33934:395::-;;;;;;;;;;-1:-1:-1;33934:395:0;;;;;:::i;:::-;;:::i;29919:127::-;;;;;;:::i;:::-;;:::i;3788:439::-;;;;;;;;;;-1:-1:-1;3788:439:0;;;;;:::i;:::-;;:::i;31319:708::-;;;;;;;;;;;;;:::i;32846:192::-;;;;;;;;;;-1:-1:-1;32846:192:0;;;;;:::i;:::-;;:::i;29331:280::-;;;;;;;;;;-1:-1:-1;29331:280:0;;;;;:::i;:::-;;:::i;27606:40::-;;;;;;;;;;;;27643:3;27606:40;;1515:68;;;;;;;;;;-1:-1:-1;1515:68:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;24987:201;;;;;;;;;;-1:-1:-1;24987:201:0;;;;;:::i;:::-;;:::i;32336:146::-;;;;;;;;;;-1:-1:-1;32336:146:0;;;;;:::i;:::-;;:::i;33282:391::-;;;;;;;;;;-1:-1:-1;33282:391:0;;;;;:::i;:::-;;:::i;28062:27::-;;;;;;;;;;;;;;;;4422:340;4498:4;-1:-1:-1;;;;;;;;;4535:25:0;;;;:101;;-1:-1:-1;;;;;;;;;;4611:25:0;;;4535:101;:177;;;-1:-1:-1;;;;;;;;;;4687:25:0;;;4535:177;4515:197;4422:340;-1:-1:-1;;4422:340:0:o;1007:18::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;2087:289::-;2159:13;2175:11;;;:7;:11;;;;;;-1:-1:-1;;;;;2175:11:0;2207:10;:19;;;:58;;-1:-1:-1;;;;;;2230:23:0;;;;;;:16;:23;;;;;;;;2254:10;2230:35;;;;;;;;;;2207:58;2199:85;;;;-1:-1:-1;;;2199:85:0;;9078:2:1;2199:85:0;;;9060:21:1;9117:2;9097:18;;;9090:30;-1:-1:-1;;;9136:18:1;;;9129:44;9190:18;;2199:85:0;;;;;;;;;2297:15;;;;:11;:15;;;;;;:25;;-1:-1:-1;;;;;;2297:25:0;-1:-1:-1;;;;;2297:25:0;;;;;;;;;2340:28;;2297:15;;2340:28;;;;;;;2148:228;2087:289;;:::o;30224:163::-;25986:6;;25996:1;25986:11;25978:34;;;;-1:-1:-1;;;25978:34:0;;;;;;;:::i;:::-;26034:1;26025:6;:10;30345:34:::1;30357:9;30368:6:::0;30376:2;30345:11:::1;:34::i;:::-;-1:-1:-1::0;;26071:1:0;26062:6;:10;30224:163::o;30948:169::-;25986:6;;25996:1;25986:11;25978:34;;;;-1:-1:-1;;;25978:34:0;;;;;;;:::i;:::-;26034:1;26025:6;:10;31072:37:::1;31087:9;31098:2:::0;31102:6;31072:14:::1;:37::i;2599:764::-:0;2735:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;2727:19:0;;;2735:11;;2727:19;2719:42;;;;-1:-1:-1;;;2719:42:0;;9760:2:1;2719:42:0;;;9742:21:1;9799:2;9779:18;;;9772:30;-1:-1:-1;;;9818:18:1;;;9811:40;9868:18;;2719:42:0;9558:334:1;2719:42:0;-1:-1:-1;;;;;2782:16:0;;2774:46;;;;-1:-1:-1;;;2774:46:0;;10099:2:1;2774:46:0;;;10081:21:1;10138:2;10118:18;;;10111:30;-1:-1:-1;;;10157:18:1;;;10150:47;10214:18;;2774:46:0;9897:341:1;2774:46:0;2855:10;-1:-1:-1;;;;;2855:18:0;;;;:51;;-1:-1:-1;2891:15:0;;;;:11;:15;;;;;;-1:-1:-1;;;;;2891:15:0;2877:10;:29;2855:51;:89;;;-1:-1:-1;;;;;;2910:22:0;;;;;;:16;:22;;;;;;;;2933:10;2910:34;;;;;;;;;;2855:89;2833:153;;;;-1:-1:-1;;;2833:153:0;;9078:2:1;2833:153:0;;;9060:21:1;9117:2;9097:18;;;9090:30;-1:-1:-1;;;9136:18:1;;;9129:44;9190:18;;2833:153:0;8876:338:1;2833:153:0;-1:-1:-1;;;;;3191:15:0;;;;;;;:9;:15;;;;;;;;:17;;-1:-1:-1;;3191:17:0;;;3225:13;;;;;;;;;:15;;3191:17;3225:15;;;3264:11;;;:7;:11;;;;;:16;;-1:-1:-1;;;;;;3264:16:0;;;;;;;;3300:11;:15;;;;;;3293:22;;;;;;;;3333;;3272:2;;3225:13;3191:15;3333:22;;;2599:764;;;:::o;34633:197::-;23967:13;:11;:13::i;:::-;34741:38:::1;::::0;34709:21:::1;::::0;-1:-1:-1;;;;;34749:8:0::1;34741:26;::::0;:38;::::1;;;::::0;34709:21;;34688:18:::1;34741:38:::0;34688:18;34741:38;34709:21;34741:26;:38;::::1;;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;34795:27:0::1;::::0;160:25:1;;;34795:27:0::1;::::0;148:2:1;133:18;34795:27:0::1;;;;;;;;34677:153;34633:197::o:0;3371:409::-;3495:26;3508:4;3514:2;3518;3495:12;:26::i;:::-;-1:-1:-1;;;;;3556:14:0;;;:19;;:172;;-1:-1:-1;3596:66:0;;-1:-1:-1;;;3596:66:0;;;3637:10;3596:66;;;10548:34:1;-1:-1:-1;;;;;10618:15:1;;;10598:18;;;10591:43;10650:18;;;10643:34;;;10713:3;10693:18;;;10686:31;-1:-1:-1;10733:19:1;;;10726:30;3683:45:0;;3596:40;;;;3683:45;;10773:19:1;;3596:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;3596:132:0;;3556:172;3534:238;;;;-1:-1:-1;;;3534:238:0;;;;;;;:::i;:::-;3371:409;;;:::o;28136:21::-;;;;;;;:::i;24729:103::-;23967:13;:11;:13::i;:::-;24794:30:::1;24821:1;24794:18;:30::i;:::-;24729:103::o:0;30573:133::-;25986:6;;25996:1;25986:11;25978:34;;;;-1:-1:-1;;;25978:34:0;;;;;;;:::i;:::-;26034:1;26025:6;:10;30653:45:::1;30668:9;30679:10;30691:6:::0;30653:14:::1;:45::i;:::-;-1:-1:-1::0;26071:1:0;26062:6;:10;30573:133::o;32569:164::-;23967:13;:11;:13::i;:::-;32649:17:::1;:27:::0;;32669:7;;32649:17;-1:-1:-1;;32649:27:0::1;::::0;32669:7;32649:27:::1;::::0;::::1;;;;;;:::i;:::-;;;;;;32692:33;32717:7;32692:33;;;;;;:::i;1034:20::-:0;;;;;;;:::i;34415:140::-;23967:13;:11;:13::i;:::-;34489:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;34523:24;34538:8;34523:24;;;;;;:::i;2384:207::-:0;2487:10;2470:28;;;;:16;:28;;;;;;;;-1:-1:-1;;;;;2470:38:0;;;;;;;;;;;;:49;;-1:-1:-1;;2470:49:0;;;;;;;;;;2537:46;;722:41:1;;;2470:38:0;;2487:10;2537:46;;695:18:1;2537:46:0;;;;;;;2384:207;;:::o;33934:395::-;23967:13;:11;:13::i;:::-;34087:7:::1;:14;34071:5;:12;:30;34063:55;;;::::0;-1:-1:-1;;;34063:55:0;;11604:2:1;34063:55:0::1;::::0;::::1;11586:21:1::0;11643:2;11623:18;;;11616:30;-1:-1:-1;;;11662:18:1;;;11655:42;11714:18;;34063:55:0::1;11402:336:1::0;34063:55:0::1;34146:12:::0;;34129:14:::1;34169:153;34189:6;34185:1;:10;34169:153;;;34238:7;34246:1;34238:10;;;;;;;;:::i;:::-;;;;;;;34214:11;:21;34226:5;34232:1;34226:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;34214:21:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;34214:21:0;:34;34292:3:::1;;34169:153;;;;34052:277;33934:395:::0;;:::o;29919:127::-;25986:6;;25996:1;25986:11;25978:34;;;;-1:-1:-1;;;25978:34:0;;;;;;;:::i;:::-;26034:1;26025:6;:10;29996:42:::1;30008:9;30019:6:::0;30027:10:::1;29996:11;:42::i;3788:439::-:0;3940:26;3953:4;3959:2;3963;3940:12;:26::i;:::-;-1:-1:-1;;;;;4001:14:0;;;:19;;:174;;-1:-1:-1;4041:68:0;;-1:-1:-1;;;4041:68:0;;;4130:45;-1:-1:-1;;;;;4041:40:0;;;4130:45;;4041:68;;4082:10;;4094:4;;4100:2;;4104:4;;4041:68;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;4041:134:0;;4001:174;3979:240;;;;-1:-1:-1;;;3979:240:0;;;;;;;:::i;31319:708::-;25986:6;;25996:1;25986:11;25978:34;;;;-1:-1:-1;;;25978:34:0;;;;;;;:::i;:::-;26034:1;26025:6;:10;31418:20:::1;31397:17;::::0;::::1;;:41;::::0;::::1;;;;;;:::i;:::-;;31375:116;;;::::0;-1:-1:-1;;;31375:116:0;;12582:2:1;31375:116:0::1;::::0;::::1;12564:21:1::0;12621:2;12601:18;;;12594:30;12660:27;12640:18;;;12633:55;12705:18;;31375:116:0::1;12380:349:1::0;31375:116:0::1;31531:10;31502:14;31519:23:::0;;;:11:::1;:23;::::0;;;;;;31561:11;;;31553:41:::1;;;::::0;-1:-1:-1;;;31553:41:0;;12936:2:1;31553:41:0::1;::::0;::::1;12918:21:1::0;12975:2;12955:18;;;12948:30;-1:-1:-1;;;12994:18:1;;;12987:47;13051:18;;31553:41:0::1;12734:341:1::0;31553:41:0::1;27643:3;31644:6;31627:14;;:23;;;;:::i;:::-;:37;;31605:111;;;;-1:-1:-1::0;;;31605:111:0::1;;;;;;;:::i;:::-;31741:10;31755:1;31729:23:::0;;;:11:::1;:23;::::0;;;;;;;:27;;;31792:6:::1;:18:::0;;;;;:28;;;::::1;::::0;;31844:176:::1;31868:6;31864:1;:10;31844:176;;;31925:14;:16:::0;;::::1;;::::0;;;;31971:37:::1;::::0;31981:10:::1;::::0;31971:9:::1;:37::i;:::-;31876:3;::::0;::::1;:::i;:::-;;;31844:176;;32846:192:::0;23967:13;:11;:13::i;:::-;32924:9:::1;32937:1;32924:14:::0;32916:41:::1;;;::::0;-1:-1:-1;;;32916:41:0;;14040:2:1;32916:41:0::1;::::0;::::1;14022:21:1::0;14079:2;14059:18;;;14052:30;-1:-1:-1;;;14098:18:1;;;14091:44;14152:18;;32916:41:0::1;13838:338:1::0;32916:41:0::1;32968:8;:20:::0;;;33004:26:::1;::::0;160:25:1;;;33004:26:0::1;::::0;148:2:1;133:18;33004:26:0::1;14:177:1::0;29331:280:0;29432:13;29507:1;29489:7;29483:21;;;;;:::i;:::-;;;:25;:120;;;;;;;;;;;;;;;;;29552:7;29561:18;:7;:16;:18::i;:::-;29535:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29463:140;29331:280;-1:-1:-1;;29331:280:0:o;24987:201::-;23967:13;:11;:13::i;:::-;-1:-1:-1;;;;;25076:22:0;::::1;25068:73;;;::::0;-1:-1:-1;;;25068:73:0;;15878:2:1;25068:73:0::1;::::0;::::1;15860:21:1::0;15917:2;15897:18;;;15890:30;15956:34;15936:18;;;15929:62;-1:-1:-1;;;16007:18:1;;;16000:36;16053:19;;25068:73:0::1;15676:402:1::0;25068:73:0::1;25152:28;25171:8;25152:18;:28::i;:::-;24987:201:::0;:::o;32336:146::-;23967:13;:11;:13::i;:::-;32408:9:::1;:22:::0;;;32446:28:::1;::::0;160:25:1;;;32446:28:0::1;::::0;148:2:1;133:18;32446:28:0::1;14:177:1::0;33282:391:0;23967:13;:11;:13::i;:::-;33433:7:::1;:14;33417:5;:12;:30;33409:55;;;::::0;-1:-1:-1;;;33409:55:0;;11604:2:1;33409:55:0::1;::::0;::::1;11586:21:1::0;11643:2;11623:18;;;11616:30;-1:-1:-1;;;11662:18:1;;;11655:42;11714:18;;33409:55:0::1;11402:336:1::0;33409:55:0::1;33492:12:::0;;33475:14:::1;33515:151;33535:6;33531:1;:10;33515:151;;;33582:7;33590:1;33582:10;;;;;;;;:::i;:::-;;;;;;;33560:9;:19;33570:5;33576:1;33570:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;33560:19:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;33560:19:0;:32;33636:3:::1;;33515:151;;35026:816:::0;35154:6;35164:1;35154:11;35146:44;;;;-1:-1:-1;;;35146:44:0;;16285:2:1;35146:44:0;;;16267:21:1;16324:2;16304:18;;;16297:30;-1:-1:-1;;;16343:18:1;;;16336:50;16403:18;;35146:44:0;16083:344:1;35146:44:0;35244:17;35223;;;;:38;;;;;;;;:::i;:::-;;35201:112;;;;-1:-1:-1;;;35201:112:0;;16634:2:1;35201:112:0;;;16616:21:1;16673:2;16653:18;;;16646:30;16712:26;16692:18;;;16685:54;16756:18;;35201:112:0;16432:348:1;35201:112:0;35355:8;;-1:-1:-1;;;;;35332:10:0;;;;;;:6;:10;;;;;;:19;;35345:6;;35332:19;:::i;:::-;:31;;35324:65;;;;-1:-1:-1;;;35324:65:0;;16987:2:1;35324:65:0;;;16969:21:1;17026:2;17006:18;;;16999:30;-1:-1:-1;;;17045:18:1;;;17038:51;17106:18;;35324:65:0;16785:345:1;35324:65:0;35432:6;35420:9;;:18;;;;:::i;:::-;35408:8;:30;;35400:63;;;;-1:-1:-1;;;35400:63:0;;17510:2:1;35400:63:0;;;17492:21:1;17549:2;17529:18;;;17522:30;-1:-1:-1;;;17568:18:1;;;17561:50;17628:18;;35400:63:0;17308:344:1;35400:63:0;27643:3;35513:6;35496:14;;:23;;;;:::i;:::-;:37;;35474:111;;;;-1:-1:-1;;;35474:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;35623:10:0;;;;;;:6;:10;;;;;:20;;;;;;35667:168;35691:6;35687:1;:10;35667:168;;;35748:14;:16;;;;;;;;35794:29;;35804:2;;35794:9;:29::i;:::-;35699:3;;;:::i;:::-;;;35667:168;;35850:857;36016:20;35995:17;;;;:41;;;;;;;;:::i;:::-;;35973:118;;;;-1:-1:-1;;;35973:118:0;;17859:2:1;35973:118:0;;;17841:21:1;17898:2;17878:18;;;17871:30;17937:29;17917:18;;;17910:57;17984:18;;35973:118:0;17657:351:1;35973:118:0;-1:-1:-1;;;;;36126:13:0;;36102:21;36126:13;;;:9;:13;;;;;;36158:11;;;;;:38;;;36183:13;36173:6;:23;;36158:38;36150:68;;;;-1:-1:-1;;;36150:68:0;;12936:2:1;36150:68:0;;;12918:21:1;12975:2;12955:18;;;12948:30;-1:-1:-1;;;12994:18:1;;;12987:47;13051:18;;36150:68:0;12734:341:1;36150:68:0;36261:6;36249:9;;:18;;;;:::i;:::-;36237:8;:30;;36229:63;;;;-1:-1:-1;;;36229:63:0;;17510:2:1;36229:63:0;;;17492:21:1;17549:2;17529:18;;;17522:30;-1:-1:-1;;;17568:18:1;;;17561:50;17628:18;;36229:63:0;17308:344:1;36229:63:0;27643:3;36342:6;36325:14;;:23;;;;:::i;:::-;:37;;36303:111;;;;-1:-1:-1;;;36303:111:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;36427:13:0;;;;;;:9;:13;;;;;:23;;36444:6;;36427:13;:23;;36444:6;;36427:23;:::i;:::-;;;;-1:-1:-1;;;;;;;36488:10:0;;;;;;:6;:10;;;;;:20;;;;;;36532:168;36556:6;36552:1;:10;36532:168;;;36613:14;:16;;;;;;;;36659:29;;36669:2;;36659:9;:29::i;:::-;36564:3;;;:::i;:::-;;;36532:168;;;;35962:745;35850:857;;;:::o;24246:132::-;24154:6;;-1:-1:-1;;;;;24154:6:0;22870:10;24310:23;24302:68;;;;-1:-1:-1;;;24302:68:0;;18345:2:1;24302:68:0;;;18327:21:1;;;18364:18;;;18357:30;18423:34;18403:18;;;18396:62;18475:18;;24302:68:0;18143:356:1;25348:191:0;25441:6;;;-1:-1:-1;;;;;25458:17:0;;;-1:-1:-1;;;;;;25458:17:0;;;;;;;25491:40;;25441:6;;;25458:17;25441:6;;25491:40;;25422:16;;25491:40;25411:128;25348:191;:::o;5940:349::-;6011:13;6017:2;6021;6011:5;:13::i;:::-;-1:-1:-1;;;;;6059:14:0;;;:19;;:178;;-1:-1:-1;6099:72:0;;-1:-1:-1;;;6099:72:0;;;6140:10;6099:72;;;10548:34:1;6160:1:0;10598:18:1;;;10591:43;;;10650:18;;;10643:34;;;10713:3;10693:18;;;10686:31;10733:19;;;10726:30;6192:45:0;-1:-1:-1;;;;;6099:40:0;;;6192:45;;10773:19:1;;6099:72:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;6099:138:0;;6059:178;6037:244;;;;-1:-1:-1;;;6037:244:0;;;;;;;:::i;:::-;5940:349;;:::o;20228:716::-;20284:13;20335:14;20352:17;20363:5;20352:10;:17::i;:::-;20372:1;20352:21;20335:38;;20388:20;20422:6;20411:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20411:18:0;-1:-1:-1;20388:41:0;-1:-1:-1;20553:28:0;;;20569:2;20553:28;20610:288;-1:-1:-1;;20642:5:0;-1:-1:-1;;;20779:2:0;20768:14;;20763:30;20642:5;20750:44;20840:2;20831:11;;;-1:-1:-1;20861:21:0;20610:288;20861:21;-1:-1:-1;20919:6:0;20228:716;-1:-1:-1;;;20228:716:0:o;4962:381::-;-1:-1:-1;;;;;5037:16:0;;5029:46;;;;-1:-1:-1;;;5029:46:0;;10099:2:1;5029:46:0;;;10081:21:1;10138:2;10118:18;;;10111:30;-1:-1:-1;;;10157:18:1;;;10150:47;10214:18;;5029:46:0;9897:341:1;5029:46:0;5119:1;5096:11;;;:7;:11;;;;;;-1:-1:-1;;;;;5096:11:0;:25;5088:52;;;;-1:-1:-1;;;5088:52:0;;18838:2:1;5088:52:0;;;18820:21:1;18877:2;18857:18;;;18850:30;-1:-1:-1;;;18896:18:1;;;18889:44;18950:18;;5088:52:0;18636:338:1;5088:52:0;-1:-1:-1;;;;;5234:13:0;;;;;;:9;:13;;;;;;;;:15;;;;;;5273:11;;;:7;:11;;;;;;:16;;-1:-1:-1;;;;;;5273:16:0;;;;;5307:28;5281:2;;5234:13;;5307:28;;5234:13;;5307:28;4962:381;;:::o;17250:922::-;17303:7;;-1:-1:-1;;;17381:15:0;;17377:102;;-1:-1:-1;;;17417:15:0;;;-1:-1:-1;17461:2:0;17451:12;17377:102;17506:6;17497:5;:15;17493:102;;17542:6;17533:15;;;-1:-1:-1;17577:2:0;17567:12;17493:102;17622:6;17613:5;:15;17609:102;;17658:6;17649:15;;;-1:-1:-1;17693:2:0;17683:12;17609:102;17738:5;17729;:14;17725:99;;17773:5;17764:14;;;-1:-1:-1;17807:1:0;17797:11;17725:99;17851:5;17842;:14;17838:99;;17886:5;17877:14;;;-1:-1:-1;17920:1:0;17910:11;17838:99;17964:5;17955;:14;17951:99;;17999:5;17990:14;;;-1:-1:-1;18033:1:0;18023:11;17951:99;18077:5;18068;:14;18064:66;;18113:1;18103:11;18158:6;17250:922;-1:-1:-1;;17250:922:0:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;196:131:1;-1:-1:-1;;;;;;270:32:1;;260:43;;250:71;;317:1;314;307:12;332:245;390:6;443:2;431:9;422:7;418:23;414:32;411:52;;;459:1;456;449:12;411:52;498:9;485:23;517:30;541:5;517:30;:::i;:::-;566:5;332:245;-1:-1:-1;;;332:245:1:o;774:258::-;846:1;856:113;870:6;867:1;864:13;856:113;;;946:11;;;940:18;927:11;;;920:39;892:2;885:10;856:113;;;987:6;984:1;981:13;978:48;;;-1:-1:-1;;1022:1:1;1004:16;;997:27;774:258::o;1037:269::-;1090:3;1128:5;1122:12;1155:6;1150:3;1143:19;1171:63;1227:6;1220:4;1215:3;1211:14;1204:4;1197:5;1193:16;1171:63;:::i;:::-;1288:2;1267:15;-1:-1:-1;;1263:29:1;1254:39;;;;1295:4;1250:50;;1037:269;-1:-1:-1;;1037:269:1:o;1311:231::-;1460:2;1449:9;1442:21;1423:4;1480:56;1532:2;1521:9;1517:18;1509:6;1480:56;:::i;1547:180::-;1606:6;1659:2;1647:9;1638:7;1634:23;1630:32;1627:52;;;1675:1;1672;1665:12;1627:52;-1:-1:-1;1698:23:1;;1547:180;-1:-1:-1;1547:180:1:o;1940:173::-;2008:20;;-1:-1:-1;;;;;2057:31:1;;2047:42;;2037:70;;2103:1;2100;2093:12;2037:70;1940:173;;;:::o;2118:254::-;2186:6;2194;2247:2;2235:9;2226:7;2222:23;2218:32;2215:52;;;2263:1;2260;2253:12;2215:52;2286:29;2305:9;2286:29;:::i;:::-;2276:39;2362:2;2347:18;;;;2334:32;;-1:-1:-1;;;2118:254:1:o;2377:::-;2445:6;2453;2506:2;2494:9;2485:7;2481:23;2477:32;2474:52;;;2522:1;2519;2512:12;2474:52;2558:9;2545:23;2535:33;;2587:38;2621:2;2610:9;2606:18;2587:38;:::i;:::-;2577:48;;2377:254;;;;;:::o;2636:186::-;2695:6;2748:2;2736:9;2727:7;2723:23;2719:32;2716:52;;;2764:1;2761;2754:12;2716:52;2787:29;2806:9;2787:29;:::i;2827:328::-;2904:6;2912;2920;2973:2;2961:9;2952:7;2948:23;2944:32;2941:52;;;2989:1;2986;2979:12;2941:52;3012:29;3031:9;3012:29;:::i;:::-;3002:39;;3060:38;3094:2;3083:9;3079:18;3060:38;:::i;:::-;3050:48;;3145:2;3134:9;3130:18;3117:32;3107:42;;2827:328;;;;;:::o;3160:127::-;3221:10;3216:3;3212:20;3209:1;3202:31;3252:4;3249:1;3242:15;3276:4;3273:1;3266:15;3292:343;3439:2;3424:18;;3472:1;3461:13;;3451:144;;3517:10;3512:3;3508:20;3505:1;3498:31;3552:4;3549:1;3542:15;3580:4;3577:1;3570:15;3451:144;3604:25;;;3292:343;:::o;3640:271::-;3714:6;3767:2;3755:9;3746:7;3742:23;3738:32;3735:52;;;3783:1;3780;3773:12;3735:52;3822:9;3809:23;3861:1;3854:5;3851:12;3841:40;;3877:1;3874;3867:12;3916:127;3977:10;3972:3;3968:20;3965:1;3958:31;4008:4;4005:1;3998:15;4032:4;4029:1;4022:15;4048:275;4119:2;4113:9;4184:2;4165:13;;-1:-1:-1;;4161:27:1;4149:40;;4219:18;4204:34;;4240:22;;;4201:62;4198:88;;;4266:18;;:::i;:::-;4302:2;4295:22;4048:275;;-1:-1:-1;4048:275:1:o;4328:407::-;4393:5;4427:18;4419:6;4416:30;4413:56;;;4449:18;;:::i;:::-;4487:57;4532:2;4511:15;;-1:-1:-1;;4507:29:1;4538:4;4503:40;4487:57;:::i;:::-;4478:66;;4567:6;4560:5;4553:21;4607:3;4598:6;4593:3;4589:16;4586:25;4583:45;;;4624:1;4621;4614:12;4583:45;4673:6;4668:3;4661:4;4654:5;4650:16;4637:43;4727:1;4720:4;4711:6;4704:5;4700:18;4696:29;4689:40;4328:407;;;;;:::o;4740:451::-;4809:6;4862:2;4850:9;4841:7;4837:23;4833:32;4830:52;;;4878:1;4875;4868:12;4830:52;4918:9;4905:23;4951:18;4943:6;4940:30;4937:50;;;4983:1;4980;4973:12;4937:50;5006:22;;5059:4;5051:13;;5047:27;-1:-1:-1;5037:55:1;;5088:1;5085;5078:12;5037:55;5111:74;5177:7;5172:2;5159:16;5154:2;5150;5146:11;5111:74;:::i;:::-;5101:84;4740:451;-1:-1:-1;;;;4740:451:1:o;5196:347::-;5261:6;5269;5322:2;5310:9;5301:7;5297:23;5293:32;5290:52;;;5338:1;5335;5328:12;5290:52;5361:29;5380:9;5361:29;:::i;:::-;5351:39;;5440:2;5429:9;5425:18;5412:32;5487:5;5480:13;5473:21;5466:5;5463:32;5453:60;;5509:1;5506;5499:12;5453:60;5532:5;5522:15;;;5196:347;;;;;:::o;5548:183::-;5608:4;5641:18;5633:6;5630:30;5627:56;;;5663:18;;:::i;:::-;-1:-1:-1;5708:1:1;5704:14;5720:4;5700:25;;5548:183::o;5736:662::-;5790:5;5843:3;5836:4;5828:6;5824:17;5820:27;5810:55;;5861:1;5858;5851:12;5810:55;5897:6;5884:20;5923:4;5947:60;5963:43;6003:2;5963:43;:::i;:::-;5947:60;:::i;:::-;6041:15;;;6127:1;6123:10;;;;6111:23;;6107:32;;;6072:12;;;;6151:15;;;6148:35;;;6179:1;6176;6169:12;6148:35;6215:2;6207:6;6203:15;6227:142;6243:6;6238:3;6235:15;6227:142;;;6309:17;;6297:30;;6347:12;;;;6260;;6227:142;;;-1:-1:-1;6387:5:1;5736:662;-1:-1:-1;;;;;;5736:662:1:o;6403:1146::-;6521:6;6529;6582:2;6570:9;6561:7;6557:23;6553:32;6550:52;;;6598:1;6595;6588:12;6550:52;6638:9;6625:23;6667:18;6708:2;6700:6;6697:14;6694:34;;;6724:1;6721;6714:12;6694:34;6762:6;6751:9;6747:22;6737:32;;6807:7;6800:4;6796:2;6792:13;6788:27;6778:55;;6829:1;6826;6819:12;6778:55;6865:2;6852:16;6887:4;6911:60;6927:43;6967:2;6927:43;:::i;6911:60::-;7005:15;;;7087:1;7083:10;;;;7075:19;;7071:28;;;7036:12;;;;7111:19;;;7108:39;;;7143:1;7140;7133:12;7108:39;7167:11;;;;7187:148;7203:6;7198:3;7195:15;7187:148;;;7269:23;7288:3;7269:23;:::i;:::-;7257:36;;7220:12;;;;7313;;;;7187:148;;;7354:5;-1:-1:-1;;7397:18:1;;7384:32;;-1:-1:-1;;7428:16:1;;;7425:36;;;7457:1;7454;7447:12;7425:36;;7480:63;7535:7;7524:8;7513:9;7509:24;7480:63;:::i;:::-;7470:73;;;6403:1146;;;;;:::o;7554:667::-;7649:6;7657;7665;7673;7726:3;7714:9;7705:7;7701:23;7697:33;7694:53;;;7743:1;7740;7733:12;7694:53;7766:29;7785:9;7766:29;:::i;:::-;7756:39;;7814:38;7848:2;7837:9;7833:18;7814:38;:::i;:::-;7804:48;;7899:2;7888:9;7884:18;7871:32;7861:42;;7954:2;7943:9;7939:18;7926:32;7981:18;7973:6;7970:30;7967:50;;;8013:1;8010;8003:12;7967:50;8036:22;;8089:4;8081:13;;8077:27;-1:-1:-1;8067:55:1;;8118:1;8115;8108:12;8067:55;8141:74;8207:7;8202:2;8189:16;8184:2;8180;8176:11;8141:74;:::i;:::-;8131:84;;;7554:667;;;;;;;:::o;8226:260::-;8294:6;8302;8355:2;8343:9;8334:7;8330:23;8326:32;8323:52;;;8371:1;8368;8361:12;8323:52;8394:29;8413:9;8394:29;:::i;:::-;8384:39;;8442:38;8476:2;8465:9;8461:18;8442:38;:::i;8491:380::-;8570:1;8566:12;;;;8613;;;8634:61;;8688:4;8680:6;8676:17;8666:27;;8634:61;8741:2;8733:6;8730:14;8710:18;8707:38;8704:161;;8787:10;8782:3;8778:20;8775:1;8768:31;8822:4;8819:1;8812:15;8850:4;8847:1;8840:15;8704:161;;8491:380;;;:::o;9219:334::-;9421:2;9403:21;;;9460:2;9440:18;;;9433:30;-1:-1:-1;;;9494:2:1;9479:18;;9472:40;9544:2;9529:18;;9219:334::o;10803:249::-;10872:6;10925:2;10913:9;10904:7;10900:23;10896:32;10893:52;;;10941:1;10938;10931:12;10893:52;10973:9;10967:16;10992:30;11016:5;10992:30;:::i;11057:340::-;11259:2;11241:21;;;11298:2;11278:18;;;11271:30;-1:-1:-1;;;11332:2:1;11317:18;;11310:46;11388:2;11373:18;;11057:340::o;11743:127::-;11804:10;11799:3;11795:20;11792:1;11785:31;11835:4;11832:1;11825:15;11859:4;11856:1;11849:15;11875:500;-1:-1:-1;;;;;12144:15:1;;;12126:34;;12196:15;;12191:2;12176:18;;12169:43;12243:2;12228:18;;12221:34;;;12291:3;12286:2;12271:18;;12264:31;;;12069:4;;12312:57;;12349:19;;12341:6;12312:57;:::i;:::-;12304:65;11875:500;-1:-1:-1;;;;;;11875:500:1:o;13080:127::-;13141:10;13136:3;13132:20;13129:1;13122:31;13172:4;13169:1;13162:15;13196:4;13193:1;13186:15;13212:128;13252:3;13283:1;13279:6;13276:1;13273:13;13270:39;;;13289:18;;:::i;:::-;-1:-1:-1;13325:9:1;;13212:128::o;13345:348::-;13547:2;13529:21;;;13586:2;13566:18;;;13559:30;13625:26;13620:2;13605:18;;13598:54;13684:2;13669:18;;13345:348::o;13698:135::-;13737:3;13758:17;;;13755:43;;13778:18;;:::i;:::-;-1:-1:-1;13825:1:1;13814:13;;13698:135::o;14307:185::-;14349:3;14387:5;14381:12;14402:52;14447:6;14442:3;14435:4;14428:5;14424:16;14402:52;:::i;:::-;14470:16;;;;;14307:185;-1:-1:-1;;14307:185:1:o;14497:1174::-;14673:3;14702:1;14735:6;14729:13;14765:3;14787:1;14815:9;14811:2;14807:18;14797:28;;14875:2;14864:9;14860:18;14897;14887:61;;14941:4;14933:6;14929:17;14919:27;;14887:61;14967:2;15015;15007:6;15004:14;14984:18;14981:38;14978:165;;-1:-1:-1;;;15042:33:1;;15098:4;15095:1;15088:15;15128:4;15049:3;15116:17;14978:165;15159:18;15186:104;;;;15304:1;15299:320;;;;15152:467;;15186:104;-1:-1:-1;;15219:24:1;;15207:37;;15264:16;;;;-1:-1:-1;15186:104:1;;15299:320;14254:1;14247:14;;;14291:4;14278:18;;15394:1;15408:165;15422:6;15419:1;15416:13;15408:165;;;15500:14;;15487:11;;;15480:35;15543:16;;;;15437:10;;15408:165;;;15412:3;;15602:6;15597:3;15593:16;15586:23;;15152:467;;;;;;;15635:30;15661:3;15653:6;15635:30;:::i;:::-;15628:37;14497:1174;-1:-1:-1;;;;;14497:1174:1:o;17135:168::-;17175:7;17241:1;17237;17233:6;17229:14;17226:1;17223:21;17218:1;17211:9;17204:17;17200:45;17197:71;;;17248:18;;:::i;:::-;-1:-1:-1;17288:9:1;;17135:168::o;18013:125::-;18053:4;18081:1;18078;18075:8;18072:34;;;18086:18;;:::i;:::-;-1:-1:-1;18123:9:1;;18013:125::o

Swarm Source

ipfs://5efae5f215369e474cc977f3347db75b1385d7a0f0e49da4574eccd5125f4219
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.