ETH Price: $3,392.69 (+1.74%)

Token

Surge Women Passport (SURGE)
 

Overview

Max Total Supply

5,000 SURGE

Holders

2,584

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
1 SURGE
0x0f25809d8e83abc5ff0f4ceb8a8c39c79746d0b6
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Surge Passport NFT is a membership to an ecosystem of Web3 perks. To access this world, view the Surge Passport dashboard for available opportunities here -- https://perks.surgewomen.io

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Surge

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// File: contracts/src/IERC2981Royalties.sol


pragma solidity ^0.8.1;

/// @title IERC2981Royalties
/// @dev Interface for the ERC2981 - Token Royalty standard
interface IERC2981Royalties {
    /// @notice Called with the sale price to determine how much royalty
    //          is owed and to whom.
    /// @param _tokenId - the NFT asset queried for royalty information
    /// @param _value - the sale price of the NFT asset specified by _tokenId
    /// @return _receiver - address of who should be sent the royalty payment
    /// @return _royaltyAmount - the royalty payment amount for value sale price
    function royaltyInfo(uint256 _tokenId, uint256 _value)
        external
        view
        returns (address _receiver, uint256 _royaltyAmount);
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/utils/SafeERC20.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/utils/SafeERC20.sol)

pragma solidity ^0.8.0;



/**
 * @title SafeERC20
 * @dev Wrappers around ERC20 operations that throw on failure (when the token
 * contract returns false). Tokens that return no value (and instead revert or
 * throw on failure) are also supported, non-reverting calls are assumed to be
 * successful.
 * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract,
 * which allows you to call the safe operations as `token.safeTransfer(...)`, etc.
 */
