ETH Price: $3,365.30 (+0.52%)

Token

Crazy Camels (Camel)
 

Overview

Max Total Supply

2,000 Camel

Holders

1,220

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Camel
0x231bd5b50388677bbb9bc74a681a35599b35fc40
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Crazy Camels is a collection of 2,000 unique 2D NFTs.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CrazyCamels

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/cryptography/ECDSA.sol



pragma solidity ^0.8.0;

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol



pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/finance/PaymentSplitter.sol



pragma solidity ^0.8.0;




/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/CrazyCamels.sol


pragma solidity ^0.8.4;








contract CrazyCamels is
    ERC721Enumerable,
    Ownable,
    ReentrancyGuard,
    PaymentSplitter
{
    using Strings for uint256;
    using Counters for Counters.Counter;
    using ECDSA for bytes32;

    struct PresaleConfig {
        uint256 startTime;
        uint256 duration;
        uint256 maxCount;
    }
    struct SaleConfig {
        uint256 startTime;
        uint256 maxCount;
    }
    uint256 public maxSupply = 10000;
    uint256 public maxGiftSupply = 200;
    uint256 public giftCount;
    uint256 public presaleCount;
    uint256 public totalNFT;
    string public baseURI;
    string public notRevealedUri;
    string public baseExtension = ".json";
    bool public paused = false;
    bool public revealed = false;
    PresaleConfig public presaleConfig;
    SaleConfig public saleConfig;
    Counters.Counter private _tokenIds;

    uint256[] private _teamShares = [47, 47, 5, 1];
    address[] private _team = [
        0x3796838b5Bc7F443c0ae63853b4fAF9aa95A51f7,
        0xFE5A39B2609b80D11b7109e34577E65af7D86c07,
        0xfC64Eef2aC96cb744699F6abaa56BCF05f31aC41,
        0x7A8CE9C44493D02966d413268279a6047F93f592
    ];

    mapping(address => uint256) public _presaleClaimed;
    mapping(address => uint256) public _giftClaimed;
    mapping(address => uint256) public _saleClaimed;
    mapping(address => uint256) public _totalClaimed;

    enum WorkflowStatus {
        CheckOnPresale,
        Presale,
        Sale,
        SoldOut
    }
    WorkflowStatus public workflow;
    
    address public signerAddress = 0x937c11a1E9210c95Ff56D34229213CE750aE800e;

    event ChangePresaleConfig(
        uint256 _startTime,
        uint256 _duration,
        uint256 _maxCount
    );
    event ChangeSaleConfig(uint256 _startTime, uint256 _maxCount);
    event ChangeBaseURI(string _baseURI);
    event GiftMint(address indexed _recipient, uint256 _amount);
    event PresaleMint(address indexed _minter, uint256 _amount, uint256 _price);
    event SaleMint(address indexed _minter, uint256 _amount, uint256 _price);
    event WorkflowStatusChange(
        WorkflowStatus previousStatus,
        WorkflowStatus newStatus
    );

    constructor()
        ERC721("Crazy Camels", "Camel")
        PaymentSplitter(_team, _teamShares)
        ReentrancyGuard()
    {}

    function changePauseState() public onlyOwner {
        paused = !paused;
    }

    function setBaseURI(string calldata _tokenBaseURI) external onlyOwner {
        baseURI = _tokenBaseURI;
        emit ChangeBaseURI(_tokenBaseURI);
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function reveal() public onlyOwner {
        revealed = true;
    }
    
    function setSignerAddress(address _signerAddress) external onlyOwner {
        require(_signerAddress != address(0));
        signerAddress = _signerAddress;
    }


    function setUpPresale(uint256 _duration) external onlyOwner {
        require(
            workflow == WorkflowStatus.CheckOnPresale,
            "ERROR: Unauthorized Transaction"
        );
        uint256 _startTime = block.timestamp;
        uint256 _maxCount = 1;
        presaleConfig = PresaleConfig(_startTime, _duration, _maxCount);
        emit ChangePresaleConfig(_startTime, _duration, _maxCount);
        workflow = WorkflowStatus.Presale;
        emit WorkflowStatusChange(
            WorkflowStatus.CheckOnPresale,
            WorkflowStatus.Presale
        );
    }

    function setUpSale() external onlyOwner {
        require(
            workflow == WorkflowStatus.Presale,
            "ERROR: Unauthorized Transaction"
        );
        PresaleConfig memory _presaleConfig = presaleConfig;
        uint256 _presaleEndTime = _presaleConfig.startTime +
            _presaleConfig.duration;
        require(block.timestamp > _presaleEndTime, "ERROR: Sale not started");
        uint256 _startTime = block.timestamp;
        uint256 _maxCount = 10;
        saleConfig = SaleConfig(_startTime, _maxCount);
        emit ChangeSaleConfig(_startTime, _maxCount);
        workflow = WorkflowStatus.Sale;
        emit WorkflowStatusChange(WorkflowStatus.Presale, WorkflowStatus.Sale);
    }

    function getPrice() public view returns (uint256) {
        uint256 _price;
        PresaleConfig memory _presaleConfig = presaleConfig;
        SaleConfig memory _saleConfig = saleConfig;
        if (
            block.timestamp <=
            _presaleConfig.startTime + _presaleConfig.duration
        ) {
            _price = 100000000000000000; //0.1 ETH
        } else if (block.timestamp <= _saleConfig.startTime + 6 hours) {
            _price = 300000000000000000; //0.3 ETH
        } else if (
            (block.timestamp > _saleConfig.startTime + 6 hours) &&
            (block.timestamp <= _saleConfig.startTime + 12 hours)
        ) {
            _price = 250000000000000000; //0.25 ETH
        } else {
            _price = 200000000000000000; //0.2 ETH
        }
        return _price;
    }

    function giftMint(address[] calldata _addresses) external onlyOwner {
        require(
            totalNFT + _addresses.length <= maxSupply,
            "ERROR: max total supply exceeded"
        );

        require(
            giftCount + _addresses.length <= maxGiftSupply,
            "ERROR: max gift supply exceeded"
        );

        uint256 _newItemId;
        for (uint256 ind = 0; ind < _addresses.length; ind++) {
            require(
                _addresses[ind] != address(0),
                "ERROR: recepient is the null address"
            );
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(_addresses[ind], _newItemId);
            _giftClaimed[_addresses[ind]] = _giftClaimed[_addresses[ind]] + 1;
            _totalClaimed[_addresses[ind]] = _totalClaimed[_addresses[ind]] + 1;
            totalNFT = totalNFT + 1;
            giftCount = giftCount + 1;
        }
    }
    
    function verifyAddressSigner(bytes32 messageHash, bytes memory signature) private view returns (bool) {
        return signerAddress == messageHash.toEthSignedMessageHash().recover(signature);
    }

    function hashMessage(address sender) private pure returns (bytes32) {
        return keccak256(abi.encode(sender));
    }


    function presaleMint(
        uint256 _amount,
        bytes32 messageHash,
        bytes calldata signature
        ) external payable nonReentrant {
        PresaleConfig memory _presaleConfig = presaleConfig;
        require(hashMessage(msg.sender) == messageHash, "BAD_HASH");
        require(verifyAddressSigner(messageHash, signature), "BAD_SIGNATURE");
        require(_amount == 1, "ERROR: amount is not 1");
        require(
            _presaleConfig.startTime > 0,
            "ERROR: Presale must be active to mint Crazy Camels"
        );
        require(
            block.timestamp >= _presaleConfig.startTime,
            "ERROR: Presale not started"
        );
        require(
            block.timestamp <=
                _presaleConfig.startTime + _presaleConfig.duration,
            "ERROR: Presale is ended"
        );
        require(
            _presaleClaimed[msg.sender] + _amount <= _presaleConfig.maxCount,
            "ERROR: Can only mint 1 tokens"
        );
        require(totalNFT + _amount <= maxSupply, "ERROR: max supply exceeded");
        uint256 _price = 100000000000000000;
        require(_price <= msg.value, "ERROR: Ether value sent is not correct");
        require(!paused, "ERROR: contract is paused");
        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            _presaleClaimed[msg.sender] = _presaleClaimed[msg.sender] + 1;
            _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + 1;
            totalNFT = totalNFT + 1;
            presaleCount = presaleCount + 1;
        }
        emit PresaleMint(msg.sender, _amount, _price);
        if (totalNFT + _amount == maxSupply) {
            workflow = WorkflowStatus.SoldOut;
            emit WorkflowStatusChange(
                WorkflowStatus.Sale,
                WorkflowStatus.SoldOut
            );
        }
    }

    function saleMint(uint256 _amount) external payable nonReentrant {
        uint256 _price;
        SaleConfig memory _saleConfig = saleConfig;
        if (block.timestamp <= _saleConfig.startTime + 6 hours) {
            _price = 300000000000000000; //0.3 ETH
        } else if (
            (block.timestamp > _saleConfig.startTime + 6 hours) &&
            (block.timestamp <= _saleConfig.startTime + 12 hours)
        ) {
            _price = 250000000000000000; //0.25 ETH
        } else {
            _price = 200000000000000000; //0.2 ETH
        }
        require(_amount > 0, "ERROR: zero amount");
        require(_saleConfig.startTime > 0, "ERROR: sale is not active");
        require(
            block.timestamp >= _saleConfig.startTime,
            "ERROR: sale not started"
        );
        require(
            _amount <= _saleConfig.maxCount,
            "ERROR:  Can only mint 10 tokens at a time"
        );
        require(totalNFT + _amount <= maxSupply, "ERROR: max supply exceeded");
        require(
            _price * _amount <= msg.value,
            "ERROR: Ether value sent is not correct"
        );
        require(!paused, "ERROR: contract is paused");
        uint256 _newItemId;
        for (uint256 ind = 0; ind < _amount; ind++) {
            _tokenIds.increment();
            _newItemId = _tokenIds.current();
            _safeMint(msg.sender, _newItemId);
            _saleClaimed[msg.sender] = _saleClaimed[msg.sender] + _amount;
            _totalClaimed[msg.sender] = _totalClaimed[msg.sender] + _amount;
            totalNFT = totalNFT + 1;
        }
        emit SaleMint(msg.sender, _amount, _price);
        if (totalNFT + _amount == maxSupply) {
            workflow = WorkflowStatus.SoldOut;
            emit WorkflowStatusChange(
                WorkflowStatus.Sale,
                WorkflowStatus.SoldOut
            );
        }
    }

    function getWorkflowStatus() public view returns (uint256) {
        uint256 _status;
        if (workflow == WorkflowStatus.CheckOnPresale) {
            _status = 1;
        }
        if (workflow == WorkflowStatus.Presale) {
            _status = 2;
        }
        if (workflow == WorkflowStatus.Sale) {
            _status = 3;
        }
        if (workflow == WorkflowStatus.SoldOut) {
            _status = 4;
        }
        return _status;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        require(
            _exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        if (revealed == false) {
            return notRevealedUri;
        }

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

    function setBaseExtension(string memory _newBaseExtension)
        public
        onlyOwner
    {
        baseExtension = _newBaseExtension;
    }

    function setNotRevealedURI(string memory _notRevealedURI) public onlyOwner {
        notRevealedUri = _notRevealedURI;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_baseURI","type":"string"}],"name":"ChangeBaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_duration","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangePresaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_startTime","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_maxCount","type":"uint256"}],"name":"ChangeSaleConfig","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"GiftMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"PresaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_price","type":"uint256"}],"name":"SaleMint","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum CrazyCamels.WorkflowStatus","name":"previousStatus","type":"uint8"},{"indexed":false,"internalType":"enum CrazyCamels.WorkflowStatus","name":"newStatus","type":"uint8"}],"name":"WorkflowStatusChange","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_giftClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_presaleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_saleClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_totalClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"changePauseState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWorkflowStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"giftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"giftMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxGiftSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","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":"notRevealedUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"duration","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32","name":"messageHash","type":"bytes32"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleConfig","outputs":[{"internalType":"uint256","name":"startTime","type":"uint256"},{"internalType":"uint256","name":"maxCount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_tokenBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_signerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_duration","type":"uint256"}],"name":"setUpPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUpSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"signerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"workflow","outputs":[{"internalType":"enum CrazyCamels.WorkflowStatus","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

61271060115560c860125560c06040526005608081905264173539b7b760d91b60a0908152620000339160189190620005ff565b506019805461ffff1916905560408051608081018252602f8082526020808301919091526005928201929092526001606082015262000075919060046200068e565b5060408051608081018252733796838b5bc7f443c0ae63853b4faf9aa95a51f7815273fe5a39b2609b80d11b7109e34577e65af7d86c07602082015273fc64eef2ac96cb744699f6abaa56bcf05f31ac4191810191909152737a8ce9c44493d02966d413268279a6047f93f5926060820152620000f7906021906004620006d1565b5060268054610100600160a81b03191674937c11a1e9210c95ff56d34229213ce750ae800e001790553480156200012d57600080fd5b5060218054806020026020016040519081016040528092919081815260200182805480156200018657602002820191906000526020600020905b81546001600160a01b0316815260019091019060200180831162000167575b50505050506020805480602002602001604051908101604052809291908181526020018280548015620001d957602002820191906000526020600020905b815481526020019060010190808311620001c4575b5050604080518082018252600c81526b4372617a792043616d656c7360a01b60208083019182528351808501909452600584526410d85b595b60da1b90840152815191955091935062000231925060009190620005ff565b50805162000247906001906020840190620005ff565b505050620002646200025e620003bb60201b60201c565b620003bf565b6001600b558051825114620002db5760405162461bcd60e51b815260206004820152603260248201527f5061796d656e7453706c69747465723a2070617965657320616e6420736861726044820152710cae640d8cadccee8d040dad2e6dac2e8c6d60731b60648201526084015b60405180910390fd5b60008251116200032e5760405162461bcd60e51b815260206004820152601a60248201527f5061796d656e7453706c69747465723a206e6f207061796565730000000000006044820152606401620002d2565b60005b8251811015620003b2576200039d8382815181106200036057634e487b7160e01b600052603260045260246000fd5b60200260200101518383815181106200038957634e487b7160e01b600052603260045260246000fd5b60200260200101516200041160201b60201c565b80620003a98162000798565b91505062000331565b505050620007cc565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200047e5760405162461bcd60e51b815260206004820152602c60248201527f5061796d656e7453706c69747465723a206163636f756e74206973207468652060448201526b7a65726f206164647265737360a01b6064820152608401620002d2565b60008111620004d05760405162461bcd60e51b815260206004820152601d60248201527f5061796d656e7453706c69747465723a207368617265732061726520300000006044820152606401620002d2565b6001600160a01b0382166000908152600e6020526040902054156200054c5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960448201526a206861732073686172657360a81b6064820152608401620002d2565b60108054600181019091557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae6720180546001600160a01b0319166001600160a01b0384169081179091556000908152600e60205260409020819055600c54620005b690829062000740565b600c55604080516001600160a01b0384168152602081018390527f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac910160405180910390a15050565b8280546200060d906200075b565b90600052602060002090601f0160209004810192826200063157600085556200067c565b82601f106200064c57805160ff19168380011785556200067c565b828001600101855582156200067c579182015b828111156200067c5782518255916020019190600101906200065f565b506200068a92915062000729565b5090565b8280548282559060005260206000209081019282156200067c579160200282015b828111156200067c578251829060ff16905591602001919060010190620006af565b8280548282559060005260206000209081019282156200067c579160200282015b828111156200067c57825182546001600160a01b0319166001600160a01b03909116178255602090920191600190910190620006f2565b5b808211156200068a57600081556001016200072a565b60008219821115620007565762000756620007b6565b500190565b600181811c908216806200077057607f821691505b602082108114156200079257634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415620007af57620007af620007b6565b5060010190565b634e487b7160e01b600052601160045260246000fd5b61420c80620007dc6000396000f3fe60806040526004361061036e5760003560e01c80637f674f48116101c6578063bf9b7c8d116100f7578063e33b7de311610095578063f2c4ce1e1161006f578063f2c4ce1e14610a47578063f2fde38b14610a67578063f75d64a614610a87578063fd88fa6914610a9c57600080fd5b8063e33b7de3146109d3578063e985e9c5146109e8578063ed70037414610a3157600080fd5b8063cde27a35116100d1578063cde27a3514610951578063ce7c2ac214610967578063d5abeb011461099d578063da3ef23f146109b357600080fd5b8063bf9b7c8d14610909578063c66828621461091c578063c87b56dd1461093157600080fd5b80639852595c11610164578063a33441251161013e578063a33441251461088d578063a475b5dd146108b4578063a5fd7bec146108c9578063b88d4fde146108e957600080fd5b80639852595c1461082257806398d5fdca14610858578063a22cb4651461086d57600080fd5b80638cc4de19116101a05780638cc4de19146107925780638da5cb5b146107bf57806390aa0b0f146107dd57806395d89b411461080d57600080fd5b80637f674f48146107325780638b83209b1461075f5780638ca887ca1461077f57600080fd5b806342842e0e116102a05780635c975abb1161023e5780636c0360eb116102185780636c0360eb146106c857806370a08231146106dd578063710e132d146106fd578063715018a61461071d57600080fd5b80635c975abb146106785780635edbc28c146106925780636352211e146106a857600080fd5b8063518302271161027a57806351830227146105e757806352d728d91461060657806355f804b3146106335780635b7633d01461065357600080fd5b806342842e0e1461059257806346e79ffc146105b25780634f6ccce7146105c757600080fd5b806309c3fbb71161030d5780631f2898c3116102e75780631f2898c31461052857806323b872dd1461053d5780632f745c591461055d5780633a98ef391461057d57600080fd5b806309c3fbb7146104c657806318160ddd146104f3578063191655871461050857600080fd5b806306fdde031161034957806306fdde0314610437578063081812fc14610459578063081c8c4414610491578063095ea7b3146104a657600080fd5b8062456379146103bc57806301ffc9a7146103e5578063046dc1661461041557600080fd5b366103b7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103c857600080fd5b506103d260155481565b6040519081526020015b60405180910390f35b3480156103f157600080fd5b50610405610400366004613c54565b610ad6565b60405190151581526020016103dc565b34801561042157600080fd5b50610435610430366004613a77565b610b01565b005b34801561044357600080fd5b5061044c610b6f565b6040516103dc9190613f20565b34801561046557600080fd5b50610479610474366004613d12565b610c01565b6040516001600160a01b0390911681526020016103dc565b34801561049d57600080fd5b5061044c610c96565b3480156104b257600080fd5b506104356104c1366004613bb9565b610d24565b3480156104d257600080fd5b506103d26104e1366004613a77565b60246020526000908152604090205481565b3480156104ff57600080fd5b506008546103d2565b34801561051457600080fd5b50610435610523366004613a77565b610e3a565b34801561053457600080fd5b5061043561100c565b34801561054957600080fd5b50610435610558366004613acb565b6111c7565b34801561056957600080fd5b506103d2610578366004613bb9565b6111f8565b34801561058957600080fd5b50600c546103d2565b34801561059e57600080fd5b506104356105ad366004613acb565b61128e565b3480156105be57600080fd5b506104356112a9565b3480156105d357600080fd5b506103d26105e2366004613d12565b6112e7565b3480156105f357600080fd5b5060195461040590610100900460ff1681565b34801561061257600080fd5b506103d2610621366004613a77565b60236020526000908152604090205481565b34801561063f57600080fd5b5061043561064e366004613c8c565b611388565b34801561065f57600080fd5b506026546104799061010090046001600160a01b031681565b34801561068457600080fd5b506019546104059060ff1681565b34801561069e57600080fd5b506103d260125481565b3480156106b457600080fd5b506104796106c3366004613d12565b6113fc565b3480156106d457600080fd5b5061044c611473565b3480156106e957600080fd5b506103d26106f8366004613a77565b611480565b34801561070957600080fd5b50610435610718366004613d12565b611507565b34801561072957600080fd5b50610435611640565b34801561073e57600080fd5b506103d261074d366004613a77565b60256020526000908152604090205481565b34801561076b57600080fd5b5061047961077a366004613d12565b611676565b61043561078d366004613d12565b6116b4565b34801561079e57600080fd5b506103d26107ad366004613a77565b60226020526000908152604090205481565b3480156107cb57600080fd5b50600a546001600160a01b0316610479565b3480156107e957600080fd5b50601d54601e546107f8919082565b604080519283526020830191909152016103dc565b34801561081957600080fd5b5061044c611aea565b34801561082e57600080fd5b506103d261083d366004613a77565b6001600160a01b03166000908152600f602052604090205490565b34801561086457600080fd5b506103d2611af9565b34801561087957600080fd5b50610435610888366004613b88565b611bcf565b34801561089957600080fd5b506026546108a79060ff1681565b6040516103dc9190613ec8565b3480156108c057600080fd5b50610435611c94565b3480156108d557600080fd5b506104356108e4366004613be4565b611ccf565b3480156108f557600080fd5b50610435610904366004613b0b565b612054565b610435610917366004613d2a565b612086565b34801561092857600080fd5b5061044c6125af565b34801561093d57600080fd5b5061044c61094c366004613d12565b6125bc565b34801561095d57600080fd5b506103d260145481565b34801561097357600080fd5b506103d2610982366004613a77565b6001600160a01b03166000908152600e602052604090205490565b3480156109a957600080fd5b506103d260115481565b3480156109bf57600080fd5b506104356109ce366004613ccc565b61273b565b3480156109df57600080fd5b50600d546103d2565b3480156109f457600080fd5b50610405610a03366004613a93565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a3d57600080fd5b506103d260135481565b348015610a5357600080fd5b50610435610a62366004613ccc565b61277c565b348015610a7357600080fd5b50610435610a82366004613a77565b6127b9565b348015610a9357600080fd5b506103d2612854565b348015610aa857600080fd5b50601a54601b54601c54610abb92919083565b604080519384526020840192909252908201526060016103dc565b60006001600160e01b0319821663780e9d6360e01b1480610afb5750610afb8261291f565b92915050565b600a546001600160a01b03163314610b345760405162461bcd60e51b8152600401610b2b90613fcb565b60405180910390fd5b6001600160a01b038116610b4757600080fd5b602680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b606060008054610b7e906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa906140df565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b2b565b506000908152600460205260409020546001600160a01b031690565b60178054610ca3906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf906140df565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b505050505081565b6000610d2f826113fc565b9050806001600160a01b0316836001600160a01b03161415610d9d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b2b565b336001600160a01b0382161480610db95750610db98133610a03565b610e2b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2b565b610e35838361296f565b505050565b6001600160a01b0381166000908152600e6020526040902054610eae5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610b2b565b6000600d5447610ebe9190614051565b6001600160a01b0383166000908152600f6020908152604080832054600c54600e909352908320549394509192610ef5908561407d565b610eff9190614069565b610f09919061409c565b905080610f6c5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610b2b565b6001600160a01b0383166000908152600f6020526040902054610f90908290614051565b6001600160a01b0384166000908152600f6020526040902055600d54610fb7908290614051565b600d55610fc483826129dd565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b031633146110365760405162461bcd60e51b8152600401610b2b90613fcb565b600160265460ff16600381111561105d57634e487b7160e01b600052602160045260246000fd5b146110aa5760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20556e617574686f72697a6564205472616e73616374696f6e006044820152606401610b2b565b60408051606081018252601a54808252601b5460208301819052601c549383019390935290916000916110dd9190614051565b905080421161112e5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2053616c65206e6f7420737461727465640000000000000000006044820152606401610b2b565b60408051808201825242808252600a6020928301819052601d829055601e8190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a16026805460ff191660029081179091556040516000805160206141b7833981519152916111b99160019190613ed6565b60405180910390a150505050565b6111d13382612af6565b6111ed5760405162461bcd60e51b8152600401610b2b90614000565b610e35838383612bed565b600061120383611480565b82106112655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b2b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e3583838360405180602001604052806000815250612054565b600a546001600160a01b031633146112d35760405162461bcd60e51b8152600401610b2b90613fcb565b6019805460ff19811660ff90911615179055565b60006112f260085490565b82106113555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b2b565b6008828154811061137657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146113b25760405162461bcd60e51b8152600401610b2b90613fcb565b6113be601683836138b4565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516113f0929190613ef1565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610afb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b2b565b60168054610ca3906140df565b60006001600160a01b0382166114eb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b2b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115315760405162461bcd60e51b8152600401610b2b90613fcb565b600060265460ff16600381111561155857634e487b7160e01b600052602160045260246000fd5b146115a55760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20556e617574686f72697a6564205472616e73616374696f6e006044820152606401610b2b565b60408051606080820183524280835260208084018690526001938501849052601a829055601b869055601c8490558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a16026805460ff191660019081179091556040516000805160206141b783398151915291610fff9160009190613ed6565b600a546001600160a01b0316331461166a5760405162461bcd60e51b8152600401610b2b90613fcb565b6116746000612d98565b565b60006010828154811061169957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b5414156117075760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b2b565b6002600b5560408051808201909152601d54808252601e5460208301526000919061173490615460614051565b421161174a57670429d069189e00009150611794565b805161175890615460614051565b421180156117735750805161176f9061a8c0614051565b4211155b15611788576703782dace9d900009150611794565b6702c68af0bb14000091505b600083116117d95760405162461bcd60e51b815260206004820152601260248201527111549493d48e881e995c9bc8185b5bdd5b9d60721b6044820152606401610b2b565b80516118275760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2073616c65206973206e6f7420616374697665000000000000006044820152606401610b2b565b80514210156118785760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2073616c65206e6f7420737461727465640000000000000000006044820152606401610b2b565b80602001518311156118de5760405162461bcd60e51b815260206004820152602960248201527f4552524f523a202043616e206f6e6c79206d696e7420313020746f6b656e7320604482015268617420612074696d6560b81b6064820152608401610b2b565b601154836015546118ef9190614051565b111561193d5760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a206d617820737570706c792065786365656465640000000000006044820152606401610b2b565b34611948848461407d565b11156119665760405162461bcd60e51b8152600401610b2b90613f85565b60195460ff16156119b55760405162461bcd60e51b815260206004820152601960248201527811549493d48e8818dbdb9d1c9858dd081a5cc81c185d5cd959603a1b6044820152606401610b2b565b6000805b84811015611a53576119cf601f80546001019055565b601f5491506119de3383612dea565b336000908152602460205260409020546119f9908690614051565b33600090815260246020908152604080832093909355602590522054611a20908690614051565b33600090815260256020526040902055601554611a3e906001614051565b60155580611a4b8161411a565b9150506119b9565b50604080518581526020810185905233917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20910160405180910390a260115484601554611aa09190614051565b1415611adf576026805460ff191660039081179091556040516000805160206141b783398151915291611ad69160029190613ed6565b60405180910390a15b50506001600b555050565b606060018054610b7e906140df565b60408051606081018252601a548152601b546020808301918252601c54838501528351808501909452601d548452601e54908401525181516000938493929091611b439190614051565b4211611b595767016345785d8a00009250611bc7565b8051611b6790615460614051565b4211611b7d57670429d069189e00009250611bc7565b8051611b8b90615460614051565b42118015611ba657508051611ba29061a8c0614051565b4211155b15611bbb576703782dace9d900009250611bc7565b6702c68af0bb14000092505b509092915050565b6001600160a01b038216331415611c285760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610b2b90613fcb565b6019805461ff001916610100179055565b600a546001600160a01b03163314611cf95760405162461bcd60e51b8152600401610b2b90613fcb565b601154601554611d0a908390614051565b1115611d585760405162461bcd60e51b815260206004820181905260248201527f4552524f523a206d617820746f74616c20737570706c792065786365656465646044820152606401610b2b565b601254601354611d69908390614051565b1115611db75760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a206d6178206769667420737570706c79206578636565646564006044820152606401610b2b565b6000805b8281101561204e576000848483818110611de557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611dfa9190613a77565b6001600160a01b03161415611e5d5760405162461bcd60e51b8152602060048201526024808201527f4552524f523a20726563657069656e7420697320746865206e756c6c206164646044820152637265737360e01b6064820152608401610b2b565b611e6b601f80546001019055565b601f549150611eae848483818110611e9357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ea89190613a77565b83612dea565b60236000858584818110611ed257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ee79190613a77565b6001600160a01b03168152602081019190915260400160002054611f0c906001614051565b60236000868685818110611f3057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f459190613a77565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555060256000858584818110611f8d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fa29190613a77565b6001600160a01b03168152602081019190915260400160002054611fc7906001614051565b60256000868685818110611feb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906120009190613a77565b6001600160a01b03168152602081019190915260400160002055601554612028906001614051565b601555601354612039906001614051565b601355806120468161411a565b915050611dbb565b50505050565b61205e3383612af6565b61207a5760405162461bcd60e51b8152600401610b2b90614000565b61204e84848484612e04565b6002600b5414156120d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b2b565b6002600b5560408051606081018252601a548152601b546020820152601c54918101919091528361210933612e37565b146121415760405162461bcd60e51b81526020600482015260086024820152670848288be9082a6960c31b6044820152606401610b2b565b6121818484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e6c92505050565b6121bd5760405162461bcd60e51b815260206004820152600d60248201526c4241445f5349474e415455524560981b6044820152606401610b2b565b846001146122065760405162461bcd60e51b81526020600482015260166024820152754552524f523a20616d6f756e74206973206e6f74203160501b6044820152606401610b2b565b805161226f5760405162461bcd60e51b815260206004820152603260248201527f4552524f523a2050726573616c65206d7573742062652061637469766520746f604482015271206d696e74204372617a792043616d656c7360701b6064820152608401610b2b565b80514210156122c05760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a2050726573616c65206e6f7420737461727465640000000000006044820152606401610b2b565b602081015181516122d19190614051565b4211156123205760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2050726573616c6520697320656e6465640000000000000000006044820152606401610b2b565b60408082015133600090815260226020529190912054612341908790614051565b111561238f5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2043616e206f6e6c79206d696e74203120746f6b656e730000006044820152606401610b2b565b601154856015546123a09190614051565b11156123ee5760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a206d617820737570706c792065786365656465640000000000006044820152606401610b2b565b67016345785d8a0000348111156124175760405162461bcd60e51b8152600401610b2b90613f85565b60195460ff16156124665760405162461bcd60e51b815260206004820152601960248201527811549493d48e8818dbdb9d1c9858dd081a5cc81c185d5cd959603a1b6044820152606401610b2b565b6000805b8781101561251557612480601f80546001019055565b601f54915061248f3383612dea565b336000908152602260205260409020546124aa906001614051565b336000908152602260209081526040808320939093556025905220546124d1906001614051565b336000908152602560205260409020556015546124ef906001614051565b601555601454612500906001614051565b6014558061250d8161411a565b91505061246a565b50604080518881526020810184905233917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e0910160405180910390a2601154876015546125629190614051565b14156125a1576026805460ff191660039081179091556040516000805160206141b7833981519152916125989160029190613ed6565b60405180910390a15b50506001600b555050505050565b60188054610ca3906140df565b6000818152600260205260409020546060906001600160a01b031661263b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b2b565b601954610100900460ff166126dc5760178054612657906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054612683906140df565b80156126d05780601f106126a5576101008083540402835291602001916126d0565b820191906000526020600020905b8154815290600101906020018083116126b357829003601f168201915b50505050509050919050565b60006126e6612e9f565b905060008151116127065760405180602001604052806000815250612734565b8061271084612eae565b601860405160200161272493929190613dc9565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146127655760405162461bcd60e51b8152600401610b2b90613fcb565b8051612778906018906020840190613938565b5050565b600a546001600160a01b031633146127a65760405162461bcd60e51b8152600401610b2b90613fcb565b8051612778906017906020840190613938565b600a546001600160a01b031633146127e35760405162461bcd60e51b8152600401610b2b90613fcb565b6001600160a01b0381166128485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b2b565b61285181612d98565b50565b6000808060265460ff16600381111561287d57634e487b7160e01b600052602160045260246000fd5b1415612887575060015b600160265460ff1660038111156128ae57634e487b7160e01b600052602160045260246000fd5b14156128b8575060025b600260265460ff1660038111156128df57634e487b7160e01b600052602160045260246000fd5b14156128e9575060035b600360265460ff16600381111561291057634e487b7160e01b600052602160045260246000fd5b141561291a575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061295057506001600160e01b03198216635b5e139f60e01b145b80610afb57506301ffc9a760e01b6001600160e01b0319831614610afb565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129a4826113fc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612a2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b2b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a7a576040519150601f19603f3d011682016040523d82523d6000602084013e612a7f565b606091505b5050905080610e355760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b2b565b6000818152600260205260408120546001600160a01b0316612b6f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b2b565b6000612b7a836113fc565b9050806001600160a01b0316846001600160a01b03161480612bb55750836001600160a01b0316612baa84610c01565b6001600160a01b0316145b80612be557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612c00826113fc565b6001600160a01b031614612c685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b2b565b6001600160a01b038216612cca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b2b565b612cd5838383612fc8565b612ce060008261296f565b6001600160a01b0383166000908152600360205260408120805460019290612d0990849061409c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d37908490614051565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612778828260405180602001604052806000815250613080565b612e0f848484612bed565b612e1b848484846130b3565b61204e5760405162461bcd60e51b8152600401610b2b90613f33565b604080516001600160a01b0383166020820152600091015b604051602081830303815290604052805190602001209050919050565b6000612e8182612e7b856131c0565b906131fb565b60265461010090046001600160a01b03908116911614905092915050565b606060168054610b7e906140df565b606081612ed25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612efc5780612ee68161411a565b9150612ef59050600a83614069565b9150612ed6565b60008167ffffffffffffffff811115612f2557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f4f576020820181803683370190505b5090505b8415612be557612f6460018361409c565b9150612f71600a86614135565b612f7c906030614051565b60f81b818381518110612f9f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612fc1600a86614069565b9450612f53565b6001600160a01b0383166130235761301e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613046565b816001600160a01b0316836001600160a01b03161461304657613046838261321f565b6001600160a01b03821661305d57610e35816132bc565b826001600160a01b0316826001600160a01b031614610e3557610e358282613395565b61308a83836133d9565b61309760008484846130b3565b610e355760405162461bcd60e51b8152600401610b2b90613f33565b60006001600160a01b0384163b156131b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906130f7903390899088908890600401613e8b565b602060405180830381600087803b15801561311157600080fd5b505af1925050508015613141575060408051601f3d908101601f1916820190925261313e91810190613c70565b60015b61319b573d80801561316f576040519150601f19603f3d011682016040523d82523d6000602084013e613174565b606091505b5080516131935760405162461bcd60e51b8152600401610b2b90613f33565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612be5565b506001949350505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01612e4f565b600080600061320a8585613527565b9150915061321781613597565b509392505050565b6000600161322c84611480565b613236919061409c565b600083815260076020526040902054909150808214613289576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132ce9060019061409c565b6000838152600960205260408120546008805493945090928490811061330457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061333357634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061337957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133a083611480565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661342f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2b565b6000818152600260205260409020546001600160a01b0316156134945760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2b565b6134a060008383612fc8565b6001600160a01b03821660009081526003602052604081208054600192906134c9908490614051565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082516041141561355e5760208301516040840151606085015160001a61355287828585613798565b94509450505050613590565b825160401415613588576020830151604084015161357d868383613885565b935093505050613590565b506000905060025b9250929050565b60008160048111156135b957634e487b7160e01b600052602160045260246000fd5b14156135c25750565b60018160048111156135e457634e487b7160e01b600052602160045260246000fd5b14156136325760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b2b565b600281600481111561365457634e487b7160e01b600052602160045260246000fd5b14156136a25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b2b565b60038160048111156136c457634e487b7160e01b600052602160045260246000fd5b141561371d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b2b565b600481600481111561373f57634e487b7160e01b600052602160045260246000fd5b14156128515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b2b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156137cf575060009050600361387c565b8460ff16601b141580156137e757508460ff16601c14155b156137f8575060009050600461387c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561384c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138755760006001925092505061387c565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016138a687828885613798565b935093505050935093915050565b8280546138c0906140df565b90600052602060002090601f0160209004810192826138e25760008555613928565b82601f106138fb5782800160ff19823516178555613928565b82800160010185558215613928579182015b8281111561392857823582559160200191906001019061390d565b506139349291506139ac565b5090565b828054613944906140df565b90600052602060002090601f0160209004810192826139665760008555613928565b82601f1061397f57805160ff1916838001178555613928565b82800160010185558215613928579182015b82811115613928578251825591602001919060010190613991565b5b8082111561393457600081556001016139ad565b600067ffffffffffffffff808411156139dc576139dc614175565b604051601f8501601f19908116603f01168101908282118183101715613a0457613a04614175565b81604052809350858152868686011115613a1d57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112613a48578182fd5b50813567ffffffffffffffff811115613a5f578182fd5b60208301915083602082850101111561359057600080fd5b600060208284031215613a88578081fd5b81356127348161418b565b60008060408385031215613aa5578081fd5b8235613ab08161418b565b91506020830135613ac08161418b565b809150509250929050565b600080600060608486031215613adf578081fd5b8335613aea8161418b565b92506020840135613afa8161418b565b929592945050506040919091013590565b60008060008060808587031215613b20578081fd5b8435613b2b8161418b565b93506020850135613b3b8161418b565b925060408501359150606085013567ffffffffffffffff811115613b5d578182fd5b8501601f81018713613b6d578182fd5b613b7c878235602084016139c1565b91505092959194509250565b60008060408385031215613b9a578182fd5b8235613ba58161418b565b915060208301358015158114613ac0578182fd5b60008060408385031215613bcb578182fd5b8235613bd68161418b565b946020939093013593505050565b60008060208385031215613bf6578182fd5b823567ffffffffffffffff80821115613c0d578384fd5b818501915085601f830112613c20578384fd5b813581811115613c2e578485fd5b8660208260051b8501011115613c42578485fd5b60209290920196919550909350505050565b600060208284031215613c65578081fd5b8135612734816141a0565b600060208284031215613c81578081fd5b8151612734816141a0565b60008060208385031215613c9e578182fd5b823567ffffffffffffffff811115613cb4578283fd5b613cc085828601613a37565b90969095509350505050565b600060208284031215613cdd578081fd5b813567ffffffffffffffff811115613cf3578182fd5b8201601f81018413613d03578182fd5b612be5848235602084016139c1565b600060208284031215613d23578081fd5b5035919050565b60008060008060608587031215613d3f578182fd5b8435935060208501359250604085013567ffffffffffffffff811115613d63578283fd5b613d6f87828801613a37565b95989497509550505050565b60008151808452613d938160208601602086016140b3565b601f01601f19169290920160200192915050565b60048110613dc557634e487b7160e01b600052602160045260246000fd5b9052565b600084516020613ddc8285838a016140b3565b855191840191613def8184848a016140b3565b85549201918390600181811c9080831680613e0b57607f831692505b858310811415613e2957634e487b7160e01b88526022600452602488fd5b808015613e3d5760018114613e4e57613e7a565b60ff19851688528388019550613e7a565b60008b815260209020895b85811015613e725781548a820152908401908801613e59565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ebe90830184613d7b565b9695505050505050565b60208101610afb8284613da7565b60408101613ee48285613da7565b6127346020830184613da7565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020815260006127346020830184613d7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4552524f523a2045746865722076616c75652073656e74206973206e6f7420636040820152651bdc9c9958dd60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561406457614064614149565b500190565b6000826140785761407861415f565b500490565b600081600019048311821515161561409757614097614149565b500290565b6000828210156140ae576140ae614149565b500390565b60005b838110156140ce5781810151838201526020016140b6565b8381111561204e5750506000910152565b600181811c908216806140f357607f821691505b6020821081141561411457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561412e5761412e614149565b5060010190565b6000826141445761414461415f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461285157600080fd5b6001600160e01b03198116811461285157600080fdfe0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3fa2646970667358221220b1f48e38e22fd89875e197cc80313c251eeafb3557383fb95a47e068d1bc177964736f6c63430008040033

Deployed Bytecode

0x60806040526004361061036e5760003560e01c80637f674f48116101c6578063bf9b7c8d116100f7578063e33b7de311610095578063f2c4ce1e1161006f578063f2c4ce1e14610a47578063f2fde38b14610a67578063f75d64a614610a87578063fd88fa6914610a9c57600080fd5b8063e33b7de3146109d3578063e985e9c5146109e8578063ed70037414610a3157600080fd5b8063cde27a35116100d1578063cde27a3514610951578063ce7c2ac214610967578063d5abeb011461099d578063da3ef23f146109b357600080fd5b8063bf9b7c8d14610909578063c66828621461091c578063c87b56dd1461093157600080fd5b80639852595c11610164578063a33441251161013e578063a33441251461088d578063a475b5dd146108b4578063a5fd7bec146108c9578063b88d4fde146108e957600080fd5b80639852595c1461082257806398d5fdca14610858578063a22cb4651461086d57600080fd5b80638cc4de19116101a05780638cc4de19146107925780638da5cb5b146107bf57806390aa0b0f146107dd57806395d89b411461080d57600080fd5b80637f674f48146107325780638b83209b1461075f5780638ca887ca1461077f57600080fd5b806342842e0e116102a05780635c975abb1161023e5780636c0360eb116102185780636c0360eb146106c857806370a08231146106dd578063710e132d146106fd578063715018a61461071d57600080fd5b80635c975abb146106785780635edbc28c146106925780636352211e146106a857600080fd5b8063518302271161027a57806351830227146105e757806352d728d91461060657806355f804b3146106335780635b7633d01461065357600080fd5b806342842e0e1461059257806346e79ffc146105b25780634f6ccce7146105c757600080fd5b806309c3fbb71161030d5780631f2898c3116102e75780631f2898c31461052857806323b872dd1461053d5780632f745c591461055d5780633a98ef391461057d57600080fd5b806309c3fbb7146104c657806318160ddd146104f3578063191655871461050857600080fd5b806306fdde031161034957806306fdde0314610437578063081812fc14610459578063081c8c4414610491578063095ea7b3146104a657600080fd5b8062456379146103bc57806301ffc9a7146103e5578063046dc1661461041557600080fd5b366103b7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77033604080516001600160a01b0390921682523460208301520160405180910390a1005b600080fd5b3480156103c857600080fd5b506103d260155481565b6040519081526020015b60405180910390f35b3480156103f157600080fd5b50610405610400366004613c54565b610ad6565b60405190151581526020016103dc565b34801561042157600080fd5b50610435610430366004613a77565b610b01565b005b34801561044357600080fd5b5061044c610b6f565b6040516103dc9190613f20565b34801561046557600080fd5b50610479610474366004613d12565b610c01565b6040516001600160a01b0390911681526020016103dc565b34801561049d57600080fd5b5061044c610c96565b3480156104b257600080fd5b506104356104c1366004613bb9565b610d24565b3480156104d257600080fd5b506103d26104e1366004613a77565b60246020526000908152604090205481565b3480156104ff57600080fd5b506008546103d2565b34801561051457600080fd5b50610435610523366004613a77565b610e3a565b34801561053457600080fd5b5061043561100c565b34801561054957600080fd5b50610435610558366004613acb565b6111c7565b34801561056957600080fd5b506103d2610578366004613bb9565b6111f8565b34801561058957600080fd5b50600c546103d2565b34801561059e57600080fd5b506104356105ad366004613acb565b61128e565b3480156105be57600080fd5b506104356112a9565b3480156105d357600080fd5b506103d26105e2366004613d12565b6112e7565b3480156105f357600080fd5b5060195461040590610100900460ff1681565b34801561061257600080fd5b506103d2610621366004613a77565b60236020526000908152604090205481565b34801561063f57600080fd5b5061043561064e366004613c8c565b611388565b34801561065f57600080fd5b506026546104799061010090046001600160a01b031681565b34801561068457600080fd5b506019546104059060ff1681565b34801561069e57600080fd5b506103d260125481565b3480156106b457600080fd5b506104796106c3366004613d12565b6113fc565b3480156106d457600080fd5b5061044c611473565b3480156106e957600080fd5b506103d26106f8366004613a77565b611480565b34801561070957600080fd5b50610435610718366004613d12565b611507565b34801561072957600080fd5b50610435611640565b34801561073e57600080fd5b506103d261074d366004613a77565b60256020526000908152604090205481565b34801561076b57600080fd5b5061047961077a366004613d12565b611676565b61043561078d366004613d12565b6116b4565b34801561079e57600080fd5b506103d26107ad366004613a77565b60226020526000908152604090205481565b3480156107cb57600080fd5b50600a546001600160a01b0316610479565b3480156107e957600080fd5b50601d54601e546107f8919082565b604080519283526020830191909152016103dc565b34801561081957600080fd5b5061044c611aea565b34801561082e57600080fd5b506103d261083d366004613a77565b6001600160a01b03166000908152600f602052604090205490565b34801561086457600080fd5b506103d2611af9565b34801561087957600080fd5b50610435610888366004613b88565b611bcf565b34801561089957600080fd5b506026546108a79060ff1681565b6040516103dc9190613ec8565b3480156108c057600080fd5b50610435611c94565b3480156108d557600080fd5b506104356108e4366004613be4565b611ccf565b3480156108f557600080fd5b50610435610904366004613b0b565b612054565b610435610917366004613d2a565b612086565b34801561092857600080fd5b5061044c6125af565b34801561093d57600080fd5b5061044c61094c366004613d12565b6125bc565b34801561095d57600080fd5b506103d260145481565b34801561097357600080fd5b506103d2610982366004613a77565b6001600160a01b03166000908152600e602052604090205490565b3480156109a957600080fd5b506103d260115481565b3480156109bf57600080fd5b506104356109ce366004613ccc565b61273b565b3480156109df57600080fd5b50600d546103d2565b3480156109f457600080fd5b50610405610a03366004613a93565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b348015610a3d57600080fd5b506103d260135481565b348015610a5357600080fd5b50610435610a62366004613ccc565b61277c565b348015610a7357600080fd5b50610435610a82366004613a77565b6127b9565b348015610a9357600080fd5b506103d2612854565b348015610aa857600080fd5b50601a54601b54601c54610abb92919083565b604080519384526020840192909252908201526060016103dc565b60006001600160e01b0319821663780e9d6360e01b1480610afb5750610afb8261291f565b92915050565b600a546001600160a01b03163314610b345760405162461bcd60e51b8152600401610b2b90613fcb565b60405180910390fd5b6001600160a01b038116610b4757600080fd5b602680546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b606060008054610b7e906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054610baa906140df565b8015610bf75780601f10610bcc57610100808354040283529160200191610bf7565b820191906000526020600020905b815481529060010190602001808311610bda57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b0316610c7a5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b2b565b506000908152600460205260409020546001600160a01b031690565b60178054610ca3906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf906140df565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b505050505081565b6000610d2f826113fc565b9050806001600160a01b0316836001600160a01b03161415610d9d5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b2b565b336001600160a01b0382161480610db95750610db98133610a03565b610e2b5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b2b565b610e35838361296f565b505050565b6001600160a01b0381166000908152600e6020526040902054610eae5760405162461bcd60e51b815260206004820152602660248201527f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060448201526573686172657360d01b6064820152608401610b2b565b6000600d5447610ebe9190614051565b6001600160a01b0383166000908152600f6020908152604080832054600c54600e909352908320549394509192610ef5908561407d565b610eff9190614069565b610f09919061409c565b905080610f6c5760405162461bcd60e51b815260206004820152602b60248201527f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060448201526a191d59481c185e5b595b9d60aa1b6064820152608401610b2b565b6001600160a01b0383166000908152600f6020526040902054610f90908290614051565b6001600160a01b0384166000908152600f6020526040902055600d54610fb7908290614051565b600d55610fc483826129dd565b604080516001600160a01b0385168152602081018390527fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b05691015b60405180910390a1505050565b600a546001600160a01b031633146110365760405162461bcd60e51b8152600401610b2b90613fcb565b600160265460ff16600381111561105d57634e487b7160e01b600052602160045260246000fd5b146110aa5760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20556e617574686f72697a6564205472616e73616374696f6e006044820152606401610b2b565b60408051606081018252601a54808252601b5460208301819052601c549383019390935290916000916110dd9190614051565b905080421161112e5760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2053616c65206e6f7420737461727465640000000000000000006044820152606401610b2b565b60408051808201825242808252600a6020928301819052601d829055601e8190558351828152928301819052909290917f07a1cedf4c1c75b37d60d4517d84a69a3d2ec0534f3a5093c93a94dde3a6a554910160405180910390a16026805460ff191660029081179091556040516000805160206141b7833981519152916111b99160019190613ed6565b60405180910390a150505050565b6111d13382612af6565b6111ed5760405162461bcd60e51b8152600401610b2b90614000565b610e35838383612bed565b600061120383611480565b82106112655760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610b2b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610e3583838360405180602001604052806000815250612054565b600a546001600160a01b031633146112d35760405162461bcd60e51b8152600401610b2b90613fcb565b6019805460ff19811660ff90911615179055565b60006112f260085490565b82106113555760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610b2b565b6008828154811061137657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b600a546001600160a01b031633146113b25760405162461bcd60e51b8152600401610b2b90613fcb565b6113be601683836138b4565b507f8a274cdd629b9aae599b13d8bfee3ee4a15350b0386a9b64087a393db009376782826040516113f0929190613ef1565b60405180910390a15050565b6000818152600260205260408120546001600160a01b031680610afb5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b2b565b60168054610ca3906140df565b60006001600160a01b0382166114eb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b2b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146115315760405162461bcd60e51b8152600401610b2b90613fcb565b600060265460ff16600381111561155857634e487b7160e01b600052602160045260246000fd5b146115a55760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a20556e617574686f72697a6564205472616e73616374696f6e006044820152606401610b2b565b60408051606080820183524280835260208084018690526001938501849052601a829055601b869055601c8490558451828152908101869052938401839052927f65fee6c7896ea03117fe27f91b636793950b4d6bfeab9389f1e96602f131bd6e910160405180910390a16026805460ff191660019081179091556040516000805160206141b783398151915291610fff9160009190613ed6565b600a546001600160a01b0316331461166a5760405162461bcd60e51b8152600401610b2b90613fcb565b6116746000612d98565b565b60006010828154811061169957634e487b7160e01b600052603260045260246000fd5b6000918252602090912001546001600160a01b031692915050565b6002600b5414156117075760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b2b565b6002600b5560408051808201909152601d54808252601e5460208301526000919061173490615460614051565b421161174a57670429d069189e00009150611794565b805161175890615460614051565b421180156117735750805161176f9061a8c0614051565b4211155b15611788576703782dace9d900009150611794565b6702c68af0bb14000091505b600083116117d95760405162461bcd60e51b815260206004820152601260248201527111549493d48e881e995c9bc8185b5bdd5b9d60721b6044820152606401610b2b565b80516118275760405162461bcd60e51b815260206004820152601960248201527f4552524f523a2073616c65206973206e6f7420616374697665000000000000006044820152606401610b2b565b80514210156118785760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2073616c65206e6f7420737461727465640000000000000000006044820152606401610b2b565b80602001518311156118de5760405162461bcd60e51b815260206004820152602960248201527f4552524f523a202043616e206f6e6c79206d696e7420313020746f6b656e7320604482015268617420612074696d6560b81b6064820152608401610b2b565b601154836015546118ef9190614051565b111561193d5760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a206d617820737570706c792065786365656465640000000000006044820152606401610b2b565b34611948848461407d565b11156119665760405162461bcd60e51b8152600401610b2b90613f85565b60195460ff16156119b55760405162461bcd60e51b815260206004820152601960248201527811549493d48e8818dbdb9d1c9858dd081a5cc81c185d5cd959603a1b6044820152606401610b2b565b6000805b84811015611a53576119cf601f80546001019055565b601f5491506119de3383612dea565b336000908152602460205260409020546119f9908690614051565b33600090815260246020908152604080832093909355602590522054611a20908690614051565b33600090815260256020526040902055601554611a3e906001614051565b60155580611a4b8161411a565b9150506119b9565b50604080518581526020810185905233917f0d905a2e95960c2ad9e627d829fae00e7f3b9794c3b62a5c376cf5deee8f2a20910160405180910390a260115484601554611aa09190614051565b1415611adf576026805460ff191660039081179091556040516000805160206141b783398151915291611ad69160029190613ed6565b60405180910390a15b50506001600b555050565b606060018054610b7e906140df565b60408051606081018252601a548152601b546020808301918252601c54838501528351808501909452601d548452601e54908401525181516000938493929091611b439190614051565b4211611b595767016345785d8a00009250611bc7565b8051611b6790615460614051565b4211611b7d57670429d069189e00009250611bc7565b8051611b8b90615460614051565b42118015611ba657508051611ba29061a8c0614051565b4211155b15611bbb576703782dace9d900009250611bc7565b6702c68af0bb14000092505b509092915050565b6001600160a01b038216331415611c285760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b2b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600a546001600160a01b03163314611cbe5760405162461bcd60e51b8152600401610b2b90613fcb565b6019805461ff001916610100179055565b600a546001600160a01b03163314611cf95760405162461bcd60e51b8152600401610b2b90613fcb565b601154601554611d0a908390614051565b1115611d585760405162461bcd60e51b815260206004820181905260248201527f4552524f523a206d617820746f74616c20737570706c792065786365656465646044820152606401610b2b565b601254601354611d69908390614051565b1115611db75760405162461bcd60e51b815260206004820152601f60248201527f4552524f523a206d6178206769667420737570706c79206578636565646564006044820152606401610b2b565b6000805b8281101561204e576000848483818110611de557634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611dfa9190613a77565b6001600160a01b03161415611e5d5760405162461bcd60e51b8152602060048201526024808201527f4552524f523a20726563657069656e7420697320746865206e756c6c206164646044820152637265737360e01b6064820152608401610b2b565b611e6b601f80546001019055565b601f549150611eae848483818110611e9357634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ea89190613a77565b83612dea565b60236000858584818110611ed257634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611ee79190613a77565b6001600160a01b03168152602081019190915260400160002054611f0c906001614051565b60236000868685818110611f3057634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611f459190613a77565b6001600160a01b03166001600160a01b031681526020019081526020016000208190555060256000858584818110611f8d57634e487b7160e01b600052603260045260246000fd5b9050602002016020810190611fa29190613a77565b6001600160a01b03168152602081019190915260400160002054611fc7906001614051565b60256000868685818110611feb57634e487b7160e01b600052603260045260246000fd5b90506020020160208101906120009190613a77565b6001600160a01b03168152602081019190915260400160002055601554612028906001614051565b601555601354612039906001614051565b601355806120468161411a565b915050611dbb565b50505050565b61205e3383612af6565b61207a5760405162461bcd60e51b8152600401610b2b90614000565b61204e84848484612e04565b6002600b5414156120d95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610b2b565b6002600b5560408051606081018252601a548152601b546020820152601c54918101919091528361210933612e37565b146121415760405162461bcd60e51b81526020600482015260086024820152670848288be9082a6960c31b6044820152606401610b2b565b6121818484848080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250612e6c92505050565b6121bd5760405162461bcd60e51b815260206004820152600d60248201526c4241445f5349474e415455524560981b6044820152606401610b2b565b846001146122065760405162461bcd60e51b81526020600482015260166024820152754552524f523a20616d6f756e74206973206e6f74203160501b6044820152606401610b2b565b805161226f5760405162461bcd60e51b815260206004820152603260248201527f4552524f523a2050726573616c65206d7573742062652061637469766520746f604482015271206d696e74204372617a792043616d656c7360701b6064820152608401610b2b565b80514210156122c05760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a2050726573616c65206e6f7420737461727465640000000000006044820152606401610b2b565b602081015181516122d19190614051565b4211156123205760405162461bcd60e51b815260206004820152601760248201527f4552524f523a2050726573616c6520697320656e6465640000000000000000006044820152606401610b2b565b60408082015133600090815260226020529190912054612341908790614051565b111561238f5760405162461bcd60e51b815260206004820152601d60248201527f4552524f523a2043616e206f6e6c79206d696e74203120746f6b656e730000006044820152606401610b2b565b601154856015546123a09190614051565b11156123ee5760405162461bcd60e51b815260206004820152601a60248201527f4552524f523a206d617820737570706c792065786365656465640000000000006044820152606401610b2b565b67016345785d8a0000348111156124175760405162461bcd60e51b8152600401610b2b90613f85565b60195460ff16156124665760405162461bcd60e51b815260206004820152601960248201527811549493d48e8818dbdb9d1c9858dd081a5cc81c185d5cd959603a1b6044820152606401610b2b565b6000805b8781101561251557612480601f80546001019055565b601f54915061248f3383612dea565b336000908152602260205260409020546124aa906001614051565b336000908152602260209081526040808320939093556025905220546124d1906001614051565b336000908152602560205260409020556015546124ef906001614051565b601555601454612500906001614051565b6014558061250d8161411a565b91505061246a565b50604080518881526020810184905233917f40038d437ff4cece80b344923544b3c8527d7f6aa2f9202a9734d5d9c7ffa0e0910160405180910390a2601154876015546125629190614051565b14156125a1576026805460ff191660039081179091556040516000805160206141b7833981519152916125989160029190613ed6565b60405180910390a15b50506001600b555050505050565b60188054610ca3906140df565b6000818152600260205260409020546060906001600160a01b031661263b5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b2b565b601954610100900460ff166126dc5760178054612657906140df565b80601f0160208091040260200160405190810160405280929190818152602001828054612683906140df565b80156126d05780601f106126a5576101008083540402835291602001916126d0565b820191906000526020600020905b8154815290600101906020018083116126b357829003601f168201915b50505050509050919050565b60006126e6612e9f565b905060008151116127065760405180602001604052806000815250612734565b8061271084612eae565b601860405160200161272493929190613dc9565b6040516020818303038152906040525b9392505050565b600a546001600160a01b031633146127655760405162461bcd60e51b8152600401610b2b90613fcb565b8051612778906018906020840190613938565b5050565b600a546001600160a01b031633146127a65760405162461bcd60e51b8152600401610b2b90613fcb565b8051612778906017906020840190613938565b600a546001600160a01b031633146127e35760405162461bcd60e51b8152600401610b2b90613fcb565b6001600160a01b0381166128485760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b2b565b61285181612d98565b50565b6000808060265460ff16600381111561287d57634e487b7160e01b600052602160045260246000fd5b1415612887575060015b600160265460ff1660038111156128ae57634e487b7160e01b600052602160045260246000fd5b14156128b8575060025b600260265460ff1660038111156128df57634e487b7160e01b600052602160045260246000fd5b14156128e9575060035b600360265460ff16600381111561291057634e487b7160e01b600052602160045260246000fd5b141561291a575060045b919050565b60006001600160e01b031982166380ac58cd60e01b148061295057506001600160e01b03198216635b5e139f60e01b145b80610afb57506301ffc9a760e01b6001600160e01b0319831614610afb565b600081815260046020526040902080546001600160a01b0319166001600160a01b03841690811790915581906129a4826113fc565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612a2d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610b2b565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114612a7a576040519150601f19603f3d011682016040523d82523d6000602084013e612a7f565b606091505b5050905080610e355760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610b2b565b6000818152600260205260408120546001600160a01b0316612b6f5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b2b565b6000612b7a836113fc565b9050806001600160a01b0316846001600160a01b03161480612bb55750836001600160a01b0316612baa84610c01565b6001600160a01b0316145b80612be557506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316612c00826113fc565b6001600160a01b031614612c685760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b2b565b6001600160a01b038216612cca5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b2b565b612cd5838383612fc8565b612ce060008261296f565b6001600160a01b0383166000908152600360205260408120805460019290612d0990849061409c565b90915550506001600160a01b0382166000908152600360205260408120805460019290612d37908490614051565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612778828260405180602001604052806000815250613080565b612e0f848484612bed565b612e1b848484846130b3565b61204e5760405162461bcd60e51b8152600401610b2b90613f33565b604080516001600160a01b0383166020820152600091015b604051602081830303815290604052805190602001209050919050565b6000612e8182612e7b856131c0565b906131fb565b60265461010090046001600160a01b03908116911614905092915050565b606060168054610b7e906140df565b606081612ed25750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612efc5780612ee68161411a565b9150612ef59050600a83614069565b9150612ed6565b60008167ffffffffffffffff811115612f2557634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612f4f576020820181803683370190505b5090505b8415612be557612f6460018361409c565b9150612f71600a86614135565b612f7c906030614051565b60f81b818381518110612f9f57634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a905350612fc1600a86614069565b9450612f53565b6001600160a01b0383166130235761301e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b613046565b816001600160a01b0316836001600160a01b03161461304657613046838261321f565b6001600160a01b03821661305d57610e35816132bc565b826001600160a01b0316826001600160a01b031614610e3557610e358282613395565b61308a83836133d9565b61309760008484846130b3565b610e355760405162461bcd60e51b8152600401610b2b90613f33565b60006001600160a01b0384163b156131b557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906130f7903390899088908890600401613e8b565b602060405180830381600087803b15801561311157600080fd5b505af1925050508015613141575060408051601f3d908101601f1916820190925261313e91810190613c70565b60015b61319b573d80801561316f576040519150601f19603f3d011682016040523d82523d6000602084013e613174565b606091505b5080516131935760405162461bcd60e51b8152600401610b2b90613f33565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612be5565b506001949350505050565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01612e4f565b600080600061320a8585613527565b9150915061321781613597565b509392505050565b6000600161322c84611480565b613236919061409c565b600083815260076020526040902054909150808214613289576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906132ce9060019061409c565b6000838152600960205260408120546008805493945090928490811061330457634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061333357634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061337957634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006133a083611480565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661342f5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b2b565b6000818152600260205260409020546001600160a01b0316156134945760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b2b565b6134a060008383612fc8565b6001600160a01b03821660009081526003602052604081208054600192906134c9908490614051565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008082516041141561355e5760208301516040840151606085015160001a61355287828585613798565b94509450505050613590565b825160401415613588576020830151604084015161357d868383613885565b935093505050613590565b506000905060025b9250929050565b60008160048111156135b957634e487b7160e01b600052602160045260246000fd5b14156135c25750565b60018160048111156135e457634e487b7160e01b600052602160045260246000fd5b14156136325760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b2b565b600281600481111561365457634e487b7160e01b600052602160045260246000fd5b14156136a25760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b2b565b60038160048111156136c457634e487b7160e01b600052602160045260246000fd5b141561371d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b2b565b600481600481111561373f57634e487b7160e01b600052602160045260246000fd5b14156128515760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b2b565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156137cf575060009050600361387c565b8460ff16601b141580156137e757508460ff16601c14155b156137f8575060009050600461387c565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561384c573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166138755760006001925092505061387c565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016138a687828885613798565b935093505050935093915050565b8280546138c0906140df565b90600052602060002090601f0160209004810192826138e25760008555613928565b82601f106138fb5782800160ff19823516178555613928565b82800160010185558215613928579182015b8281111561392857823582559160200191906001019061390d565b506139349291506139ac565b5090565b828054613944906140df565b90600052602060002090601f0160209004810192826139665760008555613928565b82601f1061397f57805160ff1916838001178555613928565b82800160010185558215613928579182015b82811115613928578251825591602001919060010190613991565b5b8082111561393457600081556001016139ad565b600067ffffffffffffffff808411156139dc576139dc614175565b604051601f8501601f19908116603f01168101908282118183101715613a0457613a04614175565b81604052809350858152868686011115613a1d57600080fd5b858560208301376000602087830101525050509392505050565b60008083601f840112613a48578182fd5b50813567ffffffffffffffff811115613a5f578182fd5b60208301915083602082850101111561359057600080fd5b600060208284031215613a88578081fd5b81356127348161418b565b60008060408385031215613aa5578081fd5b8235613ab08161418b565b91506020830135613ac08161418b565b809150509250929050565b600080600060608486031215613adf578081fd5b8335613aea8161418b565b92506020840135613afa8161418b565b929592945050506040919091013590565b60008060008060808587031215613b20578081fd5b8435613b2b8161418b565b93506020850135613b3b8161418b565b925060408501359150606085013567ffffffffffffffff811115613b5d578182fd5b8501601f81018713613b6d578182fd5b613b7c878235602084016139c1565b91505092959194509250565b60008060408385031215613b9a578182fd5b8235613ba58161418b565b915060208301358015158114613ac0578182fd5b60008060408385031215613bcb578182fd5b8235613bd68161418b565b946020939093013593505050565b60008060208385031215613bf6578182fd5b823567ffffffffffffffff80821115613c0d578384fd5b818501915085601f830112613c20578384fd5b813581811115613c2e578485fd5b8660208260051b8501011115613c42578485fd5b60209290920196919550909350505050565b600060208284031215613c65578081fd5b8135612734816141a0565b600060208284031215613c81578081fd5b8151612734816141a0565b60008060208385031215613c9e578182fd5b823567ffffffffffffffff811115613cb4578283fd5b613cc085828601613a37565b90969095509350505050565b600060208284031215613cdd578081fd5b813567ffffffffffffffff811115613cf3578182fd5b8201601f81018413613d03578182fd5b612be5848235602084016139c1565b600060208284031215613d23578081fd5b5035919050565b60008060008060608587031215613d3f578182fd5b8435935060208501359250604085013567ffffffffffffffff811115613d63578283fd5b613d6f87828801613a37565b95989497509550505050565b60008151808452613d938160208601602086016140b3565b601f01601f19169290920160200192915050565b60048110613dc557634e487b7160e01b600052602160045260246000fd5b9052565b600084516020613ddc8285838a016140b3565b855191840191613def8184848a016140b3565b85549201918390600181811c9080831680613e0b57607f831692505b858310811415613e2957634e487b7160e01b88526022600452602488fd5b808015613e3d5760018114613e4e57613e7a565b60ff19851688528388019550613e7a565b60008b815260209020895b85811015613e725781548a820152908401908801613e59565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613ebe90830184613d7b565b9695505050505050565b60208101610afb8284613da7565b60408101613ee48285613da7565b6127346020830184613da7565b60208152816020820152818360408301376000818301604090810191909152601f909201601f19160101919050565b6020815260006127346020830184613d7b565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4552524f523a2045746865722076616c75652073656e74206973206e6f7420636040820152651bdc9c9958dd60d21b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6000821982111561406457614064614149565b500190565b6000826140785761407861415f565b500490565b600081600019048311821515161561409757614097614149565b500290565b6000828210156140ae576140ae614149565b500390565b60005b838110156140ce5781810151838201526020016140b6565b8381111561204e5750506000910152565b600181811c908216806140f357607f821691505b6020821081141561411457634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561412e5761412e614149565b5060010190565b6000826141445761414461415f565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461285157600080fd5b6001600160e01b03198116811461285157600080fdfe0a97a4ee45751e2abf3e4fc8946939630b11b371ea8ae39ccdc3056e98f5cc3fa2646970667358221220b1f48e38e22fd89875e197cc80313c251eeafb3557383fb95a47e068d1bc177964736f6c63430008040033

Deployed Bytecode Sourcemap

68442:11989:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36039:40;22875:10;36039:40;;;-1:-1:-1;;;;;9963:32:1;;;9945:51;;36069:9:0;10027:2:1;10012:18;;10005:34;9918:18;36039:40:0;;;;;;;68442:11989;;;;;69009:23;;;;;;;;;;;;;;;;;;;30363:25:1;;;30351:2;30336:18;69009:23:0;;;;;;;;62213:224;;;;;;;;;;-1:-1:-1;62213:224:0;;;;;:::i;:::-;;:::i;:::-;;;10987:14:1;;10980:22;10962:41;;10950:2;10935:18;62213:224:0;10917:92:1;71258:166:0;;;;;;;;;;-1:-1:-1;71258:166:0;;;;;:::i;:::-;;:::i;:::-;;50105:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;51664:221::-;;;;;;;;;;-1:-1:-1;51664:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9719:32:1;;;9701:51;;9689:2;9674:18;51664:221:0;9656:102:1;69067:28:0;;;;;;;;;;;;;:::i;51187:411::-;;;;;;;;;;-1:-1:-1;51187:411:0;;;;;:::i;:::-;;:::i;69751:47::-;;;;;;;;;;-1:-1:-1;69751:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;62853:113;;;;;;;;;;-1:-1:-1;62941:10:0;:17;62853:113;;37245:613;;;;;;;;;;-1:-1:-1;37245:613:0;;;;;:::i;:::-;;:::i;72037:730::-;;;;;;;;;;;;;:::i;52554:339::-;;;;;;;;;;-1:-1:-1;52554:339:0;;;;;:::i;:::-;;:::i;62521:256::-;;;;;;;;;;-1:-1:-1;62521:256:0;;;;;:::i;:::-;;:::i;36170:91::-;;;;;;;;;;-1:-1:-1;36241:12:0;;36170:91;;52964:185;;;;;;;;;;-1:-1:-1;52964:185:0;;;;;:::i;:::-;;:::i;70817:80::-;;;;;;;;;;;;;:::i;63043:233::-;;;;;;;;;;-1:-1:-1;63043:233:0;;;;;:::i;:::-;;:::i;69179:28::-;;;;;;;;;;-1:-1:-1;69179:28:0;;;;;;;;;;;69697:47;;;;;;;;;;-1:-1:-1;69697:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;70905:156;;;;;;;;;;-1:-1:-1;70905:156:0;;;;;:::i;:::-;;:::i;70014:73::-;;;;;;;;;;-1:-1:-1;70014:73:0;;;;;;;-1:-1:-1;;;;;70014:73:0;;;69146:26;;;;;;;;;;-1:-1:-1;69146:26:0;;;;;;;;68903:34;;;;;;;;;;;;;;;;49799:239;;;;;;;;;;-1:-1:-1;49799:239:0;;;;;:::i;:::-;;:::i;69039:21::-;;;;;;;;;;;;;:::i;49529:208::-;;;;;;;;;;-1:-1:-1;49529:208:0;;;;;:::i;:::-;;:::i;71434:595::-;;;;;;;;;;-1:-1:-1;71434:595:0;;;;;:::i;:::-;;:::i;24658:94::-;;;;;;;;;;;;;:::i;69805:48::-;;;;;;;;;;-1:-1:-1;69805:48:0;;;;;:::i;:::-;;;;;;;;;;;;;;36945:100;;;;;;;;;;-1:-1:-1;36945:100:0;;;;;:::i;:::-;;:::i;76988:1934::-;;;;;;:::i;:::-;;:::i;69640:50::-;;;;;;;;;;-1:-1:-1;69640:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;24007:87;;;;;;;;;;-1:-1:-1;24080:6:0;;-1:-1:-1;;;;;24080:6:0;24007:87;;69255:28;;;;;;;;;;-1:-1:-1;69255:28:0;;;;;;;;;;;;;30573:25:1;;;30629:2;30614:18;;30607:34;;;;30546:18;69255:28:0;30528:119:1;50274:104:0;;;;;;;;;;;;;:::i;36745:109::-;;;;;;;;;;-1:-1:-1;36745:109:0;;;;;:::i;:::-;-1:-1:-1;;;;;36828:18:0;36801:7;36828:18;;;:9;:18;;;;;;;36745:109;72775:826;;;;;;;;;;;;;:::i;51957:295::-;;;;;;;;;;-1:-1:-1;51957:295:0;;;;;:::i;:::-;;:::i;69971:30::-;;;;;;;;;;-1:-1:-1;69971:30:0;;;;;;;;;;;;;;;:::i;71177:69::-;;;;;;;;;;;;;:::i;73609:975::-;;;;;;;;;;-1:-1:-1;73609:975:0;;;;;:::i;:::-;;:::i;53220:328::-;;;;;;;;;;-1:-1:-1;53220:328:0;;;;;:::i;:::-;;:::i;74937:2043::-;;;;;;:::i;:::-;;:::i;69102:37::-;;;;;;;;;;;;;:::i;79412:723::-;;;;;;;;;;-1:-1:-1;79412:723:0;;;;;:::i;:::-;;:::i;68975:27::-;;;;;;;;;;;;;;;;36541:105;;;;;;;;;;-1:-1:-1;36541:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;36622:16:0;36595:7;36622:16;;;:7;:16;;;;;;;36541:105;68864:32;;;;;;;;;;;;;;;;80143:151;;;;;;;;;;-1:-1:-1;80143:151:0;;;;;:::i;:::-;;:::i;36355:95::-;;;;;;;;;;-1:-1:-1;36428:14:0;;36355:95;;52323:164;;;;;;;;;;-1:-1:-1;52323:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;52444:25:0;;;52420:4;52444:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;52323:164;68944:24;;;;;;;;;;;;;;;;80302:126;;;;;;;;;;-1:-1:-1;80302:126:0;;;;;:::i;:::-;;:::i;24907:192::-;;;;;;;;;;-1:-1:-1;24907:192:0;;;;;:::i;:::-;;:::i;78930:474::-;;;;;;;;;;;;;:::i;69214:34::-;;;;;;;;;;-1:-1:-1;69214:34:0;;;;;;;;;;;;;;;;30854:25:1;;;30910:2;30895:18;;30888:34;;;;30938:18;;;30931:34;30842:2;30827:18;69214:34:0;30809:162:1;62213:224:0;62315:4;-1:-1:-1;;;;;;62339:50:0;;-1:-1:-1;;;62339:50:0;;:90;;;62393:36;62417:11;62393:23;:36::i;:::-;62332:97;62213:224;-1:-1:-1;;62213:224:0:o;71258:166::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;;;;;71346:28:0;::::1;71338:37;;;::::0;::::1;;71386:13;:30:::0;;-1:-1:-1;;;;;71386:30:0;;::::1;;;-1:-1:-1::0;;;;;;71386:30:0;;::::1;::::0;;;::::1;::::0;;71258:166::o;50105:100::-;50159:13;50192:5;50185:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50105:100;:::o;51664:221::-;51740:7;55147:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55147:16:0;51760:73;;;;-1:-1:-1;;;51760:73:0;;22884:2:1;51760:73:0;;;22866:21:1;22923:2;22903:18;;;22896:30;22962:34;22942:18;;;22935:62;-1:-1:-1;;;23013:18:1;;;23006:42;23065:19;;51760:73:0;22856:234:1;51760:73:0;-1:-1:-1;51853:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;51853:24:0;;51664:221::o;69067:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51187:411::-;51268:13;51284:23;51299:7;51284:14;:23::i;:::-;51268:39;;51332:5;-1:-1:-1;;;;;51326:11:0;:2;-1:-1:-1;;;;;51326:11:0;;;51318:57;;;;-1:-1:-1;;;51318:57:0;;25600:2:1;51318:57:0;;;25582:21:1;25639:2;25619:18;;;25612:30;25678:34;25658:18;;;25651:62;-1:-1:-1;;;25729:18:1;;;25722:31;25770:19;;51318:57:0;25572:223:1;51318:57:0;22875:10;-1:-1:-1;;;;;51410:21:0;;;;:62;;-1:-1:-1;51435:37:0;51452:5;22875:10;52323:164;:::i;51435:37::-;51388:168;;;;-1:-1:-1;;;51388:168:0;;20162:2:1;51388:168:0;;;20144:21:1;20201:2;20181:18;;;20174:30;20240:34;20220:18;;;20213:62;20311:26;20291:18;;;20284:54;20355:19;;51388:168:0;20134:246:1;51388:168:0;51569:21;51578:2;51582:7;51569:8;:21::i;:::-;51187:411;;;:::o;37245:613::-;-1:-1:-1;;;;;37321:16:0;;37340:1;37321:16;;;:7;:16;;;;;;37313:71;;;;-1:-1:-1;;;37313:71:0;;15874:2:1;37313:71:0;;;15856:21:1;15913:2;15893:18;;;15886:30;15952:34;15932:18;;;15925:62;-1:-1:-1;;;16003:18:1;;;15996:36;16049:19;;37313:71:0;15846:228:1;37313:71:0;37397:21;37445:14;;37421:21;:38;;;;:::i;:::-;-1:-1:-1;;;;;37540:18:0;;37470:15;37540:18;;;:9;:18;;;;;;;;;37525:12;;37505:7;:16;;;;;;;37397:62;;-1:-1:-1;37470:15:0;;37489:32;;37397:62;37489:32;:::i;:::-;37488:49;;;;:::i;:::-;:70;;;;:::i;:::-;37470:88;-1:-1:-1;37579:12:0;37571:68;;;;-1:-1:-1;;;37571:68:0;;19403:2:1;37571:68:0;;;19385:21:1;19442:2;19422:18;;;19415:30;19481:34;19461:18;;;19454:62;-1:-1:-1;;;19532:18:1;;;19525:41;19583:19;;37571:68:0;19375:233:1;37571:68:0;-1:-1:-1;;;;;37673:18:0;;;;;;:9;:18;;;;;;:28;;37694:7;;37673:28;:::i;:::-;-1:-1:-1;;;;;37652:18:0;;;;;;:9;:18;;;;;:49;37729:14;;:24;;37746:7;;37729:24;:::i;:::-;37712:14;:41;37766:35;37784:7;37793;37766:17;:35::i;:::-;37817:33;;;-1:-1:-1;;;;;9963:32:1;;9945:51;;10027:2;10012:18;;10005:34;;;37817:33:0;;9918:18:1;37817:33:0;;;;;;;;37245:613;;;:::o;72037:730::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;72122:22:::1;72110:8;::::0;::::1;;:34;::::0;::::1;;;;-1:-1:-1::0;;;72110:34:0::1;;;;;;;;;;72088:115;;;::::0;-1:-1:-1;;;72088:115:0;;14750:2:1;72088:115:0::1;::::0;::::1;14732:21:1::0;14789:2;14769:18;;;14762:30;14828:33;14808:18;;;14801:61;14879:18;;72088:115:0::1;14722:181:1::0;72088:115:0::1;72214:51;::::0;;::::1;::::0;::::1;::::0;;72252:13:::1;72214:51:::0;;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;:35:::1;::::0;72302:63:::1;::::0;72214:51;72302:63:::1;:::i;:::-;72276:89;;72402:15;72384;:33;72376:69;;;::::0;-1:-1:-1;;;72376:69:0;;26002:2:1;72376:69:0::1;::::0;::::1;25984:21:1::0;26041:2;26021:18;;;26014:30;26080:25;26060:18;;;26053:53;26123:18;;72376:69:0::1;25974:173:1::0;72376:69:0::1;72549:33;::::0;;;;::::1;::::0;;72477:15:::1;72549:33:::0;;;72523:2:::1;72549:33;::::0;;::::1;::::0;;;72536:10:::1;:46:::0;;;;;;;72598:39;;30573:25:1;;;30614:18;;;30607:34;;;72477:15:0;;72523:2;;72598:39:::1;::::0;30546:18:1;72598:39:0::1;;;;;;;72648:8;:30:::0;;-1:-1:-1;;72648:30:0::1;72659:19;72648:30:::0;;::::1;::::0;;;72694:65:::1;::::0;-1:-1:-1;;;;;;;;;;;72694:65:0;::::1;::::0;72648:30;;72659:19;72694:65:::1;:::i;:::-;;;;;;;;24298:1;;;;72037:730::o:0;52554:339::-;52749:41;22875:10;52782:7;52749:18;:41::i;:::-;52741:103;;;;-1:-1:-1;;;52741:103:0;;;;;;;:::i;:::-;52857:28;52867:4;52873:2;52877:7;52857:9;:28::i;62521:256::-;62618:7;62654:23;62671:5;62654:16;:23::i;:::-;62646:5;:31;62638:87;;;;-1:-1:-1;;;62638:87:0;;13512:2:1;62638:87:0;;;13494:21:1;13551:2;13531:18;;;13524:30;13590:34;13570:18;;;13563:62;-1:-1:-1;;;13641:18:1;;;13634:41;13692:19;;62638:87:0;13484:233:1;62638:87:0;-1:-1:-1;;;;;;62743:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;62521:256::o;52964:185::-;53102:39;53119:4;53125:2;53129:7;53102:39;;;;;;;;;;;;:16;:39::i;70817:80::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;70883:6:::1;::::0;;-1:-1:-1;;70873:16:0;::::1;70883:6;::::0;;::::1;70882:7;70873:16;::::0;;70817:80::o;63043:233::-;63118:7;63154:30;62941:10;:17;;62853:113;63154:30;63146:5;:38;63138:95;;;;-1:-1:-1;;;63138:95:0;;28579:2:1;63138:95:0;;;28561:21:1;28618:2;28598:18;;;28591:30;28657:34;28637:18;;;28630:62;-1:-1:-1;;;28708:18:1;;;28701:42;28760:19;;63138:95:0;28551:234:1;63138:95:0;63251:10;63262:5;63251:17;;;;;;-1:-1:-1;;;63251:17:0;;;;;;;;;;;;;;;;;63244:24;;63043:233;;;:::o;70905:156::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;70986:23:::1;:7;70996:13:::0;;70986:23:::1;:::i;:::-;;71025:28;71039:13;;71025:28;;;;;;;:::i;:::-;;;;;;;;70905:156:::0;;:::o;49799:239::-;49871:7;49907:16;;;:7;:16;;;;;;-1:-1:-1;;;;;49907:16:0;49942:19;49934:73;;;;-1:-1:-1;;;49934:73:0;;20998:2:1;49934:73:0;;;20980:21:1;21037:2;21017:18;;;21010:30;21076:34;21056:18;;;21049:62;-1:-1:-1;;;21127:18:1;;;21120:39;21176:19;;49934:73:0;20970:231:1;69039:21:0;;;;;;;:::i;49529:208::-;49601:7;-1:-1:-1;;;;;49629:19:0;;49621:74;;;;-1:-1:-1;;;49621:74:0;;20587:2:1;49621:74:0;;;20569:21:1;20626:2;20606:18;;;20599:30;20665:34;20645:18;;;20638:62;-1:-1:-1;;;20716:18:1;;;20709:40;20766:19;;49621:74:0;20559:232:1;49621:74:0;-1:-1:-1;;;;;;49713:16:0;;;;;:9;:16;;;;;;;49529:208::o;71434:595::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;71539:29:::1;71527:8;::::0;::::1;;:41;::::0;::::1;;;;-1:-1:-1::0;;;71527:41:0::1;;;;;;;;;;71505:122;;;::::0;-1:-1:-1;;;71505:122:0;;14750:2:1;71505:122:0::1;::::0;::::1;14732:21:1::0;14789:2;14769:18;;;14762:30;14828:33;14808:18;;;14801:61;14879:18;;71505:122:0::1;14722:181:1::0;71505:122:0::1;71733:47;::::0;;::::1;::::0;;::::1;::::0;;71659:15:::1;71733:47:::0;;;::::1;::::0;;::::1;::::0;;;71705:1:::1;71733:47:::0;;;;;;71717:13:::1;:63:::0;;;;;;;;;;;71796:53;;30854:25:1;;;30895:18;;;30888:34;;;30938:18;;;30931:34;;;71659:15:0;71796:53:::1;::::0;30827:18:1;71796:53:0::1;;;;;;;71860:8;:33:::0;;-1:-1:-1;;71860:33:0::1;71871:22;71860:33:::0;;::::1;::::0;;;71909:112:::1;::::0;-1:-1:-1;;;;;;;;;;;71909:112:0;::::1;::::0;-1:-1:-1;;71871:22:0;71909:112:::1;:::i;24658:94::-:0;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;24723:21:::1;24741:1;24723:9;:21::i;:::-;24658:94::o:0;36945:100::-;36996:7;37023;37031:5;37023:14;;;;;;-1:-1:-1;;;37023:14:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;37023:14:0;;36945:100;-1:-1:-1;;36945:100:0:o;76988:1934::-;17745:1;18341:7;;:19;;18333:63;;;;-1:-1:-1;;;18333:63:0;;29352:2:1;18333:63:0;;;29334:21:1;29391:2;29371:18;;;29364:30;29430:33;29410:18;;;29403:61;29481:18;;18333:63:0;29324:181:1;18333:63:0;17745:1;18474:7;:18;77089:42:::1;::::0;;;;::::1;::::0;;;77121:10:::1;77089:42:::0;;;;;;::::1;::::0;::::1;::::0;77064:14:::1;::::0;77089:42;77165:31:::1;::::0;77189:7:::1;77165:31;:::i;:::-;77146:15;:50;77142:412;;77222:18;77213:27;;77142:412;;;77305:21:::0;;:31:::1;::::0;77329:7:::1;77305:31;:::i;:::-;77287:15;:49;77286:121;;;;-1:-1:-1::0;77374:21:0;;:32:::1;::::0;77398:8:::1;77374:32;:::i;:::-;77355:15;:51;;77286:121;77268:286;;;77443:18;77434:27;;77268:286;;;77514:18;77505:27;;77268:286;77582:1;77572:7;:11;77564:42;;;::::0;-1:-1:-1;;;77564:42:0;;19815:2:1;77564:42:0::1;::::0;::::1;19797:21:1::0;19854:2;19834:18;;;19827:30;-1:-1:-1;;;19873:18:1;;;19866:48;19931:18;;77564:42:0::1;19787:168:1::0;77564:42:0::1;77625:21:::0;;77617:63:::1;;;::::0;-1:-1:-1;;;77617:63:0;;22530:2:1;77617:63:0::1;::::0;::::1;22512:21:1::0;22569:2;22549:18;;;22542:30;22608:27;22588:18;;;22581:55;22653:18;;77617:63:0::1;22502:175:1::0;77617:63:0::1;77732:21:::0;;77713:15:::1;:40;;77691:113;;;::::0;-1:-1:-1;;;77691:113:0;;18280:2:1;77691:113:0::1;::::0;::::1;18262:21:1::0;18319:2;18299:18;;;18292:30;18358:25;18338:18;;;18331:53;18401:18;;77691:113:0::1;18252:173:1::0;77691:113:0::1;77848:11;:20;;;77837:7;:31;;77815:122;;;::::0;-1:-1:-1;;;77815:122:0;;17040:2:1;77815:122:0::1;::::0;::::1;17022:21:1::0;17079:2;17059:18;;;17052:30;17118:34;17098:18;;;17091:62;-1:-1:-1;;;17169:18:1;;;17162:39;17218:19;;77815:122:0::1;17012:231:1::0;77815:122:0::1;77978:9;;77967:7;77956:8;;:18;;;;:::i;:::-;:31;;77948:70;;;::::0;-1:-1:-1;;;77948:70:0;;30064:2:1;77948:70:0::1;::::0;::::1;30046:21:1::0;30103:2;30083:18;;;30076:30;30142:28;30122:18;;;30115:56;30188:18;;77948:70:0::1;30036:176:1::0;77948:70:0::1;78071:9;78051:16;78060:7:::0;78051:6;:16:::1;:::i;:::-;:29;;78029:117;;;;-1:-1:-1::0;;;78029:117:0::1;;;;;;;:::i;:::-;78166:6;::::0;::::1;;78165:7;78157:45;;;::::0;-1:-1:-1;;;78157:45:0;;27874:2:1;78157:45:0::1;::::0;::::1;27856:21:1::0;27913:2;27893:18;;;27886:30;-1:-1:-1;;;27932:18:1;;;27925:55;27997:18;;78157:45:0::1;27846:175:1::0;78157:45:0::1;78213:18;::::0;78242:379:::1;78270:7;78264:3;:13;78242:379;;;78301:21;:9;19718:19:::0;;19736:1;19718:19;;;19629:127;78301:21:::1;78350:9;19599:14:::0;78337:32:::1;;78384:33;78394:10;78406;78384:9;:33::i;:::-;78472:10;78459:24;::::0;;;:12:::1;:24;::::0;;;;;:34:::1;::::0;78486:7;;78459:34:::1;:::i;:::-;78445:10;78432:24;::::0;;;:12:::1;:24;::::0;;;;;;;:61;;;;78536:13:::1;:25:::0;;;;:35:::1;::::0;78564:7;;78536:35:::1;:::i;:::-;78522:10;78508:25;::::0;;;:13:::1;:25;::::0;;;;:63;78597:8:::1;::::0;:12:::1;::::0;78608:1:::1;78597:12;:::i;:::-;78586:8;:23:::0;78279:5;::::1;::::0;::::1;:::i;:::-;;;;78242:379;;;-1:-1:-1::0;78636:37:0::1;::::0;;30573:25:1;;;30629:2;30614:18;;30607:34;;;78645:10:0::1;::::0;78636:37:::1;::::0;30546:18:1;78636:37:0::1;;;;;;;78710:9;;78699:7;78688:8;;:18;;;;:::i;:::-;:31;78684:231;;;78736:8;:33:::0;;-1:-1:-1;;78736:33:0::1;78747:22;78736:33:::0;;::::1;::::0;;;78789:114:::1;::::0;-1:-1:-1;;;;;;;;;;;78789:114:0;::::1;::::0;78828:19:::1;::::0;78747:22;78789:114:::1;:::i;:::-;;;;;;;;78684:231;-1:-1:-1::0;;17701:1:0;18653:7;:22;-1:-1:-1;;76988:1934:0:o;50274:104::-;50330:13;50363:7;50356:14;;;;;:::i;72775:826::-;72861:51;;;;;;;;72899:13;72861:51;;;;;;;;;;;;;;;;;;72923:42;;;;;;;;72955:10;72923:42;;;;;;;;;73053:23;73026:24;;72816:7;;;;72861:51;72923:42;;73026:50;;73053:23;73026:50;:::i;:::-;72994:15;:82;72976:594;;73112:18;73103:27;;72976:594;;;73181:21;;:31;;73205:7;73181:31;:::i;:::-;73162:15;:50;73158:412;;73238:18;73229:27;;73158:412;;;73321:21;;:31;;73345:7;73321:31;:::i;:::-;73303:15;:49;73302:121;;;;-1:-1:-1;73390:21:0;;:32;;73414:8;73390:32;:::i;:::-;73371:15;:51;;73302:121;73284:286;;;73459:18;73450:27;;73284:286;;;73530:18;73521:27;;73284:286;-1:-1:-1;73587:6:0;;72775:826;-1:-1:-1;;72775:826:0:o;51957:295::-;-1:-1:-1;;;;;52060:24:0;;22875:10;52060:24;;52052:62;;;;-1:-1:-1;;;52052:62:0;;16686:2:1;52052:62:0;;;16668:21:1;16725:2;16705:18;;;16698:30;16764:27;16744:18;;;16737:55;16809:18;;52052:62:0;16658:175:1;52052:62:0;22875:10;52127:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;52127:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;52127:53:0;;;;;;;;;;52196:48;;10962:41:1;;;52127:42:0;;22875:10;52196:48;;10935:18:1;52196:48:0;;;;;;;51957:295;;:::o;71177:69::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;71223:8:::1;:15:::0;;-1:-1:-1;;71223:15:0::1;;;::::0;;71177:69::o;73609:975::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;73742:9:::1;::::0;73710:8:::1;::::0;:28:::1;::::0;73721:10;;73710:28:::1;:::i;:::-;:41;;73688:123;;;::::0;-1:-1:-1;;;73688:123:0;;27513:2:1;73688:123:0::1;::::0;::::1;27495:21:1::0;;;27532:18;;;27525:30;27591:34;27571:18;;;27564:62;27643:18;;73688:123:0::1;27485:182:1::0;73688:123:0::1;73879:13;::::0;73846:9:::1;::::0;:29:::1;::::0;73858:10;;73846:29:::1;:::i;:::-;:46;;73824:127;;;::::0;-1:-1:-1;;;73824:127:0;;28992:2:1;73824:127:0::1;::::0;::::1;28974:21:1::0;29031:2;29011:18;;;29004:30;29070:33;29050:18;;;29043:61;29121:18;;73824:127:0::1;28964:181:1::0;73824:127:0::1;73964:18;::::0;73993:584:::1;74015:23:::0;;::::1;73993:584;;;74115:1;74088:10:::0;;74099:3;74088:15;;::::1;;;-1:-1:-1::0;;;74088:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74088:29:0::1;;;74062:127;;;::::0;-1:-1:-1;;;74062:127:0;;26690:2:1;74062:127:0::1;::::0;::::1;26672:21:1::0;26729:2;26709:18;;;26702:30;26768:34;26748:18;;;26741:62;-1:-1:-1;;;26819:18:1;;;26812:34;26863:19;;74062:127:0::1;26662:226:1::0;74062:127:0::1;74204:21;:9;19718:19:::0;;19736:1;19718:19;;;19629:127;74204:21:::1;74253:9;19599:14:::0;74240:32:::1;;74287:38;74297:10;;74308:3;74297:15;;;;;-1:-1:-1::0;;;74297:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;74314:10;74287:9;:38::i;:::-;74372:12;:29;74385:10;;74396:3;74385:15;;;;;-1:-1:-1::0;;;74385:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74372:29:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;74372:29:0;;:33:::1;::::0;74404:1:::1;74372:33;:::i;:::-;74340:12;:29;74353:10;;74364:3;74353:15;;;;;-1:-1:-1::0;;;74353:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74340:29:0::1;-1:-1:-1::0;;;;;74340:29:0::1;;;;;;;;;;;;:65;;;;74453:13;:30;74467:10;;74478:3;74467:15;;;;;-1:-1:-1::0;;;74467:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74453:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;74453:30:0;;:34:::1;::::0;74486:1:::1;74453:34;:::i;:::-;74420:13;:30;74434:10;;74445:3;74434:15;;;;;-1:-1:-1::0;;;74434:15:0::1;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;74420:30:0::1;::::0;;::::1;::::0;::::1;::::0;;;;;;-1:-1:-1;74420:30:0;:67;74513:8:::1;::::0;:12:::1;::::0;74524:1:::1;74513:12;:::i;:::-;74502:8;:23:::0;74552:9:::1;::::0;:13:::1;::::0;74564:1:::1;74552:13;:::i;:::-;74540:9;:25:::0;74040:5;::::1;::::0;::::1;:::i;:::-;;;;73993:584;;;;24298:1;73609:975:::0;;:::o;53220:328::-;53395:41;22875:10;53428:7;53395:18;:41::i;:::-;53387:103;;;;-1:-1:-1;;;53387:103:0;;;;;;;:::i;:::-;53501:39;53515:4;53521:2;53525:7;53534:5;53501:13;:39::i;74937:2043::-;17745:1;18341:7;;:19;;18333:63;;;;-1:-1:-1;;;18333:63:0;;29352:2:1;18333:63:0;;;29334:21:1;29391:2;29371:18;;;29364:30;29430:33;29410:18;;;29403:61;29481:18;;18333:63:0;29324:181:1;18333:63:0;17745:1;18474:7;:18;75101:51:::1;::::0;;::::1;::::0;::::1;::::0;;75139:13:::1;75101:51:::0;;;;;::::1;::::0;::::1;::::0;;;;;;;;;;75198:11;75171:23:::1;75183:10;75171:11;:23::i;:::-;:38;75163:59;;;::::0;-1:-1:-1;;;75163:59:0;;26354:2:1;75163:59:0::1;::::0;::::1;26336:21:1::0;26393:1;26373:18;;;26366:29;-1:-1:-1;;;26411:18:1;;;26404:38;26459:18;;75163:59:0::1;26326:157:1::0;75163:59:0::1;75241:43;75261:11;75274:9;;75241:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;75241:19:0::1;::::0;-1:-1:-1;;;75241:43:0:i:1;:::-;75233:69;;;::::0;-1:-1:-1;;;75233:69:0;;24903:2:1;75233:69:0::1;::::0;::::1;24885:21:1::0;24942:2;24922:18;;;24915:30;-1:-1:-1;;;24961:18:1;;;24954:43;25014:18;;75233:69:0::1;24875:163:1::0;75233:69:0::1;75321:7;75332:1;75321:12;75313:47;;;::::0;-1:-1:-1;;;75313:47:0;;28228:2:1;75313:47:0::1;::::0;::::1;28210:21:1::0;28267:2;28247:18;;;28240:30;-1:-1:-1;;;28286:18:1;;;28279:52;28348:18;;75313:47:0::1;28200:172:1::0;75313:47:0::1;75393:24:::0;;75371:128:::1;;;::::0;-1:-1:-1;;;75371:128:0;;24484:2:1;75371:128:0::1;::::0;::::1;24466:21:1::0;24523:2;24503:18;;;24496:30;24562:34;24542:18;;;24535:62;-1:-1:-1;;;24613:18:1;;;24606:48;24671:19;;75371:128:0::1;24456:240:1::0;75371:128:0::1;75551:24:::0;;75532:15:::1;:43;;75510:119;;;::::0;-1:-1:-1;;;75510:119:0;;25245:2:1;75510:119:0::1;::::0;::::1;25227:21:1::0;25284:2;25264:18;;;25257:30;25323:28;25303:18;;;25296:56;25369:18;;75510:119:0::1;25217:176:1::0;75510:119:0::1;75725:23;::::0;::::1;::::0;75698:24;;:50:::1;::::0;75725:23;75698:50:::1;:::i;:::-;75662:15;:86;;75640:159;;;::::0;-1:-1:-1;;;75640:159:0;;29712:2:1;75640:159:0::1;::::0;::::1;29694:21:1::0;29751:2;29731:18;;;29724:30;29790:25;29770:18;;;29763:53;29833:18;;75640:159:0::1;29684:173:1::0;75640:159:0::1;75873:23;::::0;;::::1;::::0;75848:10:::1;75832:27;::::0;;;:15:::1;:27;::::0;;;;;;:37:::1;::::0;75862:7;;75832:37:::1;:::i;:::-;:64;;75810:143;;;::::0;-1:-1:-1;;;75810:143:0;;21408:2:1;75810:143:0::1;::::0;::::1;21390:21:1::0;21447:2;21427:18;;;21420:30;21486:31;21466:18;;;21459:59;21535:18;;75810:143:0::1;21380:179:1::0;75810:143:0::1;75994:9;;75983:7;75972:8;;:18;;;;:::i;:::-;:31;;75964:70;;;::::0;-1:-1:-1;;;75964:70:0;;30064:2:1;75964:70:0::1;::::0;::::1;30046:21:1::0;30103:2;30083:18;;;30076:30;30142:28;30122:18;;;30115:56;30188:18;;75964:70:0::1;30036:176:1::0;75964:70:0::1;76062:18;76109:9;76099:19:::0;::::1;;76091:70;;;;-1:-1:-1::0;;;76091:70:0::1;;;;;;;:::i;:::-;76181:6;::::0;::::1;;76180:7;76172:45;;;::::0;-1:-1:-1;;;76172:45:0;;27874:2:1;76172:45:0::1;::::0;::::1;27856:21:1::0;27913:2;27893:18;;;27886:30;-1:-1:-1;;;27932:18:1;;;27925:55;27997:18;;76172:45:0::1;27846:175:1::0;76172:45:0::1;76228:18;::::0;76257:419:::1;76285:7;76279:3;:13;76257:419;;;76316:21;:9;19718:19:::0;;19736:1;19718:19;;;19629:127;76316:21:::1;76365:9;19599:14:::0;76352:32:::1;;76399:33;76409:10;76421;76399:9;:33::i;:::-;76493:10;76477:27;::::0;;;:15:::1;:27;::::0;;;;;:31:::1;::::0;76507:1:::1;76477:31;:::i;:::-;76463:10;76447:27;::::0;;;:15:::1;:27;::::0;;;;;;;:61;;;;76551:13:::1;:25:::0;;;;:29:::1;::::0;76579:1:::1;76551:29;:::i;:::-;76537:10;76523:25;::::0;;;:13:::1;:25;::::0;;;;:57;76606:8:::1;::::0;:12:::1;::::0;76617:1:::1;76606:12;:::i;:::-;76595:8;:23:::0;76648:12:::1;::::0;:16:::1;::::0;76663:1:::1;76648:16;:::i;:::-;76633:12;:31:::0;76294:5;::::1;::::0;::::1;:::i;:::-;;;;76257:419;;;-1:-1:-1::0;76691:40:0::1;::::0;;30573:25:1;;;30629:2;30614:18;;30607:34;;;76703:10:0::1;::::0;76691:40:::1;::::0;30546:18:1;76691:40:0::1;;;;;;;76768:9;;76757:7;76746:8;;:18;;;;:::i;:::-;:31;76742:231;;;76794:8;:33:::0;;-1:-1:-1;;76794:33:0::1;76805:22;76794:33:::0;;::::1;::::0;;;76847:114:::1;::::0;-1:-1:-1;;;;;;;;;;;76847:114:0;::::1;::::0;76886:19:::1;::::0;76805:22;76847:114:::1;:::i;:::-;;;;;;;;76742:231;-1:-1:-1::0;;17701:1:0;18653:7;:22;-1:-1:-1;;;;;74937:2043:0:o;69102:37::-;;;;;;;:::i;79412:723::-;55123:4;55147:16;;;:7;:16;;;;;;79530:13;;-1:-1:-1;;;;;55147:16:0;79561:113;;;;-1:-1:-1;;;79561:113:0;;24068:2:1;79561:113:0;;;24050:21:1;24107:2;24087:18;;;24080:30;24146:34;24126:18;;;24119:62;-1:-1:-1;;;24197:18:1;;;24190:45;24252:19;;79561:113:0;24040:237:1;79561:113:0;79689:8;;;;;;;79685:71;;79730:14;79723:21;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79412:723;;;:::o;79685:71::-;79768:28;79799:10;:8;:10::i;:::-;79768:41;;79871:1;79846:14;79840:28;:32;:287;;;;;;;;;;;;;;;;;79964:14;80005:18;:7;:16;:18::i;:::-;80050:13;79921:165;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;79840:287;79820:307;79412:723;-1:-1:-1;;;79412:723:0:o;80143:151::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;80253:33;;::::1;::::0;:13:::1;::::0;:33:::1;::::0;::::1;::::0;::::1;:::i;:::-;;80143:151:::0;:::o;80302:126::-;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;80388:32;;::::1;::::0;:14:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;24907:192::-:0;24080:6;;-1:-1:-1;;;;;24080:6:0;22875:10;24227:23;24219:68;;;;-1:-1:-1;;;24219:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;24996:22:0;::::1;24988:73;;;::::0;-1:-1:-1;;;24988:73:0;;14343:2:1;24988:73:0::1;::::0;::::1;14325:21:1::0;14382:2;14362:18;;;14355:30;14421:34;14401:18;;;14394:62;-1:-1:-1;;;14472:18:1;;;14465:36;14518:19;;24988:73:0::1;14315:228:1::0;24988:73:0::1;25072:19;25082:8;25072:9;:19::i;:::-;24907:192:::0;:::o;78930:474::-;78980:7;;;79030:8;;;;:41;;;;;;-1:-1:-1;;;79030:41:0;;;;;;;;;;79026:85;;;-1:-1:-1;79098:1:0;79026:85;79137:22;79125:8;;;;:34;;;;;;-1:-1:-1;;;79125:34:0;;;;;;;;;;79121:78;;;-1:-1:-1;79186:1:0;79121:78;79225:19;79213:8;;;;:31;;;;;;-1:-1:-1;;;79213:31:0;;;;;;;;;;79209:75;;;-1:-1:-1;79271:1:0;79209:75;79310:22;79298:8;;;;:34;;;;;;-1:-1:-1;;;79298:34:0;;;;;;;;;;79294:78;;;-1:-1:-1;79359:1:0;79294:78;79389:7;78930:474;-1:-1:-1;78930:474:0:o;49160:305::-;49262:4;-1:-1:-1;;;;;;49299:40:0;;-1:-1:-1;;;49299:40:0;;:105;;-1:-1:-1;;;;;;;49356:48:0;;-1:-1:-1;;;49356:48:0;49299:105;:158;;;-1:-1:-1;;;;;;;;;;41248:40:0;;;49421:36;41139:157;59040:174;59115:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;59115:29:0;-1:-1:-1;;;;;59115:29:0;;;;;;;;:24;;59169:23;59115:24;59169:14;:23::i;:::-;-1:-1:-1;;;;;59160:46:0;;;;;;;;;;;59040:174;;:::o;27375:317::-;27490:6;27465:21;:31;;27457:73;;;;-1:-1:-1;;;27457:73:0;;18632:2:1;27457:73:0;;;18614:21:1;18671:2;18651:18;;;18644:30;18710:31;18690:18;;;18683:59;18759:18;;27457:73:0;18604:179:1;27457:73:0;27544:12;27562:9;-1:-1:-1;;;;;27562:14:0;27584:6;27562:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27543:52;;;27614:7;27606:78;;;;-1:-1:-1;;;27606:78:0;;17450:2:1;27606:78:0;;;17432:21:1;17489:2;17469:18;;;17462:30;17528:34;17508:18;;;17501:62;17599:28;17579:18;;;17572:56;17645:19;;27606:78:0;17422:248:1;55352:348:0;55445:4;55147:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55147:16:0;55462:73;;;;-1:-1:-1;;;55462:73:0;;18990:2:1;55462:73:0;;;18972:21:1;19029:2;19009:18;;;19002:30;19068:34;19048:18;;;19041:62;-1:-1:-1;;;19119:18:1;;;19112:42;19171:19;;55462:73:0;18962:234:1;55462:73:0;55546:13;55562:23;55577:7;55562:14;:23::i;:::-;55546:39;;55615:5;-1:-1:-1;;;;;55604:16:0;:7;-1:-1:-1;;;;;55604:16:0;;:51;;;;55648:7;-1:-1:-1;;;;;55624:31:0;:20;55636:7;55624:11;:20::i;:::-;-1:-1:-1;;;;;55624:31:0;;55604:51;:87;;;-1:-1:-1;;;;;;52444:25:0;;;52420:4;52444:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;55659:32;55596:96;55352:348;-1:-1:-1;;;;55352:348:0:o;58344:578::-;58503:4;-1:-1:-1;;;;;58476:31:0;:23;58491:7;58476:14;:23::i;:::-;-1:-1:-1;;;;;58476:31:0;;58468:85;;;;-1:-1:-1;;;58468:85:0;;23658:2:1;58468:85:0;;;23640:21:1;23697:2;23677:18;;;23670:30;23736:34;23716:18;;;23709:62;-1:-1:-1;;;23787:18:1;;;23780:39;23836:19;;58468:85:0;23630:231:1;58468:85:0;-1:-1:-1;;;;;58572:16:0;;58564:65;;;;-1:-1:-1;;;58564:65:0;;16281:2:1;58564:65:0;;;16263:21:1;16320:2;16300:18;;;16293:30;16359:34;16339:18;;;16332:62;-1:-1:-1;;;16410:18:1;;;16403:34;16454:19;;58564:65:0;16253:226:1;58564:65:0;58642:39;58663:4;58669:2;58673:7;58642:20;:39::i;:::-;58746:29;58763:1;58767:7;58746:8;:29::i;:::-;-1:-1:-1;;;;;58788:15:0;;;;;;:9;:15;;;;;:20;;58807:1;;58788:15;:20;;58807:1;;58788:20;:::i;:::-;;;;-1:-1:-1;;;;;;;58819:13:0;;;;;;:9;:13;;;;;:18;;58836:1;;58819:13;:18;;58836:1;;58819:18;:::i;:::-;;;;-1:-1:-1;;58848:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;58848:21:0;-1:-1:-1;;;;;58848:21:0;;;;;;;;;58887:27;;58848:16;;58887:27;;;;;;;58344:578;;;:::o;25107:173::-;25182:6;;;-1:-1:-1;;;;;25199:17:0;;;-1:-1:-1;;;;;;25199:17:0;;;;;;;25232:40;;25182:6;;;25199:17;25182:6;;25232:40;;25163:16;;25232:40;25107:173;;:::o;56042:110::-;56118:26;56128:2;56132:7;56118:26;;;;;;;;;;;;:9;:26::i;54430:315::-;54587:28;54597:4;54603:2;54607:7;54587:9;:28::i;:::-;54634:48;54657:4;54663:2;54667:7;54676:5;54634:22;:48::i;:::-;54626:111;;;;-1:-1:-1;;;54626:111:0;;;;;;;:::i;74804:123::-;74900:18;;;-1:-1:-1;;;;;9719:32:1;;74900:18:0;;;9701:51:1;74863:7:0;;9674:18:1;74900::0;;;;;;;;;;;;;74890:29;;;;;;74883:36;;74804:123;;;:::o;74596:200::-;74692:4;74733:55;74778:9;74733:36;:11;:34;:36::i;:::-;:44;;:55::i;:::-;74716:13;;;;;-1:-1:-1;;;;;74716:13:0;;;:72;;;;-1:-1:-1;74596:200:0;;;;:::o;71069:100::-;71121:13;71154:7;71147:14;;;;;:::i;20411:723::-;20467:13;20688:10;20684:53;;-1:-1:-1;;20715:10:0;;;;;;;;;;;;-1:-1:-1;;;20715:10:0;;;;;20411:723::o;20684:53::-;20762:5;20747:12;20803:78;20810:9;;20803:78;;20836:8;;;;:::i;:::-;;-1:-1:-1;20859:10:0;;-1:-1:-1;20867:2:0;20859:10;;:::i;:::-;;;20803:78;;;20891:19;20923:6;20913:17;;;;;;-1:-1:-1;;;20913:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;20913:17:0;;20891:39;;20941:154;20948:10;;20941:154;;20975:11;20985:1;20975:11;;:::i;:::-;;-1:-1:-1;21044:10:0;21052:2;21044:5;:10;:::i;:::-;21031:24;;:2;:24;:::i;:::-;21018:39;;21001:6;21008;21001:14;;;;;;-1:-1:-1;;;21001:14:0;;;;;;;;;;;;:56;-1:-1:-1;;;;;21001:56:0;;;;;;;;-1:-1:-1;21072:11:0;21081:2;21072:11;;:::i;:::-;;;20941:154;;63889:589;-1:-1:-1;;;;;64095:18:0;;64091:187;;64130:40;64162:7;65305:10;:17;;65278:24;;;;:15;:24;;;;;:44;;;65333:24;;;;;;;;;;;;65201:164;64130:40;64091:187;;;64200:2;-1:-1:-1;;;;;64192:10:0;:4;-1:-1:-1;;;;;64192:10:0;;64188:90;;64219:47;64252:4;64258:7;64219:32;:47::i;:::-;-1:-1:-1;;;;;64292:16:0;;64288:183;;64325:45;64362:7;64325:36;:45::i;64288:183::-;64398:4;-1:-1:-1;;;;;64392:10:0;:2;-1:-1:-1;;;;;64392:10:0;;64388:83;;64419:40;64447:2;64451:7;64419:27;:40::i;56379:321::-;56509:18;56515:2;56519:7;56509:5;:18::i;:::-;56560:54;56591:1;56595:2;56599:7;56608:5;56560:22;:54::i;:::-;56538:154;;;;-1:-1:-1;;;56538:154:0;;;;;;;:::i;59779:799::-;59934:4;-1:-1:-1;;;;;59955:13:0;;26376:20;26424:8;59951:620;;59991:72;;-1:-1:-1;;;59991:72:0;;-1:-1:-1;;;;;59991:36:0;;;;;:72;;22875:10;;60042:4;;60048:7;;60057:5;;59991:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59991:72:0;;;;;;;;-1:-1:-1;;59991:72:0;;;;;;;;;;;;:::i;:::-;;;59987:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60233:13:0;;60229:272;;60276:60;;-1:-1:-1;;;60276:60:0;;;;;;;:::i;60229:272::-;60451:6;60445:13;60436:6;60432:2;60428:15;60421:38;59987:529;-1:-1:-1;;;;;;60114:51:0;-1:-1:-1;;;60114:51:0;;-1:-1:-1;60107:58:0;;59951:620;-1:-1:-1;60555:4:0;59779:799;;;;;;:::o;8219:269::-;8421:58;;9202:66:1;8421:58:0;;;9190:79:1;9285:12;;;9278:28;;;8288:7:0;;9322:12:1;;8421:58:0;9180:160:1;4370:231:0;4448:7;4469:17;4488:18;4510:27;4521:4;4527:9;4510:10;:27::i;:::-;4468:69;;;;4548:18;4560:5;4548:11;:18::i;:::-;-1:-1:-1;4584:9:0;4370:231;-1:-1:-1;;;4370:231:0:o;65992:988::-;66258:22;66308:1;66283:22;66300:4;66283:16;:22::i;:::-;:26;;;;:::i;:::-;66320:18;66341:26;;;:17;:26;;;;;;66258:51;;-1:-1:-1;66474:28:0;;;66470:328;;-1:-1:-1;;;;;66541:18:0;;66519:19;66541:18;;;:12;:18;;;;;;;;:34;;;;;;;;;66592:30;;;;;;:44;;;66709:30;;:17;:30;;;;;:43;;;66470:328;-1:-1:-1;66894:26:0;;;;:17;:26;;;;;;;;66887:33;;;-1:-1:-1;;;;;66938:18:0;;;;;:12;:18;;;;;:34;;;;;;;66931:41;65992:988::o;67275:1079::-;67553:10;:17;67528:22;;67553:21;;67573:1;;67553:21;:::i;:::-;67585:18;67606:24;;;:15;:24;;;;;;67979:10;:26;;67528:46;;-1:-1:-1;67606:24:0;;67528:46;;67979:26;;;;-1:-1:-1;;;67979:26:0;;;;;;;;;;;;;;;;;67957:48;;68043:11;68018:10;68029;68018:22;;;;;;-1:-1:-1;;;68018:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;68123:28;;;:15;:28;;;;;;;:41;;;68295:24;;;;;68288:31;68330:10;:16;;;;;-1:-1:-1;;;68330:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;67275:1079;;;;:::o;64779:221::-;64864:14;64881:20;64898:2;64881:16;:20::i;:::-;-1:-1:-1;;;;;64912:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;64957:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;64779:221:0:o;57036:382::-;-1:-1:-1;;;;;57116:16:0;;57108:61;;;;-1:-1:-1;;;57108:61:0;;22169:2:1;57108:61:0;;;22151:21:1;;;22188:18;;;22181:30;22247:34;22227:18;;;22220:62;22299:18;;57108:61:0;22141:182:1;57108:61:0;55123:4;55147:16;;;:7;:16;;;;;;-1:-1:-1;;;;;55147:16:0;:30;57180:58;;;;-1:-1:-1;;;57180:58:0;;15110:2:1;57180:58:0;;;15092:21:1;15149:2;15129:18;;;15122:30;15188;15168:18;;;15161:58;15236:18;;57180:58:0;15082:178:1;57180:58:0;57251:45;57280:1;57284:2;57288:7;57251:20;:45::i;:::-;-1:-1:-1;;;;;57309:13:0;;;;;;:9;:13;;;;;:18;;57326:1;;57309:13;:18;;57326:1;;57309:18;:::i;:::-;;;;-1:-1:-1;;57338:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;57338:21:0;-1:-1:-1;;;;;57338:21:0;;;;;;;;57377:33;;57338:16;;;57377:33;;57338:16;;57377:33;57036:382;;:::o;2260:1308::-;2341:7;2350:12;2575:9;:16;2595:2;2575:22;2571:990;;;2871:4;2856:20;;2850:27;2921:4;2906:20;;2900:27;2979:4;2964:20;;2958:27;2614:9;2950:36;3022:25;3033:4;2950:36;2850:27;2900;3022:10;:25::i;:::-;3015:32;;;;;;;;;2571:990;3069:9;:16;3089:2;3069:22;3065:496;;;3344:4;3329:20;;3323:27;3395:4;3380:20;;3374:27;3437:23;3448:4;3323:27;3374;3437:10;:23::i;:::-;3430:30;;;;;;;;3065:496;-1:-1:-1;3509:1:0;;-1:-1:-1;3513:35:0;3065:496;2260:1308;;;;;:::o;531:643::-;609:20;600:5;:29;;;;;;-1:-1:-1;;;600:29:0;;;;;;;;;;596:571;;;531:643;:::o;596:571::-;707:29;698:5;:38;;;;;;-1:-1:-1;;;698:38:0;;;;;;;;;;694:473;;;753:34;;-1:-1:-1;;;753:34:0;;12799:2:1;753:34:0;;;12781:21:1;12838:2;12818:18;;;12811:30;12877:26;12857:18;;;12850:54;12921:18;;753:34:0;12771:174:1;694:473:0;818:35;809:5;:44;;;;;;-1:-1:-1;;;809:44:0;;;;;;;;;;805:362;;;870:41;;-1:-1:-1;;;870:41:0;;13152:2:1;870:41:0;;;13134:21:1;13191:2;13171:18;;;13164:30;13230:33;13210:18;;;13203:61;13281:18;;870:41:0;13124:181:1;805:362:0;942:30;933:5;:39;;;;;;-1:-1:-1;;;933:39:0;;;;;;;;;;929:238;;;989:44;;-1:-1:-1;;;989:44:0;;17877:2:1;989:44:0;;;17859:21:1;17916:2;17896:18;;;17889:30;17955:34;17935:18;;;17928:62;-1:-1:-1;;;18006:18:1;;;17999:32;18048:19;;989:44:0;17849:224:1;929:238:0;1064:30;1055:5;:39;;;;;;-1:-1:-1;;;1055:39:0;;;;;;;;;;1051:116;;;1111:44;;-1:-1:-1;;;1111:44:0;;21766:2:1;1111:44:0;;;21748:21:1;21805:2;21785:18;;;21778:30;21844:34;21824:18;;;21817:62;-1:-1:-1;;;21895:18:1;;;21888:32;21937:19;;1111:44:0;21738:224:1;5869:1632:0;6000:7;;6934:66;6921:79;;6917:163;;;-1:-1:-1;7033:1:0;;-1:-1:-1;7037:30:0;7017:51;;6917:163;7094:1;:7;;7099:2;7094:7;;:18;;;;;7105:1;:7;;7110:2;7105:7;;7094:18;7090:102;;;-1:-1:-1;7145:1:0;;-1:-1:-1;7149:30:0;7129:51;;7090:102;7306:24;;;7289:14;7306:24;;;;;;;;;11241:25:1;;;11314:4;11302:17;;11282:18;;;11275:45;;;;11336:18;;;11329:34;;;11379:18;;;11372:34;;;7306:24:0;;11213:19:1;;7306:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7306:24:0;;-1:-1:-1;;7306:24:0;;;-1:-1:-1;;;;;;;7345:20:0;;7341:103;;7398:1;7402:29;7382:50;;;;;;;7341:103;7464:6;-1:-1:-1;7472:20:0;;-1:-1:-1;5869:1632:0;;;;;;;;:::o;4864:391::-;4978:7;;-1:-1:-1;;;;;5079:75:0;;5181:3;5177:12;;;5191:2;5173:21;5222:25;5233:4;5173:21;5242:1;5079:75;5222:10;:25::i;:::-;5215:32;;;;;;4864:391;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:631:1;78:5;108:18;149:2;141:6;138:14;135:2;;;155:18;;:::i;:::-;230:2;224:9;198:2;284:15;;-1:-1:-1;;280:24:1;;;306:2;276:33;272:42;260:55;;;330:18;;;350:22;;;327:46;324:2;;;376:18;;:::i;:::-;416:10;412:2;405:22;445:6;436:15;;475:6;467;460:22;515:3;506:6;501:3;497:16;494:25;491:2;;;532:1;529;522:12;491:2;582:6;577:3;570:4;562:6;558:17;545:44;637:1;630:4;621:6;613;609:19;605:30;598:41;;;;88:557;;;;;:::o;650:375::-;701:8;711:6;765:3;758:4;750:6;746:17;742:27;732:2;;790:8;780;773:26;732:2;-1:-1:-1;820:20:1;;863:18;852:30;;849:2;;;902:8;892;885:26;849:2;946:4;938:6;934:17;922:29;;998:3;991:4;982:6;974;970:19;966:30;963:39;960:2;;;1015:1;1012;1005:12;1030:257;1089:6;1142:2;1130:9;1121:7;1117:23;1113:32;1110:2;;;1163:6;1155;1148:22;1110:2;1207:9;1194:23;1226:31;1251:5;1226:31;:::i;1562:398::-;1630:6;1638;1691:2;1679:9;1670:7;1666:23;1662:32;1659:2;;;1712:6;1704;1697:22;1659:2;1756:9;1743:23;1775:31;1800:5;1775:31;:::i;:::-;1825:5;-1:-1:-1;1882:2:1;1867:18;;1854:32;1895:33;1854:32;1895:33;:::i;:::-;1947:7;1937:17;;;1649:311;;;;;:::o;1965:466::-;2042:6;2050;2058;2111:2;2099:9;2090:7;2086:23;2082:32;2079:2;;;2132:6;2124;2117:22;2079:2;2176:9;2163:23;2195:31;2220:5;2195:31;:::i;:::-;2245:5;-1:-1:-1;2302:2:1;2287:18;;2274:32;2315:33;2274:32;2315:33;:::i;:::-;2069:362;;2367:7;;-1:-1:-1;;;2421:2:1;2406:18;;;;2393:32;;2069:362::o;2436:824::-;2531:6;2539;2547;2555;2608:3;2596:9;2587:7;2583:23;2579:33;2576:2;;;2630:6;2622;2615:22;2576:2;2674:9;2661:23;2693:31;2718:5;2693:31;:::i;:::-;2743:5;-1:-1:-1;2800:2:1;2785:18;;2772:32;2813:33;2772:32;2813:33;:::i;:::-;2865:7;-1:-1:-1;2919:2:1;2904:18;;2891:32;;-1:-1:-1;2974:2:1;2959:18;;2946:32;3001:18;2990:30;;2987:2;;;3038:6;3030;3023:22;2987:2;3066:22;;3119:4;3111:13;;3107:27;-1:-1:-1;3097:2:1;;3153:6;3145;3138:22;3097:2;3181:73;3246:7;3241:2;3228:16;3223:2;3219;3215:11;3181:73;:::i;:::-;3171:83;;;2566:694;;;;;;;:::o;3265:436::-;3330:6;3338;3391:2;3379:9;3370:7;3366:23;3362:32;3359:2;;;3412:6;3404;3397:22;3359:2;3456:9;3443:23;3475:31;3500:5;3475:31;:::i;:::-;3525:5;-1:-1:-1;3582:2:1;3567:18;;3554:32;3624:15;;3617:23;3605:36;;3595:2;;3660:6;3652;3645:22;3706:325;3774:6;3782;3835:2;3823:9;3814:7;3810:23;3806:32;3803:2;;;3856:6;3848;3841:22;3803:2;3900:9;3887:23;3919:31;3944:5;3919:31;:::i;:::-;3969:5;4021:2;4006:18;;;;3993:32;;-1:-1:-1;;;3793:238:1:o;4036:665::-;4122:6;4130;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4204:6;4196;4189:22;4151:2;4249:9;4236:23;4278:18;4319:2;4311:6;4308:14;4305:2;;;4340:6;4332;4325:22;4305:2;4383:6;4372:9;4368:22;4358:32;;4428:7;4421:4;4417:2;4413:13;4409:27;4399:2;;4455:6;4447;4440:22;4399:2;4500;4487:16;4526:2;4518:6;4515:14;4512:2;;;4547:6;4539;4532:22;4512:2;4605:7;4600:2;4590:6;4587:1;4583:14;4579:2;4575:23;4571:32;4568:45;4565:2;;;4631:6;4623;4616:22;4565:2;4667;4659:11;;;;;4689:6;;-1:-1:-1;4141:560:1;;-1:-1:-1;;;;4141:560:1:o;4706:255::-;4764:6;4817:2;4805:9;4796:7;4792:23;4788:32;4785:2;;;4838:6;4830;4823:22;4785:2;4882:9;4869:23;4901:30;4925:5;4901:30;:::i;4966:259::-;5035:6;5088:2;5076:9;5067:7;5063:23;5059:32;5056:2;;;5109:6;5101;5094:22;5056:2;5146:9;5140:16;5165:30;5189:5;5165:30;:::i;5230:430::-;5301:6;5309;5362:2;5350:9;5341:7;5337:23;5333:32;5330:2;;;5383:6;5375;5368:22;5330:2;5428:9;5415:23;5461:18;5453:6;5450:30;5447:2;;;5498:6;5490;5483:22;5447:2;5542:58;5592:7;5583:6;5572:9;5568:22;5542:58;:::i;:::-;5619:8;;5516:84;;-1:-1:-1;5320:340:1;-1:-1:-1;;;;5320:340:1:o;5665:480::-;5734:6;5787:2;5775:9;5766:7;5762:23;5758:32;5755:2;;;5808:6;5800;5793:22;5755:2;5853:9;5840:23;5886:18;5878:6;5875:30;5872:2;;;5923:6;5915;5908:22;5872:2;5951:22;;6004:4;5996:13;;5992:27;-1:-1:-1;5982:2:1;;6038:6;6030;6023:22;5982:2;6066:73;6131:7;6126:2;6113:16;6108:2;6104;6100:11;6066:73;:::i;6150:190::-;6209:6;6262:2;6250:9;6241:7;6237:23;6233:32;6230:2;;;6283:6;6275;6268:22;6230:2;-1:-1:-1;6311:23:1;;6220:120;-1:-1:-1;6220:120:1:o;6345:565::-;6433:6;6441;6449;6457;6510:2;6498:9;6489:7;6485:23;6481:32;6478:2;;;6531:6;6523;6516:22;6478:2;6572:9;6559:23;6549:33;;6629:2;6618:9;6614:18;6601:32;6591:42;;6684:2;6673:9;6669:18;6656:32;6711:18;6703:6;6700:30;6697:2;;;6748:6;6740;6733:22;6697:2;6792:58;6842:7;6833:6;6822:9;6818:22;6792:58;:::i;:::-;6468:442;;;;-1:-1:-1;6869:8:1;-1:-1:-1;;;;6468:442:1:o;6915:257::-;6956:3;6994:5;6988:12;7021:6;7016:3;7009:19;7037:63;7093:6;7086:4;7081:3;7077:14;7070:4;7063:5;7059:16;7037:63;:::i;:::-;7154:2;7133:15;-1:-1:-1;;7129:29:1;7120:39;;;;7161:4;7116:50;;6964:208;-1:-1:-1;;6964:208:1:o;7177:242::-;7263:1;7256:5;7253:12;7243:2;;7308:10;7303:3;7299:20;7296:1;7289:31;7343:4;7340:1;7333:15;7371:4;7368:1;7361:15;7243:2;7395:18;;7233:186::o;7424:1531::-;7648:3;7686:6;7680:13;7712:4;7725:51;7769:6;7764:3;7759:2;7751:6;7747:15;7725:51;:::i;:::-;7839:13;;7798:16;;;;7861:55;7839:13;7798:16;7883:15;;;7861:55;:::i;:::-;8007:13;;7938:20;;;7978:3;;8067:1;8089:18;;;;8142;;;;8169:2;;8247:4;8237:8;8233:19;8221:31;;8169:2;8310;8300:8;8297:16;8277:18;8274:40;8271:2;;;-1:-1:-1;;;8337:33:1;;8393:4;8390:1;8383:15;8423:4;8344:3;8411:17;8271:2;8454:18;8481:110;;;;8605:1;8600:330;;;;8447:483;;8481:110;-1:-1:-1;;8516:24:1;;8502:39;;8561:20;;;;-1:-1:-1;8481:110:1;;8600:330;31023:4;31042:17;;;31092:4;31076:21;;8695:3;8711:169;8725:8;8722:1;8719:15;8711:169;;;8807:14;;8792:13;;;8785:37;8850:16;;;;8742:10;;8711:169;;;8715:3;;8911:8;8904:5;8900:20;8893:27;;8447:483;-1:-1:-1;8946:3:1;;7656:1299;-1:-1:-1;;;;;;;;;;;7656:1299:1:o;10050:488::-;-1:-1:-1;;;;;10319:15:1;;;10301:34;;10371:15;;10366:2;10351:18;;10344:43;10418:2;10403:18;;10396:34;;;10466:3;10461:2;10446:18;;10439:31;;;10244:4;;10487:45;;10512:19;;10504:6;10487:45;:::i;:::-;10479:53;10253:285;-1:-1:-1;;;;;;10253:285:1:o;11417:218::-;11568:2;11553:18;;11580:49;11557:9;11611:6;11580:49;:::i;11640:330::-;11836:2;11821:18;;11848:49;11825:9;11879:6;11848:49;:::i;:::-;11906:58;11960:2;11949:9;11945:18;11937:6;11906:58;:::i;11975:393::-;12134:2;12123:9;12116:21;12173:6;12168:2;12157:9;12153:18;12146:34;12230:6;12222;12217:2;12206:9;12202:18;12189:48;12097:4;12257:22;;;12281:2;12253:31;;;12246:45;;;;12352:2;12331:15;;;-1:-1:-1;;12327:29:1;12312:45;12308:54;;12106:262;-1:-1:-1;12106:262:1:o;12373:219::-;12522:2;12511:9;12504:21;12485:4;12542:44;12582:2;12571:9;12567:18;12559:6;12542:44;:::i;13722:414::-;13924:2;13906:21;;;13963:2;13943:18;;;13936:30;14002:34;13997:2;13982:18;;13975:62;-1:-1:-1;;;14068:2:1;14053:18;;14046:48;14126:3;14111:19;;13896:240::o;15265:402::-;15467:2;15449:21;;;15506:2;15486:18;;;15479:30;15545:34;15540:2;15525:18;;15518:62;-1:-1:-1;;;15611:2:1;15596:18;;15589:36;15657:3;15642:19;;15439:228::o;23095:356::-;23297:2;23279:21;;;23316:18;;;23309:30;23375:34;23370:2;23355:18;;23348:62;23442:2;23427:18;;23269:182::o;26893:413::-;27095:2;27077:21;;;27134:2;27114:18;;;27107:30;27173:34;27168:2;27153:18;;27146:62;-1:-1:-1;;;27239:2:1;27224:18;;27217:47;27296:3;27281:19;;27067:239::o;31108:128::-;31148:3;31179:1;31175:6;31172:1;31169:13;31166:2;;;31185:18;;:::i;:::-;-1:-1:-1;31221:9:1;;31156:80::o;31241:120::-;31281:1;31307;31297:2;;31312:18;;:::i;:::-;-1:-1:-1;31346:9:1;;31287:74::o;31366:168::-;31406:7;31472:1;31468;31464:6;31460:14;31457:1;31454:21;31449:1;31442:9;31435:17;31431:45;31428:2;;;31479:18;;:::i;:::-;-1:-1:-1;31519:9:1;;31418:116::o;31539:125::-;31579:4;31607:1;31604;31601:8;31598:2;;;31612:18;;:::i;:::-;-1:-1:-1;31649:9:1;;31588:76::o;31669:258::-;31741:1;31751:113;31765:6;31762:1;31759:13;31751:113;;;31841:11;;;31835:18;31822:11;;;31815:39;31787:2;31780:10;31751:113;;;31882:6;31879:1;31876:13;31873:2;;;-1:-1:-1;;31917:1:1;31899:16;;31892:27;31722:205::o;31932:380::-;32011:1;32007:12;;;;32054;;;32075:2;;32129:4;32121:6;32117:17;32107:27;;32075:2;32182;32174:6;32171:14;32151:18;32148:38;32145:2;;;32228:10;32223:3;32219:20;32216:1;32209:31;32263:4;32260:1;32253:15;32291:4;32288:1;32281:15;32145:2;;31987:325;;;:::o;32317:135::-;32356:3;-1:-1:-1;;32377:17:1;;32374:2;;;32397:18;;:::i;:::-;-1:-1:-1;32444:1:1;32433:13;;32364:88::o;32457:112::-;32489:1;32515;32505:2;;32520:18;;:::i;:::-;-1:-1:-1;32554:9:1;;32495:74::o;32574:127::-;32635:10;32630:3;32626:20;32623:1;32616:31;32666:4;32663:1;32656:15;32690:4;32687:1;32680:15;32706:127;32767:10;32762:3;32758:20;32755:1;32748:31;32798:4;32795:1;32788:15;32822:4;32819:1;32812:15;32838:127;32899:10;32894:3;32890:20;32887:1;32880:31;32930:4;32927:1;32920:15;32954:4;32951:1;32944:15;32970:131;-1:-1:-1;;;;;33045:31:1;;33035:42;;33025:2;;33091:1;33088;33081:12;33106:131;-1:-1:-1;;;;;;33180:32:1;;33170:43;;33160:2;;33227:1;33224;33217:12

Swarm Source

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