library SafeERC20 {
    using Address for address;

    function safeTransfer(
        IERC20 token,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function safeTransferFrom(
        IERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    /**
     * @dev Deprecated. This function has issues similar to the ones found in
     * {IERC20-approve}, and its usage is discouraged.
     *
     * Whenever possible, use {safeIncreaseAllowance} and
     * {safeDecreaseAllowance} instead.
     */
    function safeApprove(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        // safeApprove should only be called when setting an initial allowance,
        // or when resetting it to zero. To increase and decrease it, use
        // 'safeIncreaseAllowance' and 'safeDecreaseAllowance'
        require(
            (value == 0) || (token.allowance(address(this), spender) == 0),
            "SafeERC20: approve from non-zero to non-zero allowance"
        );
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function safeIncreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        uint256 newAllowance = token.allowance(address(this), spender) + value;
        _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
    }

    function safeDecreaseAllowance(
        IERC20 token,
        address spender,
        uint256 value
    ) internal {
        unchecked {
            uint256 oldAllowance = token.allowance(address(this), spender);
            require(oldAllowance >= value, "SafeERC20: decreased allowance below zero");
            uint256 newAllowance = oldAllowance - value;
            _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance));
        }
    }

    /**
     * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement
     * on the return value: the return value is optional (but if data is returned, it must not be false).
     * @param token The token targeted by the call.
     * @param data The call data (encoded using abi.encode or one of its variants).
     */
    function _callOptionalReturn(IERC20 token, bytes memory data) private {
        // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since
        // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that
        // the target address contains contract code and also asserts for success in the low-level call.

        bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed");
        if (returndata.length > 0) {
            // Return data is optional
            require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed");
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

// File: contracts/src/ERC2981Base.sol


pragma solidity ^0.8.1;



/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
abstract contract ERC2981Base is ERC165, IERC2981Royalties {
    struct RoyaltyInfo {
        address recipient;
        uint24 amount;
    }

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return
            interfaceId == type(IERC2981Royalties).interfaceId ||
            super.supportsInterface(interfaceId);
    }
}

// File: contracts/src/ERC2981ContractWideRoyalties.sol


pragma solidity ^0.8.1;



/// @dev This is a contract used to add ERC2981 support to ERC721 and 1155
/// @dev This implementation has the same royalties for each and every tokens
abstract contract ERC2981ContractWideRoyalties is ERC2981Base {
    RoyaltyInfo private _royalties;

    /// @dev Sets token royalties
    /// @param recipient recipient of the royalties
    /// @param value percentage (using 2 decimals - 10000 = 100, 0 = 0)
    function _setRoyalties(address recipient, uint256 value) internal {
        require(value <= 10000, "ERC2981Royalties: Too high");
        _royalties = RoyaltyInfo(recipient, uint24(value));
    }

    /// @inheritdoc	IERC2981Royalties
    function royaltyInfo(uint256, uint256 value)
        external
        view
        override
        returns (address receiver, uint256 royaltyAmount)
    {
        RoyaltyInfo memory royalties = _royalties;
        receiver = royalties.recipient;
        royaltyAmount = (value * royalties.amount) / 10000;
    }
}

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return _ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

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

        _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 {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSender() == from ||
            isApprovedForAll(from, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @dev This is equivalent to _burn(tokenId, false)
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId, bool approvalCheck) internal virtual {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSender() == from ||
                isApprovedForAll(from, _msgSender()) ||
                getApproved(tokenId) == _msgSender());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

// File: contracts/src/Surge.sol


pragma solidity ^0.8.1;

// @title: Surge Women NFT Collection
// @website: https://www.surgewomen.io/

// █▀ █░█ █▀█ █▀▀ █▀▀   █░█░█ █▀█ █▀▄▀█ █▀▀ █▄░█
// ▄█ █▄█ █▀▄ █▄█ ██▄   ▀▄▀▄▀ █▄█ █░▀░█ ██▄ █░▀█







contract Surge is ERC721A, ReentrancyGuard, Ownable, ERC2981ContractWideRoyalties {
    using Strings for uint256;

    // Status of the token sale
    enum SaleStatus {
        Paused,
        Presale,
        PublicSale,
        SoldOut
    }

    event StatusUpdate(SaleStatus _status);

    SaleStatus public status = SaleStatus.Paused;
    bytes32 public merkleRoot;
    string public baseTokenURI;

    uint64 public constant MAX_SUPPLY = 5000;
    uint64 public constant MAX_PER_USER = 5;
    uint128 public price;

    /**
     * @dev Sale is paused by default upon deploy
     */
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _baseTokenURI,
        uint128 _price,
        address _receiver,
        uint256 _royalties
    ) payable ERC721A(_name, _symbol) {
        setBaseURI(_baseTokenURI);
        setPrice(_price);
        setRoyalties(_receiver, _royalties);
    }

    mapping(address => uint) private _mintedAmount;

    /*----------------------------------------------*/
    /*                  MODIFIERS                  */
    /*--------------------------------------------*/

    /// @notice Verifies the amount of tokens the address has minted does not exceed MAX_PER_USER
    /// @param to Address to check the amount of tokens minted
    /// @param _amountOfTokens Amount of tokens to be minted
    modifier verifyMaxPerUser(address to, uint256 _amountOfTokens) {
        require(_mintedAmount[to] + _amountOfTokens <= MAX_PER_USER, "Max amount minted");
        _;
    }

    /// @notice Verifies total amount of minted tokens does not exceed MAX_SUPPLY
    /// @param _amountOfTokens Amount of tokens to be minted
    modifier verifyMaxSupply(uint256 _amountOfTokens) {
        require(_amountOfTokens + _totalMinted() <= MAX_SUPPLY, "Collection sold out");
        _;
    }

    /// @notice Verifies the address minting has enough ETH in their wallet to mint
    /// @param _amountOfTokens Amount of tokens to be minted
    modifier isEnoughEth(uint256 _amountOfTokens) {
        require(msg.value == _amountOfTokens * price, "Not enough ETH");
        _;
    }

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

    /// @notice Public sale minting
    /// @param to Address that will recieve minted token
    /// @param _amountOfTokens Amount of tokens to mint
    function mint(address to, uint256 _amountOfTokens)
        external
        payable
        verifyMaxPerUser(to, _amountOfTokens)
        verifyMaxSupply(_amountOfTokens)
        isEnoughEth(_amountOfTokens)
    {
        require(status == SaleStatus.PublicSale, "Sale not active");

        _mintedAmount[to] += _amountOfTokens;
        _safeMint(to, _amountOfTokens);
    }

    /// @notice Presale minting verifies callers address is in Merkle Root
    /// @param _amountOfTokens Amount of tokens to mint
    /// @param _merkleProof Hash of the callers address used to verify the location of that address in the Merkle Root
    function presaleMint(uint256 _amountOfTokens, bytes32[] calldata _merkleProof)
        external
        payable
        verifyMaxPerUser(msg.sender, _amountOfTokens)
        verifyMaxSupply(_amountOfTokens)
        isEnoughEth(_amountOfTokens)
    {
        require(status == SaleStatus.Presale, "Presale not active");

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        require(MerkleProof.verify(_merkleProof, merkleRoot, leaf), "Not in presale list");

        _mintedAmount[msg.sender] += _amountOfTokens;
        _safeMint(msg.sender, _amountOfTokens);
    }

    /// @notice Allows the owner to mint for the organizations treasury
    /// @param _amountOfTokens Amount of tokens to mint
    function batchMinting(uint256 _amountOfTokens)
        external
        payable
        nonReentrant
        onlyOwner
        verifyMaxSupply(_amountOfTokens)
        isEnoughEth(_amountOfTokens)
    {
        _safeMint(msg.sender, _amountOfTokens);
    }

    /*----------------------------------------------*/
    /*             ROYALTIES FUNCTION              */
    /*--------------------------------------------*/

    /// @notice Allows to set the royalties on the contract
    /// @param value Updated royalties (between 0 and 10000)
    function setRoyalties(address recipient, uint256 value) public onlyOwner {
        _setRoyalties(recipient, value);
    }

    /*----------------------------------------------*/
    /*           ADMIN BASE FUNCTIONS              */
    /*--------------------------------------------*/

    /// @inheritdoc	ERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, ERC2981Base) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /// @notice Get the baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    /// @notice Set metadata base URI
    /// @param _baseTokenURI New base URI
    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    /// @notice Set the current status of the sale
    /// @param _status Enum value of SaleStatus
    function setStatus(SaleStatus _status) public onlyOwner {
        status = _status;
        emit StatusUpdate(_status);
    }
    /// @notice Set mint price
    /// @param _price Mint price in Wei
    function setPrice(uint128 _price) public onlyOwner {
        price = _price;
    }

    /// @notice Set Presale Merkle Root
    /// @param _merkleRoot Merkle Root hash
    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    /// @notice Release contract funds to contract owner
    function withdrawAll() public payable onlyOwner nonReentrant {
        (bool success, ) = payable(msg.sender).call{value: address(this).balance}("");
        require(success, "Unsuccessful withdraw");
    }

    /// @notice Release any ERC20 tokens to the contract
    /// @param token ERC20 token sent to contract
    function withdrawTokens(IERC20 token) public onlyOwner {
        uint256 balance = token.balanceOf(address(this));
        SafeERC20.safeTransfer(token, msg.sender, balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"uint128","name":"_price","type":"uint128"},{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_royalties","type":"uint256"}],"stateMutability":"payable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"enum Surge.SaleStatus","name":"_status","type":"uint8"}],"name":"StatusUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_USER","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"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":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"batchMinting","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amountOfTokens","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint128","name":"","type":"uint128"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint128","name":"_price","type":"uint128"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"setRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum Surge.SaleStatus","name":"_status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum Surge.SaleStatus","name":"","type":"uint8"}],"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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"token","type":"address"}],"name":"withdrawTokens","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526000600b60006101000a81548160ff021916908360038111156200002d576200002c6200097a565b5b0217905550604051620057fe380380620057fe833981810160405281019062000057919062000683565b858581600290805190602001906200007192919062000510565b5080600390805190602001906200008a92919062000510565b506200009b6200010b60201b60201c565b60008190555050506001600881905550620000cb620000bf6200011060201b60201c565b6200011860201b60201c565b620000dc84620001de60201b60201c565b620000ed836200028960201b60201c565b620000ff82826200035460201b60201c565b50505050505062000acc565b600090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001ee6200011060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000214620003f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200026490620007ec565b60405180910390fd5b80600d90805190602001906200028592919062000510565b5050565b620002996200011060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002bf620003f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000318576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200030f90620007ec565b60405180910390fd5b80600e60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b620003646200011060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200038a620003f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003e3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003da90620007ec565b60405180910390fd5b620003f582826200042360201b60201c565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6127108111156200046b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046290620007ca565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff1602179055509050505050565b8280546200051e906200090e565b90600052602060002090601f0160209004810192826200054257600085556200058e565b82601f106200055d57805160ff19168380011785556200058e565b828001600101855582156200058e579182015b828111156200058d57825182559160200191906001019062000570565b5b5090506200059d9190620005a1565b5090565b5b80821115620005bc576000816000905550600101620005a2565b5090565b6000620005d7620005d18462000837565b6200080e565b905082815260208101848484011115620005f657620005f562000a0c565b5b62000603848285620008d8565b509392505050565b6000815190506200061c8162000a7e565b92915050565b600082601f8301126200063a576200063962000a07565b5b81516200064c848260208601620005c0565b91505092915050565b600081519050620006668162000a98565b92915050565b6000815190506200067d8162000ab2565b92915050565b60008060008060008060c08789031215620006a357620006a262000a16565b5b600087015167ffffffffffffffff811115620006c457620006c362000a11565b5b620006d289828a0162000622565b965050602087015167ffffffffffffffff811115620006f657620006f562000a11565b5b6200070489828a0162000622565b955050604087015167ffffffffffffffff81111562000728576200072762000a11565b5b6200073689828a0162000622565b94505060606200074989828a0162000655565b93505060806200075c89828a016200060b565b92505060a06200076f89828a016200066c565b9150509295509295509295565b60006200078b601a836200086d565b9150620007988262000a2c565b602082019050919050565b6000620007b26020836200086d565b9150620007bf8262000a55565b602082019050919050565b60006020820190508181036000830152620007e5816200077c565b9050919050565b600060208201905081810360008301526200080781620007a3565b9050919050565b60006200081a6200082d565b905062000828828262000944565b919050565b6000604051905090565b600067ffffffffffffffff821115620008555762000854620009d8565b5b620008608262000a1b565b9050602081019050919050565b600082825260208201905092915050565b60006200088b82620008ae565b9050919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b83811015620008f8578082015181840152602081019050620008db565b8381111562000908576000848401525b50505050565b600060028204905060018216806200092757607f821691505b602082108114156200093e576200093d620009a9565b5b50919050565b6200094f8262000a1b565b810181811067ffffffffffffffff82111715620009715762000970620009d8565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000a89816200087e565b811462000a9557600080fd5b50565b62000aa38162000892565b811462000aaf57600080fd5b50565b62000abd81620008ce565b811462000ac957600080fd5b50565b614d228062000adc6000396000f3fe6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d547cfb71161006f578063d547cfb7146106f0578063d9279b601461071b578063e3e1e8ef14610737578063e985e9c514610753578063f2fde38b14610790576101f9565b8063a22cb46514610636578063b88d4fde1461065f578063c7ba754814610688578063c87b56dd146106b3576101f9565b80638c7ea24b116100dc5780638c7ea24b1461058c5780638da5cb5b146105b557806395d89b41146105e0578063a035b1fe1461060b576101f9565b806370a0823114610505578063715018a6146105425780637cb6475914610559578063853828b614610582576101f9565b80632e49d78b1161019057806340c10f191161015f57806340c10f191461043157806342842e0e1461044d57806349df728c1461047657806355f804b31461049f5780636352211e146104c8576101f9565b80632e49d78b146103895780632eb4a7ab146103b257806332cb6b0c146103dd5780633ae84a8214610408576101f9565b806318160ddd116101cc57806318160ddd146102cc578063200d2ed2146102f757806323b872dd146103225780632a55205a1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613b08565b6107b9565b6040516102329190614188565b60405180910390f35b34801561024757600080fd5b506102506107cb565b60405161025d91906141d9565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613c32565b61085d565b60405161029a91906140f8565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613a6e565b6108d9565b005b3480156102d857600080fd5b506102e16109e4565b6040516102ee91906143d6565b60405180910390f35b34801561030357600080fd5b5061030c6109fb565b60405161031991906141be565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613958565b610a0e565b005b34801561035757600080fd5b50610372600480360381019061036d9190613cec565b610a1e565b60405161038092919061415f565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613b8f565b610ade565b005b3480156103be57600080fd5b506103c7610bbe565b6040516103d491906141a3565b60405180910390f35b3480156103e957600080fd5b506103f2610bc4565b6040516103ff91906143f1565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613c05565b610bca565b005b61044b60048036038101906104469190613a6e565b610c82565b005b34801561045957600080fd5b50610474600480360381019061046f9190613958565b610eda565b005b34801561048257600080fd5b5061049d60048036038101906104989190613b62565b610efa565b005b3480156104ab57600080fd5b506104c660048036038101906104c19190613bbc565b611012565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613c32565b6110a8565b6040516104fc91906140f8565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906138eb565b6110be565b60405161053991906143d6565b60405180910390f35b34801561054e57600080fd5b5061055761118e565b005b34801561056557600080fd5b50610580600480360381019061057b9190613adb565b611216565b005b61058a61129c565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613a6e565b61141d565b005b3480156105c157600080fd5b506105ca6114a7565b6040516105d791906140f8565b60405180910390f35b3480156105ec57600080fd5b506105f56114d1565b60405161060291906141d9565b60405180910390f35b34801561061757600080fd5b50610620611563565b60405161062d91906143bb565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190613a2e565b611585565b005b34801561066b57600080fd5b50610686600480360381019061068191906139ab565b6116fd565b005b34801561069457600080fd5b5061069d611779565b6040516106aa91906143f1565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d59190613c32565b61177e565b6040516106e791906141d9565b60405180910390f35b3480156106fc57600080fd5b5061070561181d565b60405161071291906141d9565b60405180910390f35b61073560048036038101906107309190613c32565b6118ab565b005b610751600480360381019061074c9190613c8c565b611a6c565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613918565b611d7e565b6040516107879190614188565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b291906138eb565b611e12565b005b60006107c482611f0a565b9050919050565b6060600280546107da9061471d565b80601f01602080910402602001604051908101604052809291908181526020018280546108069061471d565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b5050505050905090565b600061086882611f84565b61089e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e4826110a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096b611fd2565b73ffffffffffffffffffffffffffffffffffffffff161415801561099d575061099b81610996611fd2565b611d7e565b155b156109d4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109df838383611fda565b505050565b60006109ee61208c565b6001546000540303905090565b600b60009054906101000a900460ff1681565b610a19838383612091565b505050565b6000806000600a6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610aca9190614568565b610ad49190614537565b9150509250929050565b610ae6611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610b046114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b519061431b565b60405180910390fd5b80600b60006101000a81548160ff02191690836003811115610b7f57610b7e61487c565b5b02179055507f504eaf1c308a9514233b8d6364a1d4d333824d8ab51add90e420d54b18ba785b81604051610bb391906141be565b60405180910390a150565b600c5481565b61138881565b610bd2611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610bf06114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d9061431b565b60405180910390fd5b80600e60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b8181600567ffffffffffffffff1681600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cdb91906144e1565b1115610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906141fb565b60405180910390fd5b8261138867ffffffffffffffff16610d32612547565b82610d3d91906144e1565b1115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d759061425b565b60405180910390fd5b83600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681610dbb9190614568565b3414610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df3906142fb565b60405180910390fd5b60026003811115610e1057610e0f61487c565b5b600b60009054906101000a900460ff166003811115610e3257610e3161487c565b5b14610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906142bb565b60405180910390fd5b84600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec191906144e1565b92505081905550610ed2868661255a565b505050505050565b610ef5838383604051806020016040528060008152506116fd565b505050565b610f02611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610f206114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d9061431b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fb191906140f8565b60206040518083038186803b158015610fc957600080fd5b505afa158015610fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110019190613c5f565b905061100e823383612578565b5050565b61101a611fd2565b73ffffffffffffffffffffffffffffffffffffffff166110386114a7565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110859061431b565b60405180910390fd5b80600d90805190602001906110a49291906135e8565b5050565b60006110b3826125fe565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611126576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611196611fd2565b73ffffffffffffffffffffffffffffffffffffffff166111b46114a7565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112019061431b565b60405180910390fd5b611214600061288d565b565b61121e611fd2565b73ffffffffffffffffffffffffffffffffffffffff1661123c6114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112899061431b565b60405180910390fd5b80600c8190555050565b6112a4611fd2565b73ffffffffffffffffffffffffffffffffffffffff166112c26114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f9061431b565b60405180910390fd5b6002600854141561135e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113559061439b565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161138c906140e3565b60006040518083038185875af1925050503d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b5050905080611412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114099061433b565b60405180910390fd5b506001600881905550565b611425611fd2565b73ffffffffffffffffffffffffffffffffffffffff166114436114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611499576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114909061431b565b60405180910390fd5b6114a38282612953565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114e09061471d565b80601f016020809104026020016040519081016040528092919081815260200182805461150c9061471d565b80156115595780601f1061152e57610100808354040283529160200191611559565b820191906000526020600020905b81548152906001019060200180831161153c57829003601f168201915b5050505050905090565b600e60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b61158d611fd2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115ff611fd2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116ac611fd2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f19190614188565b60405180910390a35050565b611708848484612091565b6117278373ffffffffffffffffffffffffffffffffffffffff16612a3d565b801561173c575061173a84848484612a60565b155b15611773576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600581565b606061178982611f84565b6117bf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117c9612bc0565b90506000815114156117ea5760405180602001604052806000815250611815565b806117f484612c52565b6040516020016118059291906140bf565b6040516020818303038152906040525b915050919050565b600d805461182a9061471d565b80601f01602080910402602001604051908101604052809291908181526020018280546118569061471d565b80156118a35780601f10611878576101008083540402835291602001916118a3565b820191906000526020600020905b81548152906001019060200180831161188657829003601f168201915b505050505081565b600260085414156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061439b565b60405180910390fd5b6002600881905550611901611fd2565b73ffffffffffffffffffffffffffffffffffffffff1661191f6114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c9061431b565b60405180910390fd5b8061138867ffffffffffffffff1661198b612547565b8261199691906144e1565b11156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce9061425b565b60405180910390fd5b81600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681611a149190614568565b3414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906142fb565b60405180910390fd5b611a5f338461255a565b5050600160088190555050565b3383600567ffffffffffffffff1681600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ac591906144e1565b1115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd906141fb565b60405180910390fd5b8461138867ffffffffffffffff16611b1c612547565b82611b2791906144e1565b1115611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061425b565b60405180910390fd5b85600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681611ba59190614568565b3414611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906142fb565b60405180910390fd5b60016003811115611bfa57611bf961487c565b5b600b60009054906101000a900460ff166003811115611c1c57611c1b61487c565b5b14611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061427b565b60405180910390fd5b600033604051602001611c6f919061408d565b604051602081830303815290604052805190602001209050611cd5878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612db3565b611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b906142db565b60405180910390fd5b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6391906144e1565b92505081905550611d74338961255a565b5050505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e1a611fd2565b73ffffffffffffffffffffffffffffffffffffffff16611e386114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e859061431b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef59061423b565b60405180910390fd5b611f078161288d565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7d5750611f7c82612dca565b5b9050919050565b600081611f8f61208c565b11158015611f9e575060005482105b8015611fcb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061209c826125fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612107576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612128611fd2565b73ffffffffffffffffffffffffffffffffffffffff161480612157575061215685612151611fd2565b611d7e565b5b8061219c5750612165611fd2565b73ffffffffffffffffffffffffffffffffffffffff166121848461085d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121d5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561223c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122498585856001612eac565b61225560008487611fda565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124d55760005482146124d457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125408585856001612eb2565b5050505050565b600061255161208c565b60005403905090565b612574828260405180602001604052806000815250612eb8565b5050565b6125f98363a9059cbb60e01b848460405160240161259792919061415f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612eca565b505050565b61260661366e565b60008290508061261461208c565b11158015612623575060005481105b15612856576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161285457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612738578092505050612888565b5b60011561285357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e578092505050612888565b612739565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710811115612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061421b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff1602179055509050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a86611fd2565b8786866040518563ffffffff1660e01b8152600401612aa89493929190614113565b602060405180830381600087803b158015612ac257600080fd5b505af1925050508015612af357506040513d601f19601f82011682018060405250810190612af09190613b35565b60015b612b6d573d8060008114612b23576040519150601f19603f3d011682016040523d82523d6000602084013e612b28565b606091505b50600081511415612b65576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612bcf9061471d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfb9061471d565b8015612c485780601f10612c1d57610100808354040283529160200191612c48565b820191906000526020600020905b815481529060010190602001808311612c2b57829003601f168201915b5050505050905090565b60606000821415612c9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dae565b600082905060005b60008214612ccc578080612cb590614780565b915050600a82612cc59190614537565b9150612ca2565b60008167ffffffffffffffff811115612ce857612ce7614909565b5b6040519080825280601f01601f191660200182016040528015612d1a5781602001600182028036833780820191505090505b5090505b60008514612da757600182612d3391906145c2565b9150600a85612d4291906147ed565b6030612d4e91906144e1565b60f81b818381518110612d6457612d636148da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612da09190614537565b9450612d1e565b8093505050505b919050565b600082612dc08584612f91565b1490509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e9557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ea55750612ea482613006565b5b9050919050565b50505050565b50505050565b612ec58383836001613070565b505050565b6000612f2c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661343e9092919063ffffffff16565b9050600081511115612f8c5780806020019051810190612f4c9190613aae565b612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f829061437b565b60405180910390fd5b5b505050565b60008082905060005b8451811015612ffb576000858281518110612fb857612fb76148da565b5b60200260200101519050808311612fda57612fd38382613456565b9250612fe7565b612fe48184613456565b92505b508080612ff390614780565b915050612f9a565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130dd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613118576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131256000868387612eac565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156132ef57506132ee8773ffffffffffffffffffffffffffffffffffffffff16612a3d565b5b156133b5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133646000888480600101955088612a60565b61339a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156132f55782600054146133b057600080fd5b613421565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133b6575b8160008190555050506134376000868387612eb2565b5050505050565b606061344d848460008561346d565b90509392505050565b600082600052816020526040600020905092915050565b6060824710156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a99061429b565b60405180910390fd5b6134bb85612a3d565b6134fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f19061435b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161352391906140a8565b60006040518083038185875af1925050503d8060008114613560576040519150601f19603f3d011682016040523d82523d6000602084013e613565565b606091505b5091509150613575828286613581565b92505050949350505050565b60608315613591578290506135e1565b6000835111156135a45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d891906141d9565b60405180910390fd5b9392505050565b8280546135f49061471d565b90600052602060002090601f016020900481019282613616576000855561365d565b82601f1061362f57805160ff191683800117855561365d565b8280016001018555821561365d579182015b8281111561365c578251825591602001919060010190613641565b5b50905061366a91906136b1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136ca5760008160009055506001016136b2565b5090565b60006136e16136dc84614431565b61440c565b9050828152602081018484840111156136fd576136fc614947565b5b6137088482856146db565b509392505050565b600061372361371e84614462565b61440c565b90508281526020810184848401111561373f5761373e614947565b5b61374a8482856146db565b509392505050565b60008135905061376181614c3b565b92915050565b60008083601f84011261377d5761377c61493d565b5b8235905067ffffffffffffffff81111561379a57613799614938565b5b6020830191508360208202830111156137b6576137b5614942565b5b9250929050565b6000813590506137cc81614c52565b92915050565b6000815190506137e181614c52565b92915050565b6000813590506137f681614c69565b92915050565b60008135905061380b81614c80565b92915050565b60008151905061382081614c80565b92915050565b600082601f83011261383b5761383a61493d565b5b813561384b8482602086016136ce565b91505092915050565b60008135905061386381614c97565b92915050565b60008135905061387881614cae565b92915050565b600082601f8301126138935761389261493d565b5b81356138a3848260208601613710565b91505092915050565b6000813590506138bb81614cbe565b92915050565b6000813590506138d081614cd5565b92915050565b6000815190506138e581614cd5565b92915050565b60006020828403121561390157613900614951565b5b600061390f84828501613752565b91505092915050565b6000806040838503121561392f5761392e614951565b5b600061393d85828601613752565b925050602061394e85828601613752565b9150509250929050565b60008060006060848603121561397157613970614951565b5b600061397f86828701613752565b935050602061399086828701613752565b92505060406139a1868287016138c1565b9150509250925092565b600080600080608085870312156139c5576139c4614951565b5b60006139d387828801613752565b94505060206139e487828801613752565b93505060406139f5878288016138c1565b925050606085013567ffffffffffffffff811115613a1657613a1561494c565b5b613a2287828801613826565b91505092959194509250565b60008060408385031215613a4557613a44614951565b5b6000613a5385828601613752565b9250506020613a64858286016137bd565b9150509250929050565b60008060408385031215613a8557613a84614951565b5b6000613a9385828601613752565b9250506020613aa4858286016138c1565b9150509250929050565b600060208284031215613ac457613ac3614951565b5b6000613ad2848285016137d2565b91505092915050565b600060208284031215613af157613af0614951565b5b6000613aff848285016137e7565b91505092915050565b600060208284031215613b1e57613b1d614951565b5b6000613b2c848285016137fc565b91505092915050565b600060208284031215613b4b57613b4a614951565b5b6000613b5984828501613811565b91505092915050565b600060208284031215613b7857613b77614951565b5b6000613b8684828501613854565b91505092915050565b600060208284031215613ba557613ba4614951565b5b6000613bb384828501613869565b91505092915050565b600060208284031215613bd257613bd1614951565b5b600082013567ffffffffffffffff811115613bf057613bef61494c565b5b613bfc8482850161387e565b91505092915050565b600060208284031215613c1b57613c1a614951565b5b6000613c29848285016138ac565b91505092915050565b600060208284031215613c4857613c47614951565b5b6000613c56848285016138c1565b91505092915050565b600060208284031215613c7557613c74614951565b5b6000613c83848285016138d6565b91505092915050565b600080600060408486031215613ca557613ca4614951565b5b6000613cb3868287016138c1565b935050602084013567ffffffffffffffff811115613cd457613cd361494c565b5b613ce086828701613767565b92509250509250925092565b60008060408385031215613d0357613d02614951565b5b6000613d11858286016138c1565b9250506020613d22858286016138c1565b9150509250929050565b613d35816145f6565b82525050565b613d4c613d47826145f6565b6147c9565b82525050565b613d5b81614608565b82525050565b613d6a81614614565b82525050565b6000613d7b82614493565b613d8581856144a9565b9350613d958185602086016146ea565b613d9e81614956565b840191505092915050565b6000613db482614493565b613dbe81856144ba565b9350613dce8185602086016146ea565b80840191505092915050565b613de3816146c9565b82525050565b6000613df48261449e565b613dfe81856144c5565b9350613e0e8185602086016146ea565b613e1781614956565b840191505092915050565b6000613e2d8261449e565b613e3781856144d6565b9350613e478185602086016146ea565b80840191505092915050565b6000613e606011836144c5565b9150613e6b82614974565b602082019050919050565b6000613e83601a836144c5565b9150613e8e8261499d565b602082019050919050565b6000613ea66026836144c5565b9150613eb1826149c6565b604082019050919050565b6000613ec96013836144c5565b9150613ed482614a15565b602082019050919050565b6000613eec6012836144c5565b9150613ef782614a3e565b602082019050919050565b6000613f0f6026836144c5565b9150613f1a82614a67565b604082019050919050565b6000613f32600f836144c5565b9150613f3d82614ab6565b602082019050919050565b6000613f556013836144c5565b9150613f6082614adf565b602082019050919050565b6000613f78600e836144c5565b9150613f8382614b08565b602082019050919050565b6000613f9b6020836144c5565b9150613fa682614b31565b602082019050919050565b6000613fbe6015836144c5565b9150613fc982614b5a565b602082019050919050565b6000613fe16000836144ba565b9150613fec82614b83565b600082019050919050565b6000614004601d836144c5565b915061400f82614b86565b602082019050919050565b6000614027602a836144c5565b915061403282614baf565b604082019050919050565b600061404a601f836144c5565b915061405582614bfe565b602082019050919050565b6140698161466f565b82525050565b614078816146ab565b82525050565b614087816146b5565b82525050565b60006140998284613d3b565b60148201915081905092915050565b60006140b48284613da9565b915081905092915050565b60006140cb8285613e22565b91506140d78284613e22565b91508190509392505050565b60006140ee82613fd4565b9150819050919050565b600060208201905061410d6000830184613d2c565b92915050565b60006080820190506141286000830187613d2c565b6141356020830186613d2c565b614142604083018561406f565b81810360608301526141548184613d70565b905095945050505050565b60006040820190506141746000830185613d2c565b614181602083018461406f565b9392505050565b600060208201905061419d6000830184613d52565b92915050565b60006020820190506141b86000830184613d61565b92915050565b60006020820190506141d36000830184613dda565b92915050565b600060208201905081810360008301526141f38184613de9565b905092915050565b6000602082019050818103600083015261421481613e53565b9050919050565b6000602082019050818103600083015261423481613e76565b9050919050565b6000602082019050818103600083015261425481613e99565b9050919050565b6000602082019050818103600083015261427481613ebc565b9050919050565b6000602082019050818103600083015261429481613edf565b9050919050565b600060208201905081810360008301526142b481613f02565b9050919050565b600060208201905081810360008301526142d481613f25565b9050919050565b600060208201905081810360008301526142f481613f48565b9050919050565b6000602082019050818103600083015261431481613f6b565b9050919050565b6000602082019050818103600083015261433481613f8e565b9050919050565b6000602082019050818103600083015261435481613fb1565b9050919050565b6000602082019050818103600083015261437481613ff7565b9050919050565b600060208201905081810360008301526143948161401a565b9050919050565b600060208201905081810360008301526143b48161403d565b9050919050565b60006020820190506143d06000830184614060565b92915050565b60006020820190506143eb600083018461406f565b92915050565b6000602082019050614406600083018461407e565b92915050565b6000614416614427565b9050614422828261474f565b919050565b6000604051905090565b600067ffffffffffffffff82111561444c5761444b614909565b5b61445582614956565b9050602081019050919050565b600067ffffffffffffffff82111561447d5761447c614909565b5b61448682614956565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144ec826146ab565b91506144f7836146ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561452c5761452b61481e565b5b828201905092915050565b6000614542826146ab565b915061454d836146ab565b92508261455d5761455c61484d565b5b828204905092915050565b6000614573826146ab565b915061457e836146ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145b7576145b661481e565b5b828202905092915050565b60006145cd826146ab565b91506145d8836146ab565b9250828210156145eb576145ea61481e565b5b828203905092915050565b60006146018261468b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614655826145f6565b9050919050565b600081905061466a82614c27565b919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006146d48261465c565b9050919050565b82818337600083830152505050565b60005b838110156147085780820151818401526020810190506146ed565b83811115614717576000848401525b50505050565b6000600282049050600182168061473557607f821691505b60208210811415614749576147486148ab565b5b50919050565b61475882614956565b810181811067ffffffffffffffff8211171561477757614776614909565b5b80604052505050565b600061478b826146ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147be576147bd61481e565b5b600182019050919050565b60006147d4826147db565b9050919050565b60006147e682614967565b9050919050565b60006147f8826146ab565b9150614803836146ab565b9250826148135761481261484d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820616d6f756e74206d696e746564000000000000000000000000000000600082015250565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b7f4e6f7420696e2070726573616c65206c69737400000000000000000000000000600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f556e7375636365737366756c2077697468647261770000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60048110614c3857614c3761487c565b5b50565b614c44816145f6565b8114614c4f57600080fd5b50565b614c5b81614608565b8114614c6657600080fd5b50565b614c7281614614565b8114614c7d57600080fd5b50565b614c898161461e565b8114614c9457600080fd5b50565b614ca08161464a565b8114614cab57600080fd5b50565b60048110614cbb57600080fd5b50565b614cc78161466f565b8114614cd257600080fd5b50565b614cde816146ab565b8114614ce957600080fd5b5056fea2646970667358221220da5a5f4f6d3fc44ef4f933f3cfa50bc504085fb4d1ee99f4240af876f72aeb7564736f6c6343000807003300000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008721031b4ccfaedaacbeffe9fa1d86276199483d00000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000014537572676520576f6d656e2050617373706f7274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553555247450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d59717438464378517a5632395974617a38714e59514c65357079566775766645464c53746570454a6e5559392f00000000000000000000

Deployed Bytecode

0x6080604052600436106101f95760003560e01c806370a082311161010d578063a22cb465116100a0578063d547cfb71161006f578063d547cfb7146106f0578063d9279b601461071b578063e3e1e8ef14610737578063e985e9c514610753578063f2fde38b14610790576101f9565b8063a22cb46514610636578063b88d4fde1461065f578063c7ba754814610688578063c87b56dd146106b3576101f9565b80638c7ea24b116100dc5780638c7ea24b1461058c5780638da5cb5b146105b557806395d89b41146105e0578063a035b1fe1461060b576101f9565b806370a0823114610505578063715018a6146105425780637cb6475914610559578063853828b614610582576101f9565b80632e49d78b1161019057806340c10f191161015f57806340c10f191461043157806342842e0e1461044d57806349df728c1461047657806355f804b31461049f5780636352211e146104c8576101f9565b80632e49d78b146103895780632eb4a7ab146103b257806332cb6b0c146103dd5780633ae84a8214610408576101f9565b806318160ddd116101cc57806318160ddd146102cc578063200d2ed2146102f757806323b872dd146103225780632a55205a1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613b08565b6107b9565b6040516102329190614188565b60405180910390f35b34801561024757600080fd5b506102506107cb565b60405161025d91906141d9565b60405180910390f35b34801561027257600080fd5b5061028d60048036038101906102889190613c32565b61085d565b60405161029a91906140f8565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613a6e565b6108d9565b005b3480156102d857600080fd5b506102e16109e4565b6040516102ee91906143d6565b60405180910390f35b34801561030357600080fd5b5061030c6109fb565b60405161031991906141be565b60405180910390f35b34801561032e57600080fd5b5061034960048036038101906103449190613958565b610a0e565b005b34801561035757600080fd5b50610372600480360381019061036d9190613cec565b610a1e565b60405161038092919061415f565b60405180910390f35b34801561039557600080fd5b506103b060048036038101906103ab9190613b8f565b610ade565b005b3480156103be57600080fd5b506103c7610bbe565b6040516103d491906141a3565b60405180910390f35b3480156103e957600080fd5b506103f2610bc4565b6040516103ff91906143f1565b60405180910390f35b34801561041457600080fd5b5061042f600480360381019061042a9190613c05565b610bca565b005b61044b60048036038101906104469190613a6e565b610c82565b005b34801561045957600080fd5b50610474600480360381019061046f9190613958565b610eda565b005b34801561048257600080fd5b5061049d60048036038101906104989190613b62565b610efa565b005b3480156104ab57600080fd5b506104c660048036038101906104c19190613bbc565b611012565b005b3480156104d457600080fd5b506104ef60048036038101906104ea9190613c32565b6110a8565b6040516104fc91906140f8565b60405180910390f35b34801561051157600080fd5b5061052c600480360381019061052791906138eb565b6110be565b60405161053991906143d6565b60405180910390f35b34801561054e57600080fd5b5061055761118e565b005b34801561056557600080fd5b50610580600480360381019061057b9190613adb565b611216565b005b61058a61129c565b005b34801561059857600080fd5b506105b360048036038101906105ae9190613a6e565b61141d565b005b3480156105c157600080fd5b506105ca6114a7565b6040516105d791906140f8565b60405180910390f35b3480156105ec57600080fd5b506105f56114d1565b60405161060291906141d9565b60405180910390f35b34801561061757600080fd5b50610620611563565b60405161062d91906143bb565b60405180910390f35b34801561064257600080fd5b5061065d60048036038101906106589190613a2e565b611585565b005b34801561066b57600080fd5b50610686600480360381019061068191906139ab565b6116fd565b005b34801561069457600080fd5b5061069d611779565b6040516106aa91906143f1565b60405180910390f35b3480156106bf57600080fd5b506106da60048036038101906106d59190613c32565b61177e565b6040516106e791906141d9565b60405180910390f35b3480156106fc57600080fd5b5061070561181d565b60405161071291906141d9565b60405180910390f35b61073560048036038101906107309190613c32565b6118ab565b005b610751600480360381019061074c9190613c8c565b611a6c565b005b34801561075f57600080fd5b5061077a60048036038101906107759190613918565b611d7e565b6040516107879190614188565b60405180910390f35b34801561079c57600080fd5b506107b760048036038101906107b291906138eb565b611e12565b005b60006107c482611f0a565b9050919050565b6060600280546107da9061471d565b80601f01602080910402602001604051908101604052809291908181526020018280546108069061471d565b80156108535780601f1061082857610100808354040283529160200191610853565b820191906000526020600020905b81548152906001019060200180831161083657829003601f168201915b5050505050905090565b600061086882611f84565b61089e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108e4826110a8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561094c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661096b611fd2565b73ffffffffffffffffffffffffffffffffffffffff161415801561099d575061099b81610996611fd2565b611d7e565b155b156109d4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109df838383611fda565b505050565b60006109ee61208c565b6001546000540303905090565b600b60009054906101000a900460ff1681565b610a19838383612091565b505050565b6000806000600a6040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900462ffffff1662ffffff1662ffffff1681525050905080600001519250612710816020015162ffffff1685610aca9190614568565b610ad49190614537565b9150509250929050565b610ae6611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610b046114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b519061431b565b60405180910390fd5b80600b60006101000a81548160ff02191690836003811115610b7f57610b7e61487c565b5b02179055507f504eaf1c308a9514233b8d6364a1d4d333824d8ab51add90e420d54b18ba785b81604051610bb391906141be565b60405180910390a150565b600c5481565b61138881565b610bd2611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610bf06114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610c46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3d9061431b565b60405180910390fd5b80600e60006101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555050565b8181600567ffffffffffffffff1681600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610cdb91906144e1565b1115610d1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d13906141fb565b60405180910390fd5b8261138867ffffffffffffffff16610d32612547565b82610d3d91906144e1565b1115610d7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d759061425b565b60405180910390fd5b83600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681610dbb9190614568565b3414610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df3906142fb565b60405180910390fd5b60026003811115610e1057610e0f61487c565b5b600b60009054906101000a900460ff166003811115610e3257610e3161487c565b5b14610e72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e69906142bb565b60405180910390fd5b84600f60008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254610ec191906144e1565b92505081905550610ed2868661255a565b505050505050565b610ef5838383604051806020016040528060008152506116fd565b505050565b610f02611fd2565b73ffffffffffffffffffffffffffffffffffffffff16610f206114a7565b73ffffffffffffffffffffffffffffffffffffffff1614610f76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6d9061431b565b60405180910390fd5b60008173ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b8152600401610fb191906140f8565b60206040518083038186803b158015610fc957600080fd5b505afa158015610fdd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110019190613c5f565b905061100e823383612578565b5050565b61101a611fd2565b73ffffffffffffffffffffffffffffffffffffffff166110386114a7565b73ffffffffffffffffffffffffffffffffffffffff161461108e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110859061431b565b60405180910390fd5b80600d90805190602001906110a49291906135e8565b5050565b60006110b3826125fe565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611126576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b611196611fd2565b73ffffffffffffffffffffffffffffffffffffffff166111b46114a7565b73ffffffffffffffffffffffffffffffffffffffff161461120a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112019061431b565b60405180910390fd5b611214600061288d565b565b61121e611fd2565b73ffffffffffffffffffffffffffffffffffffffff1661123c6114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611292576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112899061431b565b60405180910390fd5b80600c8190555050565b6112a4611fd2565b73ffffffffffffffffffffffffffffffffffffffff166112c26114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130f9061431b565b60405180910390fd5b6002600854141561135e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113559061439b565b60405180910390fd5b600260088190555060003373ffffffffffffffffffffffffffffffffffffffff164760405161138c906140e3565b60006040518083038185875af1925050503d80600081146113c9576040519150601f19603f3d011682016040523d82523d6000602084013e6113ce565b606091505b5050905080611412576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114099061433b565b60405180910390fd5b506001600881905550565b611425611fd2565b73ffffffffffffffffffffffffffffffffffffffff166114436114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611499576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114909061431b565b60405180910390fd5b6114a38282612953565b5050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546114e09061471d565b80601f016020809104026020016040519081016040528092919081815260200182805461150c9061471d565b80156115595780601f1061152e57610100808354040283529160200191611559565b820191906000526020600020905b81548152906001019060200180831161153c57829003601f168201915b5050505050905090565b600e60009054906101000a90046fffffffffffffffffffffffffffffffff1681565b61158d611fd2565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006115ff611fd2565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116ac611fd2565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516116f19190614188565b60405180910390a35050565b611708848484612091565b6117278373ffffffffffffffffffffffffffffffffffffffff16612a3d565b801561173c575061173a84848484612a60565b155b15611773576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600581565b606061178982611f84565b6117bf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117c9612bc0565b90506000815114156117ea5760405180602001604052806000815250611815565b806117f484612c52565b6040516020016118059291906140bf565b6040516020818303038152906040525b915050919050565b600d805461182a9061471d565b80601f01602080910402602001604051908101604052809291908181526020018280546118569061471d565b80156118a35780601f10611878576101008083540402835291602001916118a3565b820191906000526020600020905b81548152906001019060200180831161188657829003601f168201915b505050505081565b600260085414156118f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e89061439b565b60405180910390fd5b6002600881905550611901611fd2565b73ffffffffffffffffffffffffffffffffffffffff1661191f6114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611975576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196c9061431b565b60405180910390fd5b8061138867ffffffffffffffff1661198b612547565b8261199691906144e1565b11156119d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ce9061425b565b60405180910390fd5b81600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681611a149190614568565b3414611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c906142fb565b60405180910390fd5b611a5f338461255a565b5050600160088190555050565b3383600567ffffffffffffffff1681600f60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611ac591906144e1565b1115611b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611afd906141fb565b60405180910390fd5b8461138867ffffffffffffffff16611b1c612547565b82611b2791906144e1565b1115611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f9061425b565b60405180910390fd5b85600e60009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff1681611ba59190614568565b3414611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906142fb565b60405180910390fd5b60016003811115611bfa57611bf961487c565b5b600b60009054906101000a900460ff166003811115611c1c57611c1b61487c565b5b14611c5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c539061427b565b60405180910390fd5b600033604051602001611c6f919061408d565b604051602081830303815290604052805190602001209050611cd5878780806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600c5483612db3565b611d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0b906142db565b60405180910390fd5b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6391906144e1565b92505081905550611d74338961255a565b5050505050505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611e1a611fd2565b73ffffffffffffffffffffffffffffffffffffffff16611e386114a7565b73ffffffffffffffffffffffffffffffffffffffff1614611e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e859061431b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef59061423b565b60405180910390fd5b611f078161288d565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f7d5750611f7c82612dca565b5b9050919050565b600081611f8f61208c565b11158015611f9e575060005482105b8015611fcb575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061209c826125fe565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612107576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16612128611fd2565b73ffffffffffffffffffffffffffffffffffffffff161480612157575061215685612151611fd2565b611d7e565b5b8061219c5750612165611fd2565b73ffffffffffffffffffffffffffffffffffffffff166121848461085d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806121d5576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561223c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6122498585856001612eac565b61225560008487611fda565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156124d55760005482146124d457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125408585856001612eb2565b5050505050565b600061255161208c565b60005403905090565b612574828260405180602001604052806000815250612eb8565b5050565b6125f98363a9059cbb60e01b848460405160240161259792919061415f565b604051602081830303815290604052907bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050612eca565b505050565b61260661366e565b60008290508061261461208c565b11158015612623575060005481105b15612856576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161285457600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612738578092505050612888565b5b60011561285357818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461284e578092505050612888565b612739565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612710811115612998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161298f9061421b565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff1681526020018262ffffff16815250600a60008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a81548162ffffff021916908362ffffff1602179055509050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a86611fd2565b8786866040518563ffffffff1660e01b8152600401612aa89493929190614113565b602060405180830381600087803b158015612ac257600080fd5b505af1925050508015612af357506040513d601f19601f82011682018060405250810190612af09190613b35565b60015b612b6d573d8060008114612b23576040519150601f19603f3d011682016040523d82523d6000602084013e612b28565b606091505b50600081511415612b65576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d8054612bcf9061471d565b80601f0160208091040260200160405190810160405280929190818152602001828054612bfb9061471d565b8015612c485780601f10612c1d57610100808354040283529160200191612c48565b820191906000526020600020905b815481529060010190602001808311612c2b57829003601f168201915b5050505050905090565b60606000821415612c9a576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612dae565b600082905060005b60008214612ccc578080612cb590614780565b915050600a82612cc59190614537565b9150612ca2565b60008167ffffffffffffffff811115612ce857612ce7614909565b5b6040519080825280601f01601f191660200182016040528015612d1a5781602001600182028036833780820191505090505b5090505b60008514612da757600182612d3391906145c2565b9150600a85612d4291906147ed565b6030612d4e91906144e1565b60f81b818381518110612d6457612d636148da565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612da09190614537565b9450612d1e565b8093505050505b919050565b600082612dc08584612f91565b1490509392505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e9557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612ea55750612ea482613006565b5b9050919050565b50505050565b50505050565b612ec58383836001613070565b505050565b6000612f2c826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff1661343e9092919063ffffffff16565b9050600081511115612f8c5780806020019051810190612f4c9190613aae565b612f8b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f829061437b565b60405180910390fd5b5b505050565b60008082905060005b8451811015612ffb576000858281518110612fb857612fb76148da565b5b60200260200101519050808311612fda57612fd38382613456565b9250612fe7565b612fe48184613456565b92505b508080612ff390614780565b915050612f9a565b508091505092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156130dd576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415613118576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6131256000868387612eac565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156132ef57506132ee8773ffffffffffffffffffffffffffffffffffffffff16612a3d565b5b156133b5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46133646000888480600101955088612a60565b61339a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156132f55782600054146133b057600080fd5b613421565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808214156133b6575b8160008190555050506134376000868387612eb2565b5050505050565b606061344d848460008561346d565b90509392505050565b600082600052816020526040600020905092915050565b6060824710156134b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134a99061429b565b60405180910390fd5b6134bb85612a3d565b6134fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f19061435b565b60405180910390fd5b6000808673ffffffffffffffffffffffffffffffffffffffff16858760405161352391906140a8565b60006040518083038185875af1925050503d8060008114613560576040519150601f19603f3d011682016040523d82523d6000602084013e613565565b606091505b5091509150613575828286613581565b92505050949350505050565b60608315613591578290506135e1565b6000835111156135a45782518084602001fd5b816040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016135d891906141d9565b60405180910390fd5b9392505050565b8280546135f49061471d565b90600052602060002090601f016020900481019282613616576000855561365d565b82601f1061362f57805160ff191683800117855561365d565b8280016001018555821561365d579182015b8281111561365c578251825591602001919060010190613641565b5b50905061366a91906136b1565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156136ca5760008160009055506001016136b2565b5090565b60006136e16136dc84614431565b61440c565b9050828152602081018484840111156136fd576136fc614947565b5b6137088482856146db565b509392505050565b600061372361371e84614462565b61440c565b90508281526020810184848401111561373f5761373e614947565b5b61374a8482856146db565b509392505050565b60008135905061376181614c3b565b92915050565b60008083601f84011261377d5761377c61493d565b5b8235905067ffffffffffffffff81111561379a57613799614938565b5b6020830191508360208202830111156137b6576137b5614942565b5b9250929050565b6000813590506137cc81614c52565b92915050565b6000815190506137e181614c52565b92915050565b6000813590506137f681614c69565b92915050565b60008135905061380b81614c80565b92915050565b60008151905061382081614c80565b92915050565b600082601f83011261383b5761383a61493d565b5b813561384b8482602086016136ce565b91505092915050565b60008135905061386381614c97565b92915050565b60008135905061387881614cae565b92915050565b600082601f8301126138935761389261493d565b5b81356138a3848260208601613710565b91505092915050565b6000813590506138bb81614cbe565b92915050565b6000813590506138d081614cd5565b92915050565b6000815190506138e581614cd5565b92915050565b60006020828403121561390157613900614951565b5b600061390f84828501613752565b91505092915050565b6000806040838503121561392f5761392e614951565b5b600061393d85828601613752565b925050602061394e85828601613752565b9150509250929050565b60008060006060848603121561397157613970614951565b5b600061397f86828701613752565b935050602061399086828701613752565b92505060406139a1868287016138c1565b9150509250925092565b600080600080608085870312156139c5576139c4614951565b5b60006139d387828801613752565b94505060206139e487828801613752565b93505060406139f5878288016138c1565b925050606085013567ffffffffffffffff811115613a1657613a1561494c565b5b613a2287828801613826565b91505092959194509250565b60008060408385031215613a4557613a44614951565b5b6000613a5385828601613752565b9250506020613a64858286016137bd565b9150509250929050565b60008060408385031215613a8557613a84614951565b5b6000613a9385828601613752565b9250506020613aa4858286016138c1565b9150509250929050565b600060208284031215613ac457613ac3614951565b5b6000613ad2848285016137d2565b91505092915050565b600060208284031215613af157613af0614951565b5b6000613aff848285016137e7565b91505092915050565b600060208284031215613b1e57613b1d614951565b5b6000613b2c848285016137fc565b91505092915050565b600060208284031215613b4b57613b4a614951565b5b6000613b5984828501613811565b91505092915050565b600060208284031215613b7857613b77614951565b5b6000613b8684828501613854565b91505092915050565b600060208284031215613ba557613ba4614951565b5b6000613bb384828501613869565b91505092915050565b600060208284031215613bd257613bd1614951565b5b600082013567ffffffffffffffff811115613bf057613bef61494c565b5b613bfc8482850161387e565b91505092915050565b600060208284031215613c1b57613c1a614951565b5b6000613c29848285016138ac565b91505092915050565b600060208284031215613c4857613c47614951565b5b6000613c56848285016138c1565b91505092915050565b600060208284031215613c7557613c74614951565b5b6000613c83848285016138d6565b91505092915050565b600080600060408486031215613ca557613ca4614951565b5b6000613cb3868287016138c1565b935050602084013567ffffffffffffffff811115613cd457613cd361494c565b5b613ce086828701613767565b92509250509250925092565b60008060408385031215613d0357613d02614951565b5b6000613d11858286016138c1565b9250506020613d22858286016138c1565b9150509250929050565b613d35816145f6565b82525050565b613d4c613d47826145f6565b6147c9565b82525050565b613d5b81614608565b82525050565b613d6a81614614565b82525050565b6000613d7b82614493565b613d8581856144a9565b9350613d958185602086016146ea565b613d9e81614956565b840191505092915050565b6000613db482614493565b613dbe81856144ba565b9350613dce8185602086016146ea565b80840191505092915050565b613de3816146c9565b82525050565b6000613df48261449e565b613dfe81856144c5565b9350613e0e8185602086016146ea565b613e1781614956565b840191505092915050565b6000613e2d8261449e565b613e3781856144d6565b9350613e478185602086016146ea565b80840191505092915050565b6000613e606011836144c5565b9150613e6b82614974565b602082019050919050565b6000613e83601a836144c5565b9150613e8e8261499d565b602082019050919050565b6000613ea66026836144c5565b9150613eb1826149c6565b604082019050919050565b6000613ec96013836144c5565b9150613ed482614a15565b602082019050919050565b6000613eec6012836144c5565b9150613ef782614a3e565b602082019050919050565b6000613f0f6026836144c5565b9150613f1a82614a67565b604082019050919050565b6000613f32600f836144c5565b9150613f3d82614ab6565b602082019050919050565b6000613f556013836144c5565b9150613f6082614adf565b602082019050919050565b6000613f78600e836144c5565b9150613f8382614b08565b602082019050919050565b6000613f9b6020836144c5565b9150613fa682614b31565b602082019050919050565b6000613fbe6015836144c5565b9150613fc982614b5a565b602082019050919050565b6000613fe16000836144ba565b9150613fec82614b83565b600082019050919050565b6000614004601d836144c5565b915061400f82614b86565b602082019050919050565b6000614027602a836144c5565b915061403282614baf565b604082019050919050565b600061404a601f836144c5565b915061405582614bfe565b602082019050919050565b6140698161466f565b82525050565b614078816146ab565b82525050565b614087816146b5565b82525050565b60006140998284613d3b565b60148201915081905092915050565b60006140b48284613da9565b915081905092915050565b60006140cb8285613e22565b91506140d78284613e22565b91508190509392505050565b60006140ee82613fd4565b9150819050919050565b600060208201905061410d6000830184613d2c565b92915050565b60006080820190506141286000830187613d2c565b6141356020830186613d2c565b614142604083018561406f565b81810360608301526141548184613d70565b905095945050505050565b60006040820190506141746000830185613d2c565b614181602083018461406f565b9392505050565b600060208201905061419d6000830184613d52565b92915050565b60006020820190506141b86000830184613d61565b92915050565b60006020820190506141d36000830184613dda565b92915050565b600060208201905081810360008301526141f38184613de9565b905092915050565b6000602082019050818103600083015261421481613e53565b9050919050565b6000602082019050818103600083015261423481613e76565b9050919050565b6000602082019050818103600083015261425481613e99565b9050919050565b6000602082019050818103600083015261427481613ebc565b9050919050565b6000602082019050818103600083015261429481613edf565b9050919050565b600060208201905081810360008301526142b481613f02565b9050919050565b600060208201905081810360008301526142d481613f25565b9050919050565b600060208201905081810360008301526142f481613f48565b9050919050565b6000602082019050818103600083015261431481613f6b565b9050919050565b6000602082019050818103600083015261433481613f8e565b9050919050565b6000602082019050818103600083015261435481613fb1565b9050919050565b6000602082019050818103600083015261437481613ff7565b9050919050565b600060208201905081810360008301526143948161401a565b9050919050565b600060208201905081810360008301526143b48161403d565b9050919050565b60006020820190506143d06000830184614060565b92915050565b60006020820190506143eb600083018461406f565b92915050565b6000602082019050614406600083018461407e565b92915050565b6000614416614427565b9050614422828261474f565b919050565b6000604051905090565b600067ffffffffffffffff82111561444c5761444b614909565b5b61445582614956565b9050602081019050919050565b600067ffffffffffffffff82111561447d5761447c614909565b5b61448682614956565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144ec826146ab565b91506144f7836146ab565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561452c5761452b61481e565b5b828201905092915050565b6000614542826146ab565b915061454d836146ab565b92508261455d5761455c61484d565b5b828204905092915050565b6000614573826146ab565b915061457e836146ab565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156145b7576145b661481e565b5b828202905092915050565b60006145cd826146ab565b91506145d8836146ab565b9250828210156145eb576145ea61481e565b5b828203905092915050565b60006146018261468b565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6000614655826145f6565b9050919050565b600081905061466a82614c27565b919050565b60006fffffffffffffffffffffffffffffffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b60006146d48261465c565b9050919050565b82818337600083830152505050565b60005b838110156147085780820151818401526020810190506146ed565b83811115614717576000848401525b50505050565b6000600282049050600182168061473557607f821691505b60208210811415614749576147486148ab565b5b50919050565b61475882614956565b810181811067ffffffffffffffff8211171561477757614776614909565b5b80604052505050565b600061478b826146ab565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147be576147bd61481e565b5b600182019050919050565b60006147d4826147db565b9050919050565b60006147e682614967565b9050919050565b60006147f8826146ab565b9150614803836146ab565b9250826148135761481261484d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f4d617820616d6f756e74206d696e746564000000000000000000000000000000600082015250565b7f45524332393831526f79616c746965733a20546f6f2068696768000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f436f6c6c656374696f6e20736f6c64206f757400000000000000000000000000600082015250565b7f50726573616c65206e6f74206163746976650000000000000000000000000000600082015250565b7f416464726573733a20696e73756666696369656e742062616c616e636520666f60008201527f722063616c6c0000000000000000000000000000000000000000000000000000602082015250565b7f53616c65206e6f74206163746976650000000000000000000000000000000000600082015250565b7f4e6f7420696e2070726573616c65206c69737400000000000000000000000000600082015250565b7f4e6f7420656e6f75676820455448000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f556e7375636365737366756c2077697468647261770000000000000000000000600082015250565b50565b7f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000600082015250565b7f5361666545524332303a204552433230206f7065726174696f6e20646964206e60008201527f6f74207375636365656400000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b60048110614c3857614c3761487c565b5b50565b614c44816145f6565b8114614c4f57600080fd5b50565b614c5b81614608565b8114614c6657600080fd5b50565b614c7281614614565b8114614c7d57600080fd5b50565b614c898161461e565b8114614c9457600080fd5b50565b614ca08161464a565b8114614cab57600080fd5b50565b60048110614cbb57600080fd5b50565b614cc78161466f565b8114614cd257600080fd5b50565b614cde816146ab565b8114614ce957600080fd5b5056fea2646970667358221220da5a5f4f6d3fc44ef4f933f3cfa50bc504085fb4d1ee99f4240af876f72aeb7564736f6c63430008070033

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

00000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008721031b4ccfaedaacbeffe9fa1d86276199483d00000000000000000000000000000000000000000000000000000000000002580000000000000000000000000000000000000000000000000000000000000014537572676520576f6d656e2050617373706f7274000000000000000000000000000000000000000000000000000000000000000000000000000000000000000553555247450000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d59717438464378517a5632395974617a38714e59514c65357079566775766645464c53746570454a6e5559392f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Surge Women Passport
Arg [1] : _symbol (string): SURGE
Arg [2] : _baseTokenURI (string): ipfs://QmYqt8FCxQzV29Ytaz8qNYQLe5pyVguvfEFLStepEJnUY9/
Arg [3] : _price (uint128): 0
Arg [4] : _receiver (address): 0x8721031B4CCfAEDaACBEFFE9fA1d86276199483D
Arg [5] : _royalties (uint256): 600

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000008721031b4ccfaedaacbeffe9fa1d86276199483d
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000258
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [7] : 537572676520576f6d656e2050617373706f7274000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [9] : 5355524745000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [11] : 697066733a2f2f516d59717438464378517a5632395974617a38714e59514c65
Arg [12] : 357079566775766645464c53746570454a6e5559392f00000000000000000000


Deployed Bytecode Sourcemap

59669:6511:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64472:175;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44600:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46103:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45666:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40736:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59977:44;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46968:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31214:321;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;65113:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60028:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60095:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65320:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62200:386;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47209:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65994:183;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64891:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44408:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41856:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13540:103;;;;;;;;;;;;;:::i;:::-;;65498:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65668:209;;;:::i;:::-;;64146:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12889:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44769:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60188:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46379:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47465:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60142:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44944:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60060:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63583:265;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62847:598;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46737:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13798:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64472:175;64579:4;64603:36;64627:11;64603:23;:36::i;:::-;64596:43;;64472:175;;;:::o;44600:100::-;44654:13;44687:5;44680:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44600:100;:::o;46103:204::-;46171:7;46196:16;46204:7;46196;:16::i;:::-;46191:64;;46221:34;;;;;;;;;;;;;;46191:64;46275:15;:24;46291:7;46275:24;;;;;;;;;;;;;;;;;;;;;46268:31;;46103:204;;;:::o;45666:371::-;45739:13;45755:24;45771:7;45755:15;:24::i;:::-;45739:40;;45800:5;45794:11;;:2;:11;;;45790:48;;;45814:24;;;;;;;;;;;;;;45790:48;45871:5;45855:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;45881:37;45898:5;45905:12;:10;:12::i;:::-;45881:16;:37::i;:::-;45880:38;45855:63;45851:138;;;45942:35;;;;;;;;;;;;;;45851:138;46001:28;46010:2;46014:7;46023:5;46001:8;:28::i;:::-;45728:309;45666:371;;:::o;40736:303::-;40780:7;41005:15;:13;:15::i;:::-;40990:12;;40974:13;;:28;:46;40967:53;;40736:303;:::o;59977:44::-;;;;;;;;;;;;;:::o;46968:170::-;47102:28;47112:4;47118:2;47122:7;47102:9;:28::i;:::-;46968:170;;;:::o;31214:321::-;31327:16;31345:21;31384:28;31415:10;31384:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31447:9;:19;;;31436:30;;31522:5;31502:9;:16;;;31494:24;;:5;:24;;;;:::i;:::-;31493:34;;;;:::i;:::-;31477:50;;31373:162;31214:321;;;;;:::o;65113:128::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65189:7:::1;65180:6;;:16;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;65212:21;65225:7;65212:21;;;;;;:::i;:::-;;;;;;;;65113:128:::0;:::o;60028:25::-;;;;:::o;60095:40::-;60131:4;60095:40;:::o;65320:84::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65390:6:::1;65382:5;;:14;;;;;;;;;;;;;;;;;;65320:84:::0;:::o;62200:386::-;62312:2;62316:15;60180:1;61173:51;;61193:15;61173:13;:17;61187:2;61173:17;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:51;;61165:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;62358:15:::1;60131:4;61488:46;;61506:14;:12;:14::i;:::-;61488:15;:32;;;;:::i;:::-;:46;;61480:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;62396:15:::2;61829:5;;;;;;;;;;;61811:23;;:15;:23;;;;:::i;:::-;61798:9;:36;61790:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;62447:21:::3;62437:31;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:31;;;;;;;;:::i;:::-;;;62429:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;62522:15;62501:13;:17;62515:2;62501:17;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;62548:30;62558:2;62562:15;62548:9;:30::i;:::-;61569:1:::2;61257::::1;62200:386:::0;;;;:::o;47209:185::-;47347:39;47364:4;47370:2;47374:7;47347:39;;;;;;;;;;;;:16;:39::i;:::-;47209:185;;;:::o;65994:183::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66060:15:::1;66078:5;:15;;;66102:4;66078:30;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;66060:48;;66119:50;66142:5;66149:10;66161:7;66119:22;:50::i;:::-;66049:128;65994:183:::0;:::o;64891:113::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64983:13:::1;64968:12;:28;;;;;;;;;;;;:::i;:::-;;64891:113:::0;:::o;44408:125::-;44472:7;44499:21;44512:7;44499:12;:21::i;:::-;:26;;;44492:33;;44408:125;;;:::o;41856:206::-;41920:7;41961:1;41944:19;;:5;:19;;;41940:60;;;41972:28;;;;;;;;;;;;;;41940:60;42026:12;:19;42039:5;42026:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42018:36;;42011:43;;41856:206;;;:::o;13540:103::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13605:30:::1;13632:1;13605:18;:30::i;:::-;13540:103::o:0;65498:104::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65583:11:::1;65570:10;:24;;;;65498:104:::0;:::o;65668:209::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7863:1:::1;8461:7;;:19;;8453:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7863:1;8594:7;:18;;;;65741:12:::2;65767:10;65759:24;;65791:21;65759:58;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65740:77;;;65836:7;65828:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;65729:148;7819:1:::1;8773:7;:22;;;;65668:209::o:0;64146:123::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;64230:31:::1;64244:9;64255:5;64230:13;:31::i;:::-;64146:123:::0;;:::o;12889:87::-;12935:7;12962:6;;;;;;;;;;;12955:13;;12889:87;:::o;44769:104::-;44825:13;44858:7;44851:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44769:104;:::o;60188:20::-;;;;;;;;;;;;;:::o;46379:287::-;46490:12;:10;:12::i;:::-;46478:24;;:8;:24;;;46474:54;;;46511:17;;;;;;;;;;;;;;46474:54;46586:8;46541:18;:32;46560:12;:10;:12::i;:::-;46541:32;;;;;;;;;;;;;;;:42;46574:8;46541:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46639:8;46610:48;;46625:12;:10;:12::i;:::-;46610:48;;;46649:8;46610:48;;;;;;:::i;:::-;;;;;;;;46379:287;;:::o;47465:369::-;47632:28;47642:4;47648:2;47652:7;47632:9;:28::i;:::-;47675:15;:2;:13;;;:15::i;:::-;:76;;;;;47695:56;47726:4;47732:2;47736:7;47745:5;47695:30;:56::i;:::-;47694:57;47675:76;47671:156;;;47775:40;;;;;;;;;;;;;;47671:156;47465:369;;;;:::o;60142:39::-;60180:1;60142:39;:::o;44944:318::-;45017:13;45048:16;45056:7;45048;:16::i;:::-;45043:59;;45073:29;;;;;;;;;;;;;;45043:59;45115:21;45139:10;:8;:10::i;:::-;45115:34;;45192:1;45173:7;45167:21;:26;;:87;;;;;;;;;;;;;;;;;45220:7;45229:18;:7;:16;:18::i;:::-;45203:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45167:87;45160:94;;;44944:318;;;:::o;60060:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;63583:265::-;7863:1;8461:7;;:19;;8453:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;7863:1;8594:7;:18;;;;13120:12:::1;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63731:15:::2;60131:4;61488:46;;61506:14;:12;:14::i;:::-;61488:15;:32;;;;:::i;:::-;:46;;61480:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;63769:15:::3;61829:5;;;;;;;;;;;61811:23;;:15;:23;;;;:::i;:::-;61798:9;:36;61790:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63802:38:::4;63812:10;63824:15;63802:9;:38::i;:::-;61569:1:::3;13180::::2;7819::::0;8773:7;:22;;;;63583:265;:::o;62847:598::-;62987:10;62999:15;60180:1;61173:51;;61193:15;61173:13;:17;61187:2;61173:17;;;;;;;;;;;;;;;;:35;;;;:::i;:::-;:51;;61165:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;63041:15:::1;60131:4;61488:46;;61506:14;:12;:14::i;:::-;61488:15;:32;;;;:::i;:::-;:46;;61480:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;63079:15:::2;61829:5;;;;;;;;;;;61811:23;;:15;:23;;;;:::i;:::-;61798:9;:36;61790:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63130:18:::3;63120:28;;;;;;;;:::i;:::-;;:6;;;;;;;;;;;:28;;;;;;;;:::i;:::-;;;63112:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;63184:12;63226:10;63209:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;63199:39;;;;;;63184:54;;63257:50;63276:12;;63257:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63290:10;;63302:4;63257:18;:50::i;:::-;63249:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;63373:15;63344:13;:25;63358:10;63344:25;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;63399:38;63409:10;63421:15;63399:9;:38::i;:::-;63101:344;61569:1:::2;61257::::1;62847:598:::0;;;;;:::o;46737:164::-;46834:4;46858:18;:25;46877:5;46858:25;;;;;;;;;;;;;;;:35;46884:8;46858:35;;;;;;;;;;;;;;;;;;;;;;;;;46851:42;;46737:164;;;;:::o;13798:201::-;13120:12;:10;:12::i;:::-;13109:23;;:7;:5;:7::i;:::-;:23;;;13101:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13907:1:::1;13887:22;;:8;:22;;;;13879:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13963:28;13982:8;13963:18;:28::i;:::-;13798:201:::0;:::o;30162:283::-;30292:4;30349:35;30334:50;;;:11;:50;;;;:103;;;;30401:36;30425:11;30401:23;:36::i;:::-;30334:103;30314:123;;30162:283;;;:::o;48089:174::-;48146:4;48189:7;48170:15;:13;:15::i;:::-;:26;;:53;;;;;48210:13;;48200:7;:23;48170:53;:85;;;;;48228:11;:20;48240:7;48228:20;;;;;;;;;;;:27;;;;;;;;;;;;48227:28;48170:85;48163:92;;48089:174;;;:::o;11613:98::-;11666:7;11693:10;11686:17;;11613:98;:::o;56246:196::-;56388:2;56361:15;:24;56377:7;56361:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;56426:7;56422:2;56406:28;;56415:5;56406:28;;;;;;;;;;;;56246:196;;;:::o;40510:92::-;40566:7;40510:92;:::o;51189:2130::-;51304:35;51342:21;51355:7;51342:12;:21::i;:::-;51304:59;;51402:4;51380:26;;:13;:18;;;:26;;;51376:67;;51415:28;;;;;;;;;;;;;;51376:67;51456:22;51498:4;51482:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;51519:36;51536:4;51542:12;:10;:12::i;:::-;51519:16;:36::i;:::-;51482:73;:126;;;;51596:12;:10;:12::i;:::-;51572:36;;:20;51584:7;51572:11;:20::i;:::-;:36;;;51482:126;51456:153;;51627:17;51622:66;;51653:35;;;;;;;;;;;;;;51622:66;51717:1;51703:16;;:2;:16;;;51699:52;;;51728:23;;;;;;;;;;;;;;51699:52;51764:43;51786:4;51792:2;51796:7;51805:1;51764:21;:43::i;:::-;51872:35;51889:1;51893:7;51902:4;51872:8;:35::i;:::-;52233:1;52203:12;:18;52216:4;52203:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52277:1;52249:12;:16;52262:2;52249:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52295:31;52329:11;:20;52341:7;52329:20;;;;;;;;;;;52295:54;;52380:2;52364:8;:13;;;:18;;;;;;;;;;;;;;;;;;52430:15;52397:8;:23;;;:49;;;;;;;;;;;;;;;;;;52698:19;52730:1;52720:7;:11;52698:33;;52746:31;52780:11;:24;52792:11;52780:24;;;;;;;;;;;52746:58;;52848:1;52823:27;;:8;:13;;;;;;;;;;;;:27;;;52819:384;;;53033:13;;53018:11;:28;53014:174;;53087:4;53071:8;:13;;;:20;;;;;;;;;;;;;;;;;;53140:13;:28;;;53114:8;:23;;;:54;;;;;;;;;;;;;;;;;;53014:174;52819:384;52178:1036;;;53250:7;53246:2;53231:27;;53240:4;53231:27;;;;;;;;;;;;53269:42;53290:4;53296:2;53300:7;53309:1;53269:20;:42::i;:::-;51293:2026;;51189:2130;;;:::o;41132:283::-;41179:7;41381:15;:13;:15::i;:::-;41365:13;;:31;41358:38;;41132:283;:::o;48271:104::-;48340:27;48350:2;48354:8;48340:27;;;;;;;;;;;;:9;:27::i;:::-;48271:104;;:::o;23557:211::-;23674:86;23694:5;23724:23;;;23749:2;23753:5;23701:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23674:19;:86::i;:::-;23557:211;;;:::o;43237:1109::-;43299:21;;:::i;:::-;43333:12;43348:7;43333:22;;43416:4;43397:15;:13;:15::i;:::-;:23;;:47;;;;;43431:13;;43424:4;:20;43397:47;43393:886;;;43465:31;43499:11;:17;43511:4;43499:17;;;;;;;;;;;43465:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43540:9;:16;;;43535:729;;43611:1;43585:28;;:9;:14;;;:28;;;43581:101;;43649:9;43642:16;;;;;;43581:101;43984:261;43991:4;43984:261;;;44024:6;;;;;;;;44069:11;:17;44081:4;44069:17;;;;;;;;;;;44057:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44143:1;44117:28;;:9;:14;;;:28;;;44113:109;;44185:9;44178:16;;;;;;44113:109;43984:261;;;43535:729;43446:833;43393:886;44307:31;;;;;;;;;;;;;;43237:1109;;;;:::o;14159:191::-;14233:16;14252:6;;;;;;;;;;;14233:25;;14278:8;14269:6;;:17;;;;;;;;;;;;;;;;;;14333:8;14302:40;;14323:8;14302:40;;;;;;;;;;;;14222:128;14159:191;:::o;30968:199::-;31062:5;31053;:14;;31045:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;31122:37;;;;;;;;31134:9;31122:37;;;;;;31152:5;31122:37;;;;;31109:10;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30968:199;;:::o;15590:326::-;15650:4;15907:1;15885:7;:19;;;:23;15878:30;;15590:326;;;:::o;56934:667::-;57097:4;57134:2;57118:36;;;57155:12;:10;:12::i;:::-;57169:4;57175:7;57184:5;57118:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57114:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57369:1;57352:6;:13;:18;57348:235;;;57398:40;;;;;;;;;;;;;;57348:235;57541:6;57535:13;57526:6;57522:2;57518:15;57511:38;57114:480;57247:45;;;57237:55;;;:6;:55;;;;57230:62;;;56934:667;;;;;;:::o;64688:113::-;64748:13;64781:12;64774:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64688:113;:::o;9175:723::-;9231:13;9461:1;9452:5;:10;9448:53;;;9479:10;;;;;;;;;;;;;;;;;;;;;9448:53;9511:12;9526:5;9511:20;;9542:14;9567:78;9582:1;9574:4;:9;9567:78;;9600:8;;;;;:::i;:::-;;;;9631:2;9623:10;;;;;:::i;:::-;;;9567:78;;;9655:19;9687:6;9677:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9655:39;;9705:154;9721:1;9712:5;:10;9705:154;;9749:1;9739:11;;;;;:::i;:::-;;;9816:2;9808:5;:10;;;;:::i;:::-;9795:2;:24;;;;:::i;:::-;9782:39;;9765:6;9772;9765:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;9845:2;9836:11;;;;;:::i;:::-;;;9705:154;;;9883:6;9869:21;;;;;9175:723;;;;:::o;4585:190::-;4710:4;4763;4734:25;4747:5;4754:4;4734:12;:25::i;:::-;:33;4727:40;;4585:190;;;;;:::o;41487:305::-;41589:4;41641:25;41626:40;;;:11;:40;;;;:105;;;;41698:33;41683:48;;;:11;:48;;;;41626:105;:158;;;;41748:36;41772:11;41748:23;:36::i;:::-;41626:158;41606:178;;41487:305;;;:::o;58249:159::-;;;;;:::o;59067:158::-;;;;;:::o;48738:163::-;48861:32;48867:2;48871:8;48881:5;48888:4;48861:5;:32::i;:::-;48738:163;;;:::o;26130:716::-;26554:23;26580:69;26608:4;26580:69;;;;;;;;;;;;;;;;;26588:5;26580:27;;;;:69;;;;;:::i;:::-;26554:95;;26684:1;26664:10;:17;:21;26660:179;;;26761:10;26750:30;;;;;;;;;;;;:::i;:::-;26742:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;26660:179;26200:646;26130:716;;:::o;5137:675::-;5220:7;5240:20;5263:4;5240:27;;5283:9;5278:497;5302:5;:12;5298:1;:16;5278:497;;;5336:20;5359:5;5365:1;5359:8;;;;;;;;:::i;:::-;;;;;;;;5336:31;;5402:12;5386;:28;5382:382;;5529:42;5544:12;5558;5529:14;:42::i;:::-;5514:57;;5382:382;;;5706:42;5721:12;5735;5706:14;:42::i;:::-;5691:57;;5382:382;5321:454;5316:3;;;;;:::i;:::-;;;;5278:497;;;;5792:12;5785:19;;;5137:675;;;;:::o;29666:157::-;29751:4;29790:25;29775:40;;;:11;:40;;;;29768:47;;29666:157;;;:::o;49160:1775::-;49299:20;49322:13;;49299:36;;49364:1;49350:16;;:2;:16;;;49346:48;;;49375:19;;;;;;;;;;;;;;49346:48;49421:1;49409:8;:13;49405:44;;;49431:18;;;;;;;;;;;;;;49405:44;49462:61;49492:1;49496:2;49500:12;49514:8;49462:21;:61::i;:::-;49835:8;49800:12;:16;49813:2;49800:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49899:8;49859:12;:16;49872:2;49859:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49958:2;49925:11;:25;49937:12;49925:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;50025:15;49975:11;:25;49987:12;49975:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;50058:20;50081:12;50058:35;;50108:11;50137:8;50122:12;:23;50108:37;;50166:4;:23;;;;;50174:15;:2;:13;;;:15::i;:::-;50166:23;50162:641;;;50210:314;50266:12;50262:2;50241:38;;50258:1;50241:38;;;;;;;;;;;;50307:69;50346:1;50350:2;50354:14;;;;;;50370:5;50307:30;:69::i;:::-;50302:174;;50412:40;;;;;;;;;;;;;;50302:174;50519:3;50503:12;:19;;50210:314;;50605:12;50588:13;;:29;50584:43;;50619:8;;;50584:43;50162:641;;;50668:120;50724:14;;;;;;50720:2;50699:40;;50716:1;50699:40;;;;;;;;;;;;50783:3;50767:12;:19;;50668:120;;50162:641;50833:12;50817:13;:28;;;;49775:1082;;50867:60;50896:1;50900:2;50904:12;50918:8;50867:20;:60::i;:::-;49288:1647;49160:1775;;;;:::o;18335:229::-;18472:12;18504:52;18526:6;18534:4;18540:1;18543:12;18504:21;:52::i;:::-;18497:59;;18335:229;;;;;:::o;5820:224::-;5888:13;5951:1;5945:4;5938:15;5980:1;5974:4;5967:15;6021:4;6015;6005:21;5996:30;;5820:224;;;;:::o;19455:510::-;19625:12;19683:5;19658:21;:30;;19650:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;19750:18;19761:6;19750:10;:18::i;:::-;19742:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;19816:12;19830:23;19857:6;:11;;19876:5;19883:4;19857:31;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19815:73;;;;19906:51;19923:7;19932:10;19944:12;19906:16;:51::i;:::-;19899:58;;;;19455:510;;;;;;:::o;22141:712::-;22291:12;22320:7;22316:530;;;22351:10;22344:17;;;;22316:530;22485:1;22465:10;:17;:21;22461:374;;;22663:10;22657:17;22724:15;22711:10;22707:2;22703:19;22696:44;22461:374;22806:12;22799:20;;;;;;;;;;;:::i;:::-;;;;;;;;22141:712;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:122;;1144:79;;:::i;:::-;1103:122;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:117;;;1309:79;;:::i;:::-;1273:117;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:128;;;1484:79;;:::i;:::-;1437:128;1003:568;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1577:133;;;;:::o;1716:137::-;1770:5;1801:6;1795:13;1786:22;;1817:30;1841:5;1817:30;:::i;:::-;1716:137;;;;:::o;1859:139::-;1905:5;1943:6;1930:20;1921:29;;1959:33;1986:5;1959:33;:::i;:::-;1859:139;;;;:::o;2004:137::-;2049:5;2087:6;2074:20;2065:29;;2103:32;2129:5;2103:32;:::i;:::-;2004:137;;;;:::o;2147:141::-;2203:5;2234:6;2228:13;2219:22;;2250:32;2276:5;2250:32;:::i;:::-;2147:141;;;;:::o;2307:338::-;2362:5;2411:3;2404:4;2396:6;2392:17;2388:27;2378:122;;2419:79;;:::i;:::-;2378:122;2536:6;2523:20;2561:78;2635:3;2627:6;2620:4;2612:6;2608:17;2561:78;:::i;:::-;2552:87;;2368:277;2307:338;;;;:::o;2651:165::-;2710:5;2748:6;2735:20;2726:29;;2764:46;2804:5;2764:46;:::i;:::-;2651:165;;;;:::o;2822:169::-;2883:5;2921:6;2908:20;2899:29;;2937:48;2979:5;2937:48;:::i;:::-;2822:169;;;;:::o;3011:340::-;3067:5;3116:3;3109:4;3101:6;3097:17;3093:27;3083:122;;3124:79;;:::i;:::-;3083:122;3241:6;3228:20;3266:79;3341:3;3333:6;3326:4;3318:6;3314:17;3266:79;:::i;:::-;3257:88;;3073:278;3011:340;;;;:::o;3357:139::-;3403:5;3441:6;3428:20;3419:29;;3457:33;3484:5;3457:33;:::i;:::-;3357:139;;;;:::o;3502:::-;3548:5;3586:6;3573:20;3564:29;;3602:33;3629:5;3602:33;:::i;:::-;3502:139;;;;:::o;3647:143::-;3704:5;3735:6;3729:13;3720:22;;3751:33;3778:5;3751:33;:::i;:::-;3647:143;;;;:::o;3796:329::-;3855:6;3904:2;3892:9;3883:7;3879:23;3875:32;3872:119;;;3910:79;;:::i;:::-;3872:119;4030:1;4055:53;4100:7;4091:6;4080:9;4076:22;4055:53;:::i;:::-;4045:63;;4001:117;3796:329;;;;:::o;4131:474::-;4199:6;4207;4256:2;4244:9;4235:7;4231:23;4227:32;4224:119;;;4262:79;;:::i;:::-;4224:119;4382:1;4407:53;4452:7;4443:6;4432:9;4428:22;4407:53;:::i;:::-;4397:63;;4353:117;4509:2;4535:53;4580:7;4571:6;4560:9;4556:22;4535:53;:::i;:::-;4525:63;;4480:118;4131:474;;;;;:::o;4611:619::-;4688:6;4696;4704;4753:2;4741:9;4732:7;4728:23;4724:32;4721:119;;;4759:79;;:::i;:::-;4721:119;4879:1;4904:53;4949:7;4940:6;4929:9;4925:22;4904:53;:::i;:::-;4894:63;;4850:117;5006:2;5032:53;5077:7;5068:6;5057:9;5053:22;5032:53;:::i;:::-;5022:63;;4977:118;5134:2;5160:53;5205:7;5196:6;5185:9;5181:22;5160:53;:::i;:::-;5150:63;;5105:118;4611:619;;;;;:::o;5236:943::-;5331:6;5339;5347;5355;5404:3;5392:9;5383:7;5379:23;5375:33;5372:120;;;5411:79;;:::i;:::-;5372:120;5531:1;5556:53;5601:7;5592:6;5581:9;5577:22;5556:53;:::i;:::-;5546:63;;5502:117;5658:2;5684:53;5729:7;5720:6;5709:9;5705:22;5684:53;:::i;:::-;5674:63;;5629:118;5786:2;5812:53;5857:7;5848:6;5837:9;5833:22;5812:53;:::i;:::-;5802:63;;5757:118;5942:2;5931:9;5927:18;5914:32;5973:18;5965:6;5962:30;5959:117;;;5995:79;;:::i;:::-;5959:117;6100:62;6154:7;6145:6;6134:9;6130:22;6100:62;:::i;:::-;6090:72;;5885:287;5236:943;;;;;;;:::o;6185:468::-;6250:6;6258;6307:2;6295:9;6286:7;6282:23;6278:32;6275:119;;;6313:79;;:::i;:::-;6275:119;6433:1;6458:53;6503:7;6494:6;6483:9;6479:22;6458:53;:::i;:::-;6448:63;;6404:117;6560:2;6586:50;6628:7;6619:6;6608:9;6604:22;6586:50;:::i;:::-;6576:60;;6531:115;6185:468;;;;;:::o;6659:474::-;6727:6;6735;6784:2;6772:9;6763:7;6759:23;6755:32;6752:119;;;6790:79;;:::i;:::-;6752:119;6910:1;6935:53;6980:7;6971:6;6960:9;6956:22;6935:53;:::i;:::-;6925:63;;6881:117;7037:2;7063:53;7108:7;7099:6;7088:9;7084:22;7063:53;:::i;:::-;7053:63;;7008:118;6659:474;;;;;:::o;7139:345::-;7206:6;7255:2;7243:9;7234:7;7230:23;7226:32;7223:119;;;7261:79;;:::i;:::-;7223:119;7381:1;7406:61;7459:7;7450:6;7439:9;7435:22;7406:61;:::i;:::-;7396:71;;7352:125;7139:345;;;;:::o;7490:329::-;7549:6;7598:2;7586:9;7577:7;7573:23;7569:32;7566:119;;;7604:79;;:::i;:::-;7566:119;7724:1;7749:53;7794:7;7785:6;7774:9;7770:22;7749:53;:::i;:::-;7739:63;;7695:117;7490:329;;;;:::o;7825:327::-;7883:6;7932:2;7920:9;7911:7;7907:23;7903:32;7900:119;;;7938:79;;:::i;:::-;7900:119;8058:1;8083:52;8127:7;8118:6;8107:9;8103:22;8083:52;:::i;:::-;8073:62;;8029:116;7825:327;;;;:::o;8158:349::-;8227:6;8276:2;8264:9;8255:7;8251:23;8247:32;8244:119;;;8282:79;;:::i;:::-;8244:119;8402:1;8427:63;8482:7;8473:6;8462:9;8458:22;8427:63;:::i;:::-;8417:73;;8373:127;8158:349;;;;:::o;8513:355::-;8585:6;8634:2;8622:9;8613:7;8609:23;8605:32;8602:119;;;8640:79;;:::i;:::-;8602:119;8760:1;8785:66;8843:7;8834:6;8823:9;8819:22;8785:66;:::i;:::-;8775:76;;8731:130;8513:355;;;;:::o;8874:359::-;8948:6;8997:2;8985:9;8976:7;8972:23;8968:32;8965:119;;;9003:79;;:::i;:::-;8965:119;9123:1;9148:68;9208:7;9199:6;9188:9;9184:22;9148:68;:::i;:::-;9138:78;;9094:132;8874:359;;;;:::o;9239:509::-;9308:6;9357:2;9345:9;9336:7;9332:23;9328:32;9325:119;;;9363:79;;:::i;:::-;9325:119;9511:1;9500:9;9496:17;9483:31;9541:18;9533:6;9530:30;9527:117;;;9563:79;;:::i;:::-;9527:117;9668:63;9723:7;9714:6;9703:9;9699:22;9668:63;:::i;:::-;9658:73;;9454:287;9239:509;;;;:::o;9754:329::-;9813:6;9862:2;9850:9;9841:7;9837:23;9833:32;9830:119;;;9868:79;;:::i;:::-;9830:119;9988:1;10013:53;10058:7;10049:6;10038:9;10034:22;10013:53;:::i;:::-;10003:63;;9959:117;9754:329;;;;:::o;10089:::-;10148:6;10197:2;10185:9;10176:7;10172:23;10168:32;10165:119;;;10203:79;;:::i;:::-;10165:119;10323:1;10348:53;10393:7;10384:6;10373:9;10369:22;10348:53;:::i;:::-;10338:63;;10294:117;10089:329;;;;:::o;10424:351::-;10494:6;10543:2;10531:9;10522:7;10518:23;10514:32;10511:119;;;10549:79;;:::i;:::-;10511:119;10669:1;10694:64;10750:7;10741:6;10730:9;10726:22;10694:64;:::i;:::-;10684:74;;10640:128;10424:351;;;;:::o;10781:704::-;10876:6;10884;10892;10941:2;10929:9;10920:7;10916:23;10912:32;10909:119;;;10947:79;;:::i;:::-;10909:119;11067:1;11092:53;11137:7;11128:6;11117:9;11113:22;11092:53;:::i;:::-;11082:63;;11038:117;11222:2;11211:9;11207:18;11194:32;11253:18;11245:6;11242:30;11239:117;;;11275:79;;:::i;:::-;11239:117;11388:80;11460:7;11451:6;11440:9;11436:22;11388:80;:::i;:::-;11370:98;;;;11165:313;10781:704;;;;;:::o;11491:474::-;11559:6;11567;11616:2;11604:9;11595:7;11591:23;11587:32;11584:119;;;11622:79;;:::i;:::-;11584:119;11742:1;11767:53;11812:7;11803:6;11792:9;11788:22;11767:53;:::i;:::-;11757:63;;11713:117;11869:2;11895:53;11940:7;11931:6;11920:9;11916:22;11895:53;:::i;:::-;11885:63;;11840:118;11491:474;;;;;:::o;11971:118::-;12058:24;12076:5;12058:24;:::i;:::-;12053:3;12046:37;11971:118;;:::o;12095:157::-;12200:45;12220:24;12238:5;12220:24;:::i;:::-;12200:45;:::i;:::-;12195:3;12188:58;12095:157;;:::o;12258:109::-;12339:21;12354:5;12339:21;:::i;:::-;12334:3;12327:34;12258:109;;:::o;12373:118::-;12460:24;12478:5;12460:24;:::i;:::-;12455:3;12448:37;12373:118;;:::o;12497:360::-;12583:3;12611:38;12643:5;12611:38;:::i;:::-;12665:70;12728:6;12723:3;12665:70;:::i;:::-;12658:77;;12744:52;12789:6;12784:3;12777:4;12770:5;12766:16;12744:52;:::i;:::-;12821:29;12843:6;12821:29;:::i;:::-;12816:3;12812:39;12805:46;;12587:270;12497:360;;;;:::o;12863:373::-;12967:3;12995:38;13027:5;12995:38;:::i;:::-;13049:88;13130:6;13125:3;13049:88;:::i;:::-;13042:95;;13146:52;13191:6;13186:3;13179:4;13172:5;13168:16;13146:52;:::i;:::-;13223:6;13218:3;13214:16;13207:23;;12971:265;12863:373;;;;:::o;13242:157::-;13342:50;13386:5;13342:50;:::i;:::-;13337:3;13330:63;13242:157;;:::o;13405:364::-;13493:3;13521:39;13554:5;13521:39;:::i;:::-;13576:71;13640:6;13635:3;13576:71;:::i;:::-;13569:78;;13656:52;13701:6;13696:3;13689:4;13682:5;13678:16;13656:52;:::i;:::-;13733:29;13755:6;13733:29;:::i;:::-;13728:3;13724:39;13717:46;;13497:272;13405:364;;;;:::o;13775:377::-;13881:3;13909:39;13942:5;13909:39;:::i;:::-;13964:89;14046:6;14041:3;13964:89;:::i;:::-;13957:96;;14062:52;14107:6;14102:3;14095:4;14088:5;14084:16;14062:52;:::i;:::-;14139:6;14134:3;14130:16;14123:23;;13885:267;13775:377;;;;:::o;14158:366::-;14300:3;14321:67;14385:2;14380:3;14321:67;:::i;:::-;14314:74;;14397:93;14486:3;14397:93;:::i;:::-;14515:2;14510:3;14506:12;14499:19;;14158:366;;;:::o;14530:::-;14672:3;14693:67;14757:2;14752:3;14693:67;:::i;:::-;14686:74;;14769:93;14858:3;14769:93;:::i;:::-;14887:2;14882:3;14878:12;14871:19;;14530:366;;;:::o;14902:::-;15044:3;15065:67;15129:2;15124:3;15065:67;:::i;:::-;15058:74;;15141:93;15230:3;15141:93;:::i;:::-;15259:2;15254:3;15250:12;15243:19;;14902:366;;;:::o;15274:::-;15416:3;15437:67;15501:2;15496:3;15437:67;:::i;:::-;15430:74;;15513:93;15602:3;15513:93;:::i;:::-;15631:2;15626:3;15622:12;15615:19;;15274:366;;;:::o;15646:::-;15788:3;15809:67;15873:2;15868:3;15809:67;:::i;:::-;15802:74;;15885:93;15974:3;15885:93;:::i;:::-;16003:2;15998:3;15994:12;15987:19;;15646:366;;;:::o;16018:::-;16160:3;16181:67;16245:2;16240:3;16181:67;:::i;:::-;16174:74;;16257:93;16346:3;16257:93;:::i;:::-;16375:2;16370:3;16366:12;16359:19;;16018:366;;;:::o;16390:::-;16532:3;16553:67;16617:2;16612:3;16553:67;:::i;:::-;16546:74;;16629:93;16718:3;16629:93;:::i;:::-;16747:2;16742:3;16738:12;16731:19;;16390:366;;;:::o;16762:::-;16904:3;16925:67;16989:2;16984:3;16925:67;:::i;:::-;16918:74;;17001:93;17090:3;17001:93;:::i;:::-;17119:2;17114:3;17110:12;17103:19;;16762:366;;;:::o;17134:::-;17276:3;17297:67;17361:2;17356:3;17297:67;:::i;:::-;17290:74;;17373:93;17462:3;17373:93;:::i;:::-;17491:2;17486:3;17482:12;17475:19;;17134:366;;;:::o;17506:::-;17648:3;17669:67;17733:2;17728:3;17669:67;:::i;:::-;17662:74;;17745:93;17834:3;17745:93;:::i;:::-;17863:2;17858:3;17854:12;17847:19;;17506:366;;;:::o;17878:::-;18020:3;18041:67;18105:2;18100:3;18041:67;:::i;:::-;18034:74;;18117:93;18206:3;18117:93;:::i;:::-;18235:2;18230:3;18226:12;18219:19;;17878:366;;;:::o;18250:398::-;18409:3;18430:83;18511:1;18506:3;18430:83;:::i;:::-;18423:90;;18522:93;18611:3;18522:93;:::i;:::-;18640:1;18635:3;18631:11;18624:18;;18250:398;;;:::o;18654:366::-;18796:3;18817:67;18881:2;18876:3;18817:67;:::i;:::-;18810:74;;18893:93;18982:3;18893:93;:::i;:::-;19011:2;19006:3;19002:12;18995:19;;18654:366;;;:::o;19026:::-;19168:3;19189:67;19253:2;19248:3;19189:67;:::i;:::-;19182:74;;19265:93;19354:3;19265:93;:::i;:::-;19383:2;19378:3;19374:12;19367:19;;19026:366;;;:::o;19398:::-;19540:3;19561:67;19625:2;19620:3;19561:67;:::i;:::-;19554:74;;19637:93;19726:3;19637:93;:::i;:::-;19755:2;19750:3;19746:12;19739:19;;19398:366;;;:::o;19770:118::-;19857:24;19875:5;19857:24;:::i;:::-;19852:3;19845:37;19770:118;;:::o;19894:::-;19981:24;19999:5;19981:24;:::i;:::-;19976:3;19969:37;19894:118;;:::o;20018:115::-;20103:23;20120:5;20103:23;:::i;:::-;20098:3;20091:36;20018:115;;:::o;20139:256::-;20251:3;20266:75;20337:3;20328:6;20266:75;:::i;:::-;20366:2;20361:3;20357:12;20350:19;;20386:3;20379:10;;20139:256;;;;:::o;20401:271::-;20531:3;20553:93;20642:3;20633:6;20553:93;:::i;:::-;20546:100;;20663:3;20656:10;;20401:271;;;;:::o;20678:435::-;20858:3;20880:95;20971:3;20962:6;20880:95;:::i;:::-;20873:102;;20992:95;21083:3;21074:6;20992:95;:::i;:::-;20985:102;;21104:3;21097:10;;20678:435;;;;;:::o;21119:379::-;21303:3;21325:147;21468:3;21325:147;:::i;:::-;21318:154;;21489:3;21482:10;;21119:379;;;:::o;21504:222::-;21597:4;21635:2;21624:9;21620:18;21612:26;;21648:71;21716:1;21705:9;21701:17;21692:6;21648:71;:::i;:::-;21504:222;;;;:::o;21732:640::-;21927:4;21965:3;21954:9;21950:19;21942:27;;21979:71;22047:1;22036:9;22032:17;22023:6;21979:71;:::i;:::-;22060:72;22128:2;22117:9;22113:18;22104:6;22060:72;:::i;:::-;22142;22210:2;22199:9;22195:18;22186:6;22142:72;:::i;:::-;22261:9;22255:4;22251:20;22246:2;22235:9;22231:18;22224:48;22289:76;22360:4;22351:6;22289:76;:::i;:::-;22281:84;;21732:640;;;;;;;:::o;22378:332::-;22499:4;22537:2;22526:9;22522:18;22514:26;;22550:71;22618:1;22607:9;22603:17;22594:6;22550:71;:::i;:::-;22631:72;22699:2;22688:9;22684:18;22675:6;22631:72;:::i;:::-;22378:332;;;;;:::o;22716:210::-;22803:4;22841:2;22830:9;22826:18;22818:26;;22854:65;22916:1;22905:9;22901:17;22892:6;22854:65;:::i;:::-;22716:210;;;;:::o;22932:222::-;23025:4;23063:2;23052:9;23048:18;23040:26;;23076:71;23144:1;23133:9;23129:17;23120:6;23076:71;:::i;:::-;22932:222;;;;:::o;23160:248::-;23266:4;23304:2;23293:9;23289:18;23281:26;;23317:84;23398:1;23387:9;23383:17;23374:6;23317:84;:::i;:::-;23160:248;;;;:::o;23414:313::-;23527:4;23565:2;23554:9;23550:18;23542:26;;23614:9;23608:4;23604:20;23600:1;23589:9;23585:17;23578:47;23642:78;23715:4;23706:6;23642:78;:::i;:::-;23634:86;;23414:313;;;;:::o;23733:419::-;23899:4;23937:2;23926:9;23922:18;23914:26;;23986:9;23980:4;23976:20;23972:1;23961:9;23957:17;23950:47;24014:131;24140:4;24014:131;:::i;:::-;24006:139;;23733:419;;;:::o;24158:::-;24324:4;24362:2;24351:9;24347:18;24339:26;;24411:9;24405:4;24401:20;24397:1;24386:9;24382:17;24375:47;24439:131;24565:4;24439:131;:::i;:::-;24431:139;;24158:419;;;:::o;24583:::-;24749:4;24787:2;24776:9;24772:18;24764:26;;24836:9;24830:4;24826:20;24822:1;24811:9;24807:17;24800:47;24864:131;24990:4;24864:131;:::i;:::-;24856:139;;24583:419;;;:::o;25008:::-;25174:4;25212:2;25201:9;25197:18;25189:26;;25261:9;25255:4;25251:20;25247:1;25236:9;25232:17;25225:47;25289:131;25415:4;25289:131;:::i;:::-;25281:139;;25008:419;;;:::o;25433:::-;25599:4;25637:2;25626:9;25622:18;25614:26;;25686:9;25680:4;25676:20;25672:1;25661:9;25657:17;25650:47;25714:131;25840:4;25714:131;:::i;:::-;25706:139;;25433:419;;;:::o;25858:::-;26024:4;26062:2;26051:9;26047:18;26039:26;;26111:9;26105:4;26101:20;26097:1;26086:9;26082:17;26075:47;26139:131;26265:4;26139:131;:::i;:::-;26131:139;;25858:419;;;:::o;26283:::-;26449:4;26487:2;26476:9;26472:18;26464:26;;26536:9;26530:4;26526:20;26522:1;26511:9;26507:17;26500:47;26564:131;26690:4;26564:131;:::i;:::-;26556:139;;26283:419;;;:::o;26708:::-;26874:4;26912:2;26901:9;26897:18;26889:26;;26961:9;26955:4;26951:20;26947:1;26936:9;26932:17;26925:47;26989:131;27115:4;26989:131;:::i;:::-;26981:139;;26708:419;;;:::o;27133:::-;27299:4;27337:2;27326:9;27322:18;27314:26;;27386:9;27380:4;27376:20;27372:1;27361:9;27357:17;27350:47;27414:131;27540:4;27414:131;:::i;:::-;27406:139;;27133:419;;;:::o;27558:::-;27724:4;27762:2;27751:9;27747:18;27739:26;;27811:9;27805:4;27801:20;27797:1;27786:9;27782:17;27775:47;27839:131;27965:4;27839:131;:::i;:::-;27831:139;;27558:419;;;:::o;27983:::-;28149:4;28187:2;28176:9;28172:18;28164:26;;28236:9;28230:4;28226:20;28222:1;28211:9;28207:17;28200:47;28264:131;28390:4;28264:131;:::i;:::-;28256:139;;27983:419;;;:::o;28408:::-;28574:4;28612:2;28601:9;28597:18;28589:26;;28661:9;28655:4;28651:20;28647:1;28636:9;28632:17;28625:47;28689:131;28815:4;28689:131;:::i;:::-;28681:139;;28408:419;;;:::o;28833:::-;28999:4;29037:2;29026:9;29022:18;29014:26;;29086:9;29080:4;29076:20;29072:1;29061:9;29057:17;29050:47;29114:131;29240:4;29114:131;:::i;:::-;29106:139;;28833:419;;;:::o;29258:::-;29424:4;29462:2;29451:9;29447:18;29439:26;;29511:9;29505:4;29501:20;29497:1;29486:9;29482:17;29475:47;29539:131;29665:4;29539:131;:::i;:::-;29531:139;;29258:419;;;:::o;29683:222::-;29776:4;29814:2;29803:9;29799:18;29791:26;;29827:71;29895:1;29884:9;29880:17;29871:6;29827:71;:::i;:::-;29683:222;;;;:::o;29911:::-;30004:4;30042:2;30031:9;30027:18;30019:26;;30055:71;30123:1;30112:9;30108:17;30099:6;30055:71;:::i;:::-;29911:222;;;;:::o;30139:218::-;30230:4;30268:2;30257:9;30253:18;30245:26;;30281:69;30347:1;30336:9;30332:17;30323:6;30281:69;:::i;:::-;30139:218;;;;:::o;30363:129::-;30397:6;30424:20;;:::i;:::-;30414:30;;30453:33;30481:4;30473:6;30453:33;:::i;:::-;30363:129;;;:::o;30498:75::-;30531:6;30564:2;30558:9;30548:19;;30498:75;:::o;30579:307::-;30640:4;30730:18;30722:6;30719:30;30716:56;;;30752:18;;:::i;:::-;30716:56;30790:29;30812:6;30790:29;:::i;:::-;30782:37;;30874:4;30868;30864:15;30856:23;;30579:307;;;:::o;30892:308::-;30954:4;31044:18;31036:6;31033:30;31030:56;;;31066:18;;:::i;:::-;31030:56;31104:29;31126:6;31104:29;:::i;:::-;31096:37;;31188:4;31182;31178:15;31170:23;;30892:308;;;:::o;31206:98::-;31257:6;31291:5;31285:12;31275:22;;31206:98;;;:::o;31310:99::-;31362:6;31396:5;31390:12;31380:22;;31310:99;;;:::o;31415:168::-;31498:11;31532:6;31527:3;31520:19;31572:4;31567:3;31563:14;31548:29;;31415:168;;;;:::o;31589:147::-;31690:11;31727:3;31712:18;;31589:147;;;;:::o;31742:169::-;31826:11;31860:6;31855:3;31848:19;31900:4;31895:3;31891:14;31876:29;;31742:169;;;;:::o;31917:148::-;32019:11;32056:3;32041:18;;31917:148;;;;:::o;32071:305::-;32111:3;32130:20;32148:1;32130:20;:::i;:::-;32125:25;;32164:20;32182:1;32164:20;:::i;:::-;32159:25;;32318:1;32250:66;32246:74;32243:1;32240:81;32237:107;;;32324:18;;:::i;:::-;32237:107;32368:1;32365;32361:9;32354:16;;32071:305;;;;:::o;32382:185::-;32422:1;32439:20;32457:1;32439:20;:::i;:::-;32434:25;;32473:20;32491:1;32473:20;:::i;:::-;32468:25;;32512:1;32502:35;;32517:18;;:::i;:::-;32502:35;32559:1;32556;32552:9;32547:14;;32382:185;;;;:::o;32573:348::-;32613:7;32636:20;32654:1;32636:20;:::i;:::-;32631:25;;32670:20;32688:1;32670:20;:::i;:::-;32665:25;;32858:1;32790:66;32786:74;32783:1;32780:81;32775:1;32768:9;32761:17;32757:105;32754:131;;;32865:18;;:::i;:::-;32754:131;32913:1;32910;32906:9;32895:20;;32573:348;;;;:::o;32927:191::-;32967:4;32987:20;33005:1;32987:20;:::i;:::-;32982:25;;33021:20;33039:1;33021:20;:::i;:::-;33016:25;;33060:1;33057;33054:8;33051:34;;;33065:18;;:::i;:::-;33051:34;33110:1;33107;33103:9;33095:17;;32927:191;;;;:::o;33124:96::-;33161:7;33190:24;33208:5;33190:24;:::i;:::-;33179:35;;33124:96;;;:::o;33226:90::-;33260:7;33303:5;33296:13;33289:21;33278:32;;33226:90;;;:::o;33322:77::-;33359:7;33388:5;33377:16;;33322:77;;;:::o;33405:149::-;33441:7;33481:66;33474:5;33470:78;33459:89;;33405:149;;;:::o;33560:109::-;33610:7;33639:24;33657:5;33639:24;:::i;:::-;33628:35;;33560:109;;;:::o;33675:141::-;33727:7;33756:5;33745:16;;33762:48;33804:5;33762:48;:::i;:::-;33675:141;;;:::o;33822:118::-;33859:7;33899:34;33892:5;33888:46;33877:57;;33822:118;;;:::o;33946:126::-;33983:7;34023:42;34016:5;34012:54;34001:65;;33946:126;;;:::o;34078:77::-;34115:7;34144:5;34133:16;;34078:77;;;:::o;34161:101::-;34197:7;34237:18;34230:5;34226:30;34215:41;;34161:101;;;:::o;34268:141::-;34331:9;34364:39;34397:5;34364:39;:::i;:::-;34351:52;;34268:141;;;:::o;34415:154::-;34499:6;34494:3;34489;34476:30;34561:1;34552:6;34547:3;34543:16;34536:27;34415:154;;;:::o;34575:307::-;34643:1;34653:113;34667:6;34664:1;34661:13;34653:113;;;34752:1;34747:3;34743:11;34737:18;34733:1;34728:3;34724:11;34717:39;34689:2;34686:1;34682:10;34677:15;;34653:113;;;34784:6;34781:1;34778:13;34775:101;;;34864:1;34855:6;34850:3;34846:16;34839:27;34775:101;34624:258;34575:307;;;:::o;34888:320::-;34932:6;34969:1;34963:4;34959:12;34949:22;;35016:1;35010:4;35006:12;35037:18;35027:81;;35093:4;35085:6;35081:17;35071:27;;35027:81;35155:2;35147:6;35144:14;35124:18;35121:38;35118:84;;;35174:18;;:::i;:::-;35118:84;34939:269;34888:320;;;:::o;35214:281::-;35297:27;35319:4;35297:27;:::i;:::-;35289:6;35285:40;35427:6;35415:10;35412:22;35391:18;35379:10;35376:34;35373:62;35370:88;;;35438:18;;:::i;:::-;35370:88;35478:10;35474:2;35467:22;35257:238;35214:281;;:::o;35501:233::-;35540:3;35563:24;35581:5;35563:24;:::i;:::-;35554:33;;35609:66;35602:5;35599:77;35596:103;;;35679:18;;:::i;:::-;35596:103;35726:1;35719:5;35715:13;35708:20;;35501:233;;;:::o;35740:100::-;35779:7;35808:26;35828:5;35808:26;:::i;:::-;35797:37;;35740:100;;;:::o;35846:94::-;35885:7;35914:20;35928:5;35914:20;:::i;:::-;35903:31;;35846:94;;;:::o;35946:176::-;35978:1;35995:20;36013:1;35995:20;:::i;:::-;35990:25;;36029:20;36047:1;36029:20;:::i;:::-;36024:25;;36068:1;36058:35;;36073:18;;:::i;:::-;36058:35;36114:1;36111;36107:9;36102:14;;35946:176;;;;:::o;36128:180::-;36176:77;36173:1;36166:88;36273:4;36270:1;36263:15;36297:4;36294:1;36287:15;36314:180;36362:77;36359:1;36352:88;36459:4;36456:1;36449:15;36483:4;36480:1;36473:15;36500:180;36548:77;36545:1;36538:88;36645:4;36642:1;36635:15;36669:4;36666:1;36659:15;36686:180;36734:77;36731:1;36724:88;36831:4;36828:1;36821:15;36855:4;36852:1;36845:15;36872:180;36920:77;36917:1;36910:88;37017:4;37014:1;37007:15;37041:4;37038:1;37031:15;37058:180;37106:77;37103:1;37096:88;37203:4;37200:1;37193:15;37227:4;37224:1;37217:15;37244:117;37353:1;37350;37343:12;37367:117;37476:1;37473;37466:12;37490:117;37599:1;37596;37589:12;37613:117;37722:1;37719;37712:12;37736:117;37845:1;37842;37835:12;37859:117;37968:1;37965;37958:12;37982:102;38023:6;38074:2;38070:7;38065:2;38058:5;38054:14;38050:28;38040:38;;37982:102;;;:::o;38090:94::-;38123:8;38171:5;38167:2;38163:14;38142:35;;38090:94;;;:::o;38190:167::-;38330:19;38326:1;38318:6;38314:14;38307:43;38190:167;:::o;38363:176::-;38503:28;38499:1;38491:6;38487:14;38480:52;38363:176;:::o;38545:225::-;38685:34;38681:1;38673:6;38669:14;38662:58;38754:8;38749:2;38741:6;38737:15;38730:33;38545:225;:::o;38776:169::-;38916:21;38912:1;38904:6;38900:14;38893:45;38776:169;:::o;38951:168::-;39091:20;39087:1;39079:6;39075:14;39068:44;38951:168;:::o;39125:225::-;39265:34;39261:1;39253:6;39249:14;39242:58;39334:8;39329:2;39321:6;39317:15;39310:33;39125:225;:::o;39356:165::-;39496:17;39492:1;39484:6;39480:14;39473:41;39356:165;:::o;39527:169::-;39667:21;39663:1;39655:6;39651:14;39644:45;39527:169;:::o;39702:164::-;39842:16;39838:1;39830:6;39826:14;39819:40;39702:164;:::o;39872:182::-;40012:34;40008:1;40000:6;39996:14;39989:58;39872:182;:::o;40060:171::-;40200:23;40196:1;40188:6;40184:14;40177:47;40060:171;:::o;40237:114::-;;:::o;40357:179::-;40497:31;40493:1;40485:6;40481:14;40474:55;40357:179;:::o;40542:229::-;40682:34;40678:1;40670:6;40666:14;40659:58;40751:12;40746:2;40738:6;40734:15;40727:37;40542:229;:::o;40777:181::-;40917:33;40913:1;40905:6;40901:14;40894:57;40777:181;:::o;40964:120::-;41052:1;41045:5;41042:12;41032:46;;41058:18;;:::i;:::-;41032:46;40964:120;:::o;41090:122::-;41163:24;41181:5;41163:24;:::i;:::-;41156:5;41153:35;41143:63;;41202:1;41199;41192:12;41143:63;41090:122;:::o;41218:116::-;41288:21;41303:5;41288:21;:::i;:::-;41281:5;41278:32;41268:60;;41324:1;41321;41314:12;41268:60;41218:116;:::o;41340:122::-;41413:24;41431:5;41413:24;:::i;:::-;41406:5;41403:35;41393:63;;41452:1;41449;41442:12;41393:63;41340:122;:::o;41468:120::-;41540:23;41557:5;41540:23;:::i;:::-;41533:5;41530:34;41520:62;;41578:1;41575;41568:12;41520:62;41468:120;:::o;41594:148::-;41680:37;41711:5;41680:37;:::i;:::-;41673:5;41670:48;41660:76;;41732:1;41729;41722:12;41660:76;41594:148;:::o;41748:114::-;41836:1;41829:5;41826:12;41816:40;;41852:1;41849;41842:12;41816:40;41748:114;:::o;41868:122::-;41941:24;41959:5;41941:24;:::i;:::-;41934:5;41931:35;41921:63;;41980:1;41977;41970:12;41921:63;41868:122;:::o;41996:::-;42069:24;42087:5;42069:24;:::i;:::-;42062:5;42059:35;42049:63;;42108:1;42105;42098:12;42049:63;41996:122;:::o

Swarm Source

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