ETH Price: $2,407.35 (+1.02%)

Token

Revolue (REV)
 

Overview

Max Total Supply

123 REV

Holders

82

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 REV
0xd5f0b573051f40977ac6574e2c16ef2f01d59af0
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Revolue

Compiler Version
v0.8.3+commit.8d00100c

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

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

/**
 *Submitted for verification at Etherscan.io
*/

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/contracts/access/Ownable.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;
    }
}


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

// File: @openzeppelin/contracts/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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/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

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

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

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

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

pragma solidity ^0.8.0;



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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

        return super.tokenURI(tokenId);
    }

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

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

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

//SPDX-License-Identifier: GPL-3.0-or-later
pragma solidity 0.8.3;

contract SodaPassNFT is ERC721, ERC721Enumerable,ERC721URIStorage, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint16 public constant maxSupply = 5100;
    string private _baseTokenURI;
    
    uint256 public _startDate = 1634850000000;
    uint256 public _whitelistStartDate = 1634677200000;
    
    mapping (address => bool) private _whitelisted;

    constructor() ERC721("Soda Pass", "SODA") {
         for (uint8 i = 0; i < 100; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function setStartDate(uint256 startDate) public onlyOwner {
        _startDate = startDate;
    }
    
    function setWhitelistStartDate(uint256 whitelistStartDate) public onlyOwner {
        _whitelistStartDate = whitelistStartDate;
    }

    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }
    
    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }


    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

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

    // Get minting limit (for a single transaction) based on current token supply
    function getCurrentMintLimit() public view returns (uint8) {
        return block.timestamp >= _startDate ? 20 : 4;
    }

    // Get ether price based on current token supply
    function getCurrentPrice() public pure returns (uint64) {
        return 100_000_000_000_000_000;
    }
    
    function addUserToWhitelist(address wallet) public onlyOwner {
        _whitelisted[wallet] = true;
    }
    
    function removeUserFromWhitelist(address wallet) public onlyOwner {
        _whitelisted[wallet] = false;
    }
    
    // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        require(_startDate <= block.timestamp || (block.timestamp >= _whitelistStartDate && _whitelisted[msg.sender] == true), block.timestamp <= _whitelistStartDate ? "Sale is not open" : "Not whitelisted");
        require(_quantityToMint >= 1, "Must mint at least 1");
        require(block.timestamp >= _whitelistStartDate && block.timestamp <= _startDate ? (_quantityToMint + balanceOf(msg.sender) <= 4) : true, "Whitelisted mints are limited to 4 per wallet");
        require(
            _quantityToMint <= getCurrentMintLimit(),
            "Maximum current buy limit for individual transaction exceeded"
        );
        require(
            (_quantityToMint + totalSupply()) <= maxSupply,
            "Exceeds maximum supply"
        );
        require(
            msg.value == (getCurrentPrice() * _quantityToMint),
            "Ether submitted does not match current price"
        );

        for (uint8 i = 0; i < _quantityToMint; i++) {
            _tokenIds.increment();

            uint256 newItemId = _tokenIds.current();
            _mint(msg.sender, newItemId);
        }
    }
    
    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        
        uint256 _balance = address(this).balance;
        address _coldWallet = 0x9781F65af8324b40Ee9Ca421ea963642Bc8a8C2b;
        payable(_coldWallet).transfer((_balance * 9)/10);
        
        address _devWallet = 0x3097617CbA85A26AdC214A1F87B680bE4b275cD0;
        payable(_devWallet).transfer((_balance * 1)/10);
    }
}

pragma solidity 0.8.3;

contract Revolue is ERC721, Ownable {
   using Counters for Counters.Counter;
    Counters.Counter public _tokenIds;
    
    uint16 public constant maxSupply = 1030;
    string private _baseTokenURI;
    
    uint256 public _startDate; // start 
    uint256 public _next48hour = 86400;
    uint256 public _next24hour = 86400;           // 86400 24 hour
    
    uint256 public _privateSalePrice =  6E16;   // 6E16 0.06 ETH per NFT
    uint256 public _publicSalePrice =  7E16;   //7E16 0.07 ETH per NFT
    bool public sale_started = false;
    event ReturnEvent(uint _amount);
    
    SodaPassNFT  soda_contract;
    
    address sodaContract = 0x3b553Fc51A63298E2E44d8ecd3b1ea01d22cA459; //mainnet
        
    mapping(uint256 => bool) public _tokenIDused;
    uint[] public idTOKENs ;


    constructor() ERC721("Revolue", "REV") {
        soda_contract = SodaPassNFT(sodaContract);
        for (uint8 i = 0; i < 30; i++) {
                    _tokenIds.increment();
                    uint256 newItemId = _tokenIds.current();
                    _mint(msg.sender, newItemId);
                }
    }
    
    function StartSale() public onlyOwner{
        _startDate = block.timestamp;
        sale_started = true;
    }

    function setIdtrue(uint256 _id) private {
        _tokenIDused[_id] = true;

    }

    function getIdtrue(uint256 _id) public view returns (bool val){
        return _tokenIDused[_id];
    }
    
    function StopSale() public onlyOwner{
        sale_started = false;
    }
    
    function getSodaPassBalance(address _zz) public view returns (uint256 balance) {
       return soda_contract.balanceOf(_zz);
    }
    
     function getnow() public view returns (uint256) {
       return block.timestamp;
    }
    
    function setStartDate(uint256 startDate) public onlyOwner {
        _startDate = startDate;
    }
    
    function setPrivateSalePrice(uint256 privateSalePrice) public onlyOwner {
        _privateSalePrice = privateSalePrice;
    }
    
    function setPublicSalePrice(uint256 publicSalePrice) public onlyOwner {
        _publicSalePrice = publicSalePrice;
    }

    function setBaseURI(string memory _newbaseTokenURI) public onlyOwner {
        _baseTokenURI = _newbaseTokenURI;
    }

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

    function getsodaPassTokenID(address owner,uint256 _index) public view returns (uint256 tokenID){
        return soda_contract.tokenOfOwnerByIndex(owner,_index);
    }


    function totalSupply() public view returns(uint256){
       return _tokenIds.current();
    }
    
     // Mint new token(s)
    function mint(uint8 _quantityToMint) public payable {
        
        delete idTOKENs;

       require(_quantityToMint <= 10, 'can mint only 10 max at a time');
       require((_quantityToMint + totalSupply()) <= maxSupply,"Exceeds maximum supply");
       require(sale_started == true,"Sale Not Started");
       
              // for next 24 hours after presale started by owner
        if(block.timestamp <= (_startDate + _next48hour))
        {
            require(getSodaPassBalance(msg.sender) > 0 , "Needs to have SodaPass");
            require(msg.value == (_privateSalePrice * _quantityToMint),"Ether submitted does not match current price 0.06 ETH per token");

        for(uint256 j = 0; j < getSodaPassBalance(msg.sender); j++){
                
                uint256 tokenID = getsodaPassTokenID(msg.sender,j);
                        if(_tokenIDused[tokenID] !=true){
                             idTOKENs.push(j);
                        }
                        if(idTOKENs.length == _quantityToMint)
                        {
                            break;
                        }             
                }
                 require(idTOKENs.length == _quantityToMint, "Soda pass used");
                 {
                for(uint8 j = 0; j < idTOKENs.length; j++){
                uint256 tokenID = getsodaPassTokenID(msg.sender,idTOKENs[j]);

                    setIdtrue(tokenID);
                    _tokenIds.increment();
                    uint256 newItemId = _tokenIds.current();
                    emit ReturnEvent(newItemId);
                    _mint(msg.sender, newItemId);
                }
                }    
        }
        if(block.timestamp > (_startDate + _next48hour) && block.timestamp <= (_startDate + _next48hour + _next24hour)){
            require(getSodaPassBalance(msg.sender) > 0 , "Needs to have SodaPass");
            require(msg.value == (_privateSalePrice * _quantityToMint),"Ether submitted does not match current price 0.06 ETH per token");
             for (uint8 i = 0; i < _quantityToMint; i++) {
              _tokenIds.increment();
              uint256 newItemId = _tokenIds.current();
              emit ReturnEvent(newItemId);
              _mint(msg.sender, newItemId);
          }
         }
        if(block.timestamp > (_startDate + _next48hour + _next24hour)) {

            if(getSodaPassBalance(msg.sender) > 0){

              require(msg.value == (_privateSalePrice * _quantityToMint),"Ether submitted does not match current price 0.06 ETH per token");
              for (uint8 i = 0; i < _quantityToMint; i++) {
              _tokenIds.increment();
              uint256 newItemId = _tokenIds.current();
              emit ReturnEvent(newItemId);
              _mint(msg.sender, newItemId);
                }

            }
            else{

             require(msg.value == (_publicSalePrice * _quantityToMint),"Ether submitted does not match current price 0.07 ETH per token");
             for (uint8 i = 0; i < _quantityToMint; i++) {
             _tokenIds.increment();
             uint256 newItemId = _tokenIds.current();
             emit ReturnEvent(newItemId);
             _mint(msg.sender, newItemId);
             }
            }
         }

    }

    function getidtokenlength() public view returns(uint256)
    {
        return idTOKENs.length;
    }

    function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 1;
        uint256 ownedTokenIndex = 0;

        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
        address currentTokenOwner = ownerOf(currentTokenId);

        if (currentTokenOwner == _owner) {
            ownedTokenIds[ownedTokenIndex] = currentTokenId;

            ownedTokenIndex++;
        }

        currentTokenId++;
        }

        return ownedTokenIds;
    }

    // Withdraw ether from contract
    function withdraw() public onlyOwner {
        require(address(this).balance > 0, "Balance must be positive");
        
        uint256 _balance = address(this).balance;
        address _coldWallet = 0x20E087c55c6C15260987EF59738468511a9948C1;
        payable(_coldWallet).transfer((_balance * 6)/10);   // 60%
        
        address _devWallet = 0xF0467B3Fc5736FB5D5e852d001248B4277a7c089;
        payable(_devWallet).transfer((_balance * 3)/10);    // 30%
        
        address _devWallet2 = 0x3097617CbA85A26AdC214A1F87B680bE4b275cD0;
        payable(_devWallet2).transfer((_balance * 1)/10);   // 10%

    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReturnEvent","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":"StartSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"StopSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"_next24hour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_next48hour","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_privateSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_publicSalePrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_startDate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"_tokenIDused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_tokenIds","outputs":[{"internalType":"uint256","name":"_value","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"getIdtrue","outputs":[{"internalType":"bool","name":"val","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_zz","type":"address"}],"name":"getSodaPassBalance","outputs":[{"internalType":"uint256","name":"balance","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getidtokenlength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getnow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getsodaPassTokenID","outputs":[{"internalType":"uint256","name":"tokenID","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"idTOKENs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_quantityToMint","type":"uint8"}],"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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sale_started","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newbaseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"privateSalePrice","type":"uint256"}],"name":"setPrivateSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"publicSalePrice","type":"uint256"}],"name":"setPublicSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"startDate","type":"uint256"}],"name":"setStartDate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405262015180600a5562015180600b5566d529ae9e860000600c5566f8b0a10e470000600d556000600e60006101000a81548160ff021916908315150217905550733b553fc51a63298e2e44d8ecd3b1ea01d22ca459600f60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000a557600080fd5b506040518060400160405280600781526020017f5265766f6c7565000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f524556000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200012a92919062000584565b5080600190805190602001906200014392919062000584565b505050620001666200015a6200023b60201b60201c565b6200024360201b60201c565b600f60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600e60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060005b601e8160ff1610156200023457620001f060076200030960201b620023de1760201c565b60006200020960076200031f60201b620023f41760201c565b90506200021d33826200032d60201b60201c565b5080806200022b9062000781565b915050620001cc565b5062000860565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620003a0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039790620006a4565b60405180910390fd5b620003b1816200051360201b60201c565b15620003f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003eb9062000682565b60405180910390fd5b62000408600083836200057f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200045a9190620006d7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b505050565b82805462000592906200074b565b90600052602060002090601f016020900481019282620005b6576000855562000602565b82601f10620005d157805160ff191683800117855562000602565b8280016001018555821562000602579182015b8281111562000601578251825591602001919060010190620005e4565b5b50905062000611919062000615565b5090565b5b808211156200063057600081600090555060010162000616565b5090565b600062000643601c83620006c6565b915062000650826200080e565b602082019050919050565b60006200066a602083620006c6565b9150620006778262000837565b602082019050919050565b600060208201905081810360008301526200069d8162000634565b9050919050565b60006020820190508181036000830152620006bf816200065b565b9050919050565b600082825260208201905092915050565b6000620006e48262000734565b9150620006f18362000734565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620007295762000728620007b0565b5b828201905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200076457607f821691505b602082108114156200077b576200077a620007df565b5b50919050565b60006200078e826200073e565b915060ff821415620007a557620007a4620007b0565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b61490380620008706000396000f3fe6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461084b578063d5abeb0114610888578063d60dfeeb146108b3578063e985e9c5146108f0578063f2fde38b1461092d578063f60dd7e31461095657610246565b8063a22cb46514610766578063aa46a4001461078f578063ac8daba0146107ba578063b86e94a6146107e5578063b88d4fde1461082257610246565b806382d95df5116100fd57806382d95df51461067f578063881cf122146106a85780638da5cb5b146106d35780639052eaaf146106fe57806395d89b411461073b57610246565b806370a08231146105c2578063715018a6146105ff578063791a2519146106165780637944875b1461063f5780637bc36e041461065657610246565b80632a0d65d6116101c7578063438b63001161018b578063438b6300146104d857806355f804b3146105155780635abc96221461053e5780636352211e146105695780636ecd2306146105a657610246565b80632a0d65d614610405578063318aed89146104305780633a517e0b1461046d5780633ccfd60b1461049857806342842e0e146104af57610246565b806318160ddd1161020e57806318160ddd14610330578063190445e11461035b5780631f5065021461038657806323b872dd146103b157806326d89e70146103da57610246565b806301ffc9a71461024b57806303225f4c1461028857806306fdde031461029f578063081812fc146102ca578063095ea7b314610307575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906133ae565b610993565b60405161027f9190613a3e565b60405180910390f35b34801561029457600080fd5b5061029d610a75565b005b3480156102ab57600080fd5b506102b4610b15565b6040516102c19190613a59565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613441565b610ba7565b6040516102fe919061398c565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613372565b610c2c565b005b34801561033c57600080fd5b50610345610d44565b6040516103529190613d96565b60405180910390f35b34801561036757600080fd5b50610370610d55565b60405161037d9190613d96565b60405180910390f35b34801561039257600080fd5b5061039b610d5b565b6040516103a89190613d96565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d3919061326c565b610d61565b005b3480156103e657600080fd5b506103ef610dc1565b6040516103fc9190613d96565b60405180910390f35b34801561041157600080fd5b5061041a610dc7565b6040516104279190613d96565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613207565b610dcd565b6040516104649190613d96565b60405180910390f35b34801561047957600080fd5b50610482610e81565b60405161048f9190613d96565b60405180910390f35b3480156104a457600080fd5b506104ad610e8e565b005b3480156104bb57600080fd5b506104d660048036038101906104d1919061326c565b6110c0565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613207565b6110e0565b60405161050c9190613a1c565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190613400565b61123b565b005b34801561054a57600080fd5b506105536112d1565b6040516105609190613a3e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613441565b6112e4565b60405161059d919061398c565b60405180910390f35b6105c060048036038101906105bb9190613493565b611396565b005b3480156105ce57600080fd5b506105e960048036038101906105e49190613207565b611a5c565b6040516105f69190613d96565b60405180910390f35b34801561060b57600080fd5b50610614611b14565b005b34801561062257600080fd5b5061063d60048036038101906106389190613441565b611b9c565b005b34801561064b57600080fd5b50610654611c22565b005b34801561066257600080fd5b5061067d60048036038101906106789190613441565b611cbb565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613441565b611d41565b005b3480156106b457600080fd5b506106bd611dc7565b6040516106ca9190613d96565b60405180910390f35b3480156106df57600080fd5b506106e8611dcf565b6040516106f5919061398c565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613441565b611df9565b6040516107329190613d96565b60405180910390f35b34801561074757600080fd5b50610750611e1d565b60405161075d9190613a59565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613336565b611eaf565b005b34801561079b57600080fd5b506107a4612030565b6040516107b19190613d96565b60405180910390f35b3480156107c657600080fd5b506107cf61203c565b6040516107dc9190613d96565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613441565b612042565b6040516108199190613a3e565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906132bb565b61206c565b005b34801561085757600080fd5b50610872600480360381019061086d9190613441565b6120ce565b60405161087f9190613a59565b60405180910390f35b34801561089457600080fd5b5061089d612175565b6040516108aa9190613d7b565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613441565b61217b565b6040516108e79190613a3e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613230565b61219b565b6040516109249190613a3e565b60405180910390f35b34801561093957600080fd5b50610954600480360381019061094f9190613207565b61222f565b005b34801561096257600080fd5b5061097d60048036038101906109789190613372565b612327565b60405161098a9190613d96565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a6e5750610a6d82612402565b5b9050919050565b610a7d61246c565b73ffffffffffffffffffffffffffffffffffffffff16610a9b611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613c9b565b60405180910390fd5b426009819055506001600e60006101000a81548160ff021916908315150217905550565b606060008054610b249061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b509061409a565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb282612474565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613c7b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c37826112e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90613cfb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc761246c565b73ffffffffffffffffffffffffffffffffffffffff161480610cf65750610cf581610cf061246c565b61219b565b5b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613bdb565b60405180910390fd5b610d3f83836124e0565b505050565b6000610d5060076123f4565b905090565b600d5481565b600b5481565b610d72610d6c61246c565b82612599565b610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890613d3b565b60405180910390fd5b610dbc838383612677565b505050565b600c5481565b600a5481565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610e2a919061398c565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7a919061346a565b9050919050565b6000601180549050905090565b610e9661246c565b73ffffffffffffffffffffffffffffffffffffffff16610eb4611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190613c9b565b60405180910390fd5b60004711610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490613b1b565b60405180910390fd5b600047905060007320e087c55c6c15260987ef59738468511a9948c190508073ffffffffffffffffffffffffffffffffffffffff166108fc600a600685610f949190613f3b565b610f9e9190613f0a565b9081150290604051600060405180830381858888f19350505050158015610fc9573d6000803e3d6000fd5b50600073f0467b3fc5736fb5d5e852d001248b4277a7c08990508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60038661100c9190613f3b565b6110169190613f0a565b9081150290604051600060405180830381858888f19350505050158015611041573d6000803e3d6000fd5b506000733097617cba85a26adc214a1f87b680be4b275cd090508073ffffffffffffffffffffffffffffffffffffffff166108fc600a6001876110849190613f3b565b61108e9190613f0a565b9081150290604051600060405180830381858888f193505050501580156110b9573d6000803e3d6000fd5b5050505050565b6110db8383836040518060200160405280600081525061206c565b505050565b606060006110ed83611a5c565b905060008167ffffffffffffffff811115611131577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561115f5781602001602082028036833780820191505090505b50905060006001905060005b8381108015611180575061040661ffff168211155b1561122f576000611190836112e4565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121b5782848381518110611200577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508180611217906140fd565b9250505b8280611226906140fd565b9350505061116b565b82945050505050919050565b61124361246c565b73ffffffffffffffffffffffffffffffffffffffff16611261611dcf565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613c9b565b60405180910390fd5b80600890805190602001906112cd929190612fe0565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490613c1b565b60405180910390fd5b80915050919050565b601160006113a49190613066565b600a8160ff1611156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290613a9b565b60405180910390fd5b61040661ffff166113fa610d44565b8260ff166114089190613eb4565b1115611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090613d1b565b60405180910390fd5b60011515600e60009054906101000a900460ff1615151461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613c5b565b60405180910390fd5b600a546009546114af9190613eb4565b421161171f5760006114c033610dcd565b11611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613b7b565b60405180910390fd5b8060ff16600c546115119190613f3b565b3414611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613d5b565b60405180910390fd5b60005b61155e33610dcd565b8110156115f35760006115713383612327565b9050600115156010600083815260200190815260200160002060009054906101000a900460ff161515146115c95760118290806001815401808255809150506001900390600052602060002001600090919091909150555b8260ff1660118054905014156115df57506115f3565b5080806115eb906140fd565b915050611555565b508060ff166011805490501461163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590613adb565b60405180910390fd5b60005b6011805490508160ff16101561171d5760006116a43360118460ff1681548110611694577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612327565b90506116af816128d3565b6116b960076123de565b60006116c560076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516116f69190613d96565b60405180910390a16117083382612902565b5050808061171590614146565b915050611641565b505b600a5460095461172f9190613eb4565b421180156117595750600b54600a5460095461174b9190613eb4565b6117559190613eb4565b4211155b1561187b57600061176933610dcd565b116117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613b7b565b60405180910390fd5b8060ff16600c546117ba9190613f3b565b34146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613d5b565b60405180910390fd5b60005b8160ff168160ff1610156118795761181660076123de565b600061182260076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516118539190613d96565b60405180910390a16118653382612902565b50808061187190614146565b9150506117fe565b505b600b54600a5460095461188e9190613eb4565b6118989190613eb4565b421115611a595760006118aa33610dcd565b1115611986578060ff16600c546118c19190613f3b565b3414611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990613d5b565b60405180910390fd5b60005b8160ff168160ff1610156119805761191d60076123de565b600061192960076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161195a9190613d96565b60405180910390a161196c3382612902565b50808061197890614146565b915050611905565b50611a58565b8060ff16600d546119979190613f3b565b34146119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90613bbb565b60405180910390fd5b60005b8160ff168160ff161015611a56576119f360076123de565b60006119ff60076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a28581604051611a309190613d96565b60405180910390a1611a423382612902565b508080611a4e90614146565b9150506119db565b505b5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490613bfb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b1c61246c565b73ffffffffffffffffffffffffffffffffffffffff16611b3a611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613c9b565b60405180910390fd5b611b9a6000612ad0565b565b611ba461246c565b73ffffffffffffffffffffffffffffffffffffffff16611bc2611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613c9b565b60405180910390fd5b80600d8190555050565b611c2a61246c565b73ffffffffffffffffffffffffffffffffffffffff16611c48611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590613c9b565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b611cc361246c565b73ffffffffffffffffffffffffffffffffffffffff16611ce1611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90613c9b565b60405180910390fd5b80600c8190555050565b611d4961246c565b73ffffffffffffffffffffffffffffffffffffffff16611d67611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613c9b565b60405180910390fd5b8060098190555050565b600042905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60118181548110611e0957600080fd5b906000526020600020016000915090505481565b606060018054611e2c9061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e589061409a565b8015611ea55780601f10611e7a57610100808354040283529160200191611ea5565b820191906000526020600020905b815481529060010190602001808311611e8857829003601f168201915b5050505050905090565b611eb761246c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613b5b565b60405180910390fd5b8060056000611f3261246c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fdf61246c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120249190613a3e565b60405180910390a35050565b60078060000154905081565b60095481565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b61207d61207761246c565b83612599565b6120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613d3b565b60405180910390fd5b6120c884848484612b96565b50505050565b60606120d982612474565b612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90613cdb565b60405180910390fd5b6000612122612bf2565b90506000815111612142576040518060200160405280600081525061216d565b8061214c84612c84565b60405160200161215d929190613968565b6040516020818303038152906040525b915050919050565b61040681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223761246c565b73ffffffffffffffffffffffffffffffffffffffff16612255611dcf565b73ffffffffffffffffffffffffffffffffffffffff16146122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290613c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290613abb565b60405180910390fd5b61232481612ad0565b50565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b81526004016123869291906139f3565b60206040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d6919061346a565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612553836112e4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125a482612474565b6125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90613b9b565b60405180910390fd5b60006125ee836112e4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265d57508373ffffffffffffffffffffffffffffffffffffffff1661264584610ba7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266e575061266d818561219b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612697826112e4565b73ffffffffffffffffffffffffffffffffffffffff16146126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e490613cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490613b3b565b60405180910390fd5b612768838383612e31565b6127736000826124e0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c39190613f95565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461281a9190613eb4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60016010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990613c3b565b60405180910390fd5b61297b81612474565b156129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290613afb565b60405180910390fd5b6129c760008383612e31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a179190613eb4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ba1848484612677565b612bad84848484612e36565b612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be390613a7b565b60405180910390fd5b50505050565b606060088054612c019061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2d9061409a565b8015612c7a5780601f10612c4f57610100808354040283529160200191612c7a565b820191906000526020600020905b815481529060010190602001808311612c5d57829003601f168201915b5050505050905090565b60606000821415612ccc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e2c565b600082905060005b60008214612cfe578080612ce7906140fd565b915050600a82612cf79190613f0a565b9150612cd4565b60008167ffffffffffffffff811115612d40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d725781602001600182028036833780820191505090505b5090505b60008514612e2557600182612d8b9190613f95565b9150600a85612d9a9190614170565b6030612da69190613eb4565b60f81b818381518110612de2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e1e9190613f0a565b9450612d76565b8093505050505b919050565b505050565b6000612e578473ffffffffffffffffffffffffffffffffffffffff16612fcd565b15612fc0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e8061246c565b8786866040518563ffffffff1660e01b8152600401612ea294939291906139a7565b602060405180830381600087803b158015612ebc57600080fd5b505af1925050508015612eed57506040513d601f19601f82011682018060405250810190612eea91906133d7565b60015b612f70573d8060008114612f1d576040519150601f19603f3d011682016040523d82523d6000602084013e612f22565b606091505b50600081511415612f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5f90613a7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fc5565b600190505b949350505050565b600080823b905060008111915050919050565b828054612fec9061409a565b90600052602060002090601f01602090048101928261300e5760008555613055565b82601f1061302757805160ff1916838001178555613055565b82800160010185558215613055579182015b82811115613054578251825591602001919060010190613039565b5b5090506130629190613087565b5090565b50805460008255906000526020600020908101906130849190613087565b50565b5b808211156130a0576000816000905550600101613088565b5090565b60006130b76130b284613dd6565b613db1565b9050828152602081018484840111156130cf57600080fd5b6130da848285614058565b509392505050565b60006130f56130f084613e07565b613db1565b90508281526020810184848401111561310d57600080fd5b613118848285614058565b509392505050565b60008135905061312f8161485a565b92915050565b60008135905061314481614871565b92915050565b60008135905061315981614888565b92915050565b60008151905061316e81614888565b92915050565b600082601f83011261318557600080fd5b81356131958482602086016130a4565b91505092915050565b600082601f8301126131af57600080fd5b81356131bf8482602086016130e2565b91505092915050565b6000813590506131d78161489f565b92915050565b6000815190506131ec8161489f565b92915050565b600081359050613201816148b6565b92915050565b60006020828403121561321957600080fd5b600061322784828501613120565b91505092915050565b6000806040838503121561324357600080fd5b600061325185828601613120565b925050602061326285828601613120565b9150509250929050565b60008060006060848603121561328157600080fd5b600061328f86828701613120565b93505060206132a086828701613120565b92505060406132b1868287016131c8565b9150509250925092565b600080600080608085870312156132d157600080fd5b60006132df87828801613120565b94505060206132f087828801613120565b9350506040613301878288016131c8565b925050606085013567ffffffffffffffff81111561331e57600080fd5b61332a87828801613174565b91505092959194509250565b6000806040838503121561334957600080fd5b600061335785828601613120565b925050602061336885828601613135565b9150509250929050565b6000806040838503121561338557600080fd5b600061339385828601613120565b92505060206133a4858286016131c8565b9150509250929050565b6000602082840312156133c057600080fd5b60006133ce8482850161314a565b91505092915050565b6000602082840312156133e957600080fd5b60006133f78482850161315f565b91505092915050565b60006020828403121561341257600080fd5b600082013567ffffffffffffffff81111561342c57600080fd5b6134388482850161319e565b91505092915050565b60006020828403121561345357600080fd5b6000613461848285016131c8565b91505092915050565b60006020828403121561347c57600080fd5b600061348a848285016131dd565b91505092915050565b6000602082840312156134a557600080fd5b60006134b3848285016131f2565b91505092915050565b60006134c8838361394a565b60208301905092915050565b6134dd81613fc9565b82525050565b60006134ee82613e48565b6134f88185613e76565b935061350383613e38565b8060005b8381101561353457815161351b88826134bc565b975061352683613e69565b925050600181019050613507565b5085935050505092915050565b61354a81613fdb565b82525050565b600061355b82613e53565b6135658185613e87565b9350613575818560208601614067565b61357e8161425d565b840191505092915050565b600061359482613e5e565b61359e8185613e98565b93506135ae818560208601614067565b6135b78161425d565b840191505092915050565b60006135cd82613e5e565b6135d78185613ea9565b93506135e7818560208601614067565b80840191505092915050565b6000613600603283613e98565b915061360b8261426e565b604082019050919050565b6000613623601e83613e98565b915061362e826142bd565b602082019050919050565b6000613646602683613e98565b9150613651826142e6565b604082019050919050565b6000613669600e83613e98565b915061367482614335565b602082019050919050565b600061368c601c83613e98565b91506136978261435e565b602082019050919050565b60006136af601883613e98565b91506136ba82614387565b602082019050919050565b60006136d2602483613e98565b91506136dd826143b0565b604082019050919050565b60006136f5601983613e98565b9150613700826143ff565b602082019050919050565b6000613718601683613e98565b915061372382614428565b602082019050919050565b600061373b602c83613e98565b915061374682614451565b604082019050919050565b600061375e603f83613e98565b9150613769826144a0565b604082019050919050565b6000613781603883613e98565b915061378c826144ef565b604082019050919050565b60006137a4602a83613e98565b91506137af8261453e565b604082019050919050565b60006137c7602983613e98565b91506137d28261458d565b604082019050919050565b60006137ea602083613e98565b91506137f5826145dc565b602082019050919050565b600061380d601083613e98565b915061381882614605565b602082019050919050565b6000613830602c83613e98565b915061383b8261462e565b604082019050919050565b6000613853602083613e98565b915061385e8261467d565b602082019050919050565b6000613876602983613e98565b9150613881826146a6565b604082019050919050565b6000613899602f83613e98565b91506138a4826146f5565b604082019050919050565b60006138bc602183613e98565b91506138c782614744565b604082019050919050565b60006138df601683613e98565b91506138ea82614793565b602082019050919050565b6000613902603183613e98565b915061390d826147bc565b604082019050919050565b6000613925603f83613e98565b91506139308261480b565b604082019050919050565b61394481614013565b82525050565b61395381614041565b82525050565b61396281614041565b82525050565b600061397482856135c2565b915061398082846135c2565b91508190509392505050565b60006020820190506139a160008301846134d4565b92915050565b60006080820190506139bc60008301876134d4565b6139c960208301866134d4565b6139d66040830185613959565b81810360608301526139e88184613550565b905095945050505050565b6000604082019050613a0860008301856134d4565b613a156020830184613959565b9392505050565b60006020820190508181036000830152613a3681846134e3565b905092915050565b6000602082019050613a536000830184613541565b92915050565b60006020820190508181036000830152613a738184613589565b905092915050565b60006020820190508181036000830152613a94816135f3565b9050919050565b60006020820190508181036000830152613ab481613616565b9050919050565b60006020820190508181036000830152613ad481613639565b9050919050565b60006020820190508181036000830152613af48161365c565b9050919050565b60006020820190508181036000830152613b148161367f565b9050919050565b60006020820190508181036000830152613b34816136a2565b9050919050565b60006020820190508181036000830152613b54816136c5565b9050919050565b60006020820190508181036000830152613b74816136e8565b9050919050565b60006020820190508181036000830152613b948161370b565b9050919050565b60006020820190508181036000830152613bb48161372e565b9050919050565b60006020820190508181036000830152613bd481613751565b9050919050565b60006020820190508181036000830152613bf481613774565b9050919050565b60006020820190508181036000830152613c1481613797565b9050919050565b60006020820190508181036000830152613c34816137ba565b9050919050565b60006020820190508181036000830152613c54816137dd565b9050919050565b60006020820190508181036000830152613c7481613800565b9050919050565b60006020820190508181036000830152613c9481613823565b9050919050565b60006020820190508181036000830152613cb481613846565b9050919050565b60006020820190508181036000830152613cd481613869565b9050919050565b60006020820190508181036000830152613cf48161388c565b9050919050565b60006020820190508181036000830152613d14816138af565b9050919050565b60006020820190508181036000830152613d34816138d2565b9050919050565b60006020820190508181036000830152613d54816138f5565b9050919050565b60006020820190508181036000830152613d7481613918565b9050919050565b6000602082019050613d90600083018461393b565b92915050565b6000602082019050613dab6000830184613959565b92915050565b6000613dbb613dcc565b9050613dc782826140cc565b919050565b6000604051905090565b600067ffffffffffffffff821115613df157613df061422e565b5b613dfa8261425d565b9050602081019050919050565b600067ffffffffffffffff821115613e2257613e2161422e565b5b613e2b8261425d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebf82614041565b9150613eca83614041565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eff57613efe6141a1565b5b828201905092915050565b6000613f1582614041565b9150613f2083614041565b925082613f3057613f2f6141d0565b5b828204905092915050565b6000613f4682614041565b9150613f5183614041565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8a57613f896141a1565b5b828202905092915050565b6000613fa082614041565b9150613fab83614041565b925082821015613fbe57613fbd6141a1565b5b828203905092915050565b6000613fd482614021565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561408557808201518184015260208101905061406a565b83811115614094576000848401525b50505050565b600060028204905060018216806140b257607f821691505b602082108114156140c6576140c56141ff565b5b50919050565b6140d58261425d565b810181811067ffffffffffffffff821117156140f4576140f361422e565b5b80604052505050565b600061410882614041565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413b5761413a6141a1565b5b600182019050919050565b60006141518261404b565b915060ff821415614165576141646141a1565b5b600182019050919050565b600061417b82614041565b915061418683614041565b925082614196576141956141d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e206d696e74206f6e6c79203130206d617820617420612074696d650000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f646120706173732075736564000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6565647320746f206861766520536f64615061737300000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3037204554482070657220746f6b656e00602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c65204e6f74205374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3036204554482070657220746f6b656e00602082015250565b61486381613fc9565b811461486e57600080fd5b50565b61487a81613fdb565b811461488557600080fd5b50565b61489181613fe7565b811461489c57600080fd5b50565b6148a881614041565b81146148b357600080fd5b50565b6148bf8161404b565b81146148ca57600080fd5b5056fea26469706673582212204c0e9f56363138a20f7328cf9cdecfd54d76515f5f91e665700ea8d0eb359ef264736f6c63430008030033

Deployed Bytecode

0x6080604052600436106102465760003560e01c806370a0823111610139578063a22cb465116100b6578063c87b56dd1161007a578063c87b56dd1461084b578063d5abeb0114610888578063d60dfeeb146108b3578063e985e9c5146108f0578063f2fde38b1461092d578063f60dd7e31461095657610246565b8063a22cb46514610766578063aa46a4001461078f578063ac8daba0146107ba578063b86e94a6146107e5578063b88d4fde1461082257610246565b806382d95df5116100fd57806382d95df51461067f578063881cf122146106a85780638da5cb5b146106d35780639052eaaf146106fe57806395d89b411461073b57610246565b806370a08231146105c2578063715018a6146105ff578063791a2519146106165780637944875b1461063f5780637bc36e041461065657610246565b80632a0d65d6116101c7578063438b63001161018b578063438b6300146104d857806355f804b3146105155780635abc96221461053e5780636352211e146105695780636ecd2306146105a657610246565b80632a0d65d614610405578063318aed89146104305780633a517e0b1461046d5780633ccfd60b1461049857806342842e0e146104af57610246565b806318160ddd1161020e57806318160ddd14610330578063190445e11461035b5780631f5065021461038657806323b872dd146103b157806326d89e70146103da57610246565b806301ffc9a71461024b57806303225f4c1461028857806306fdde031461029f578063081812fc146102ca578063095ea7b314610307575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d91906133ae565b610993565b60405161027f9190613a3e565b60405180910390f35b34801561029457600080fd5b5061029d610a75565b005b3480156102ab57600080fd5b506102b4610b15565b6040516102c19190613a59565b60405180910390f35b3480156102d657600080fd5b506102f160048036038101906102ec9190613441565b610ba7565b6040516102fe919061398c565b60405180910390f35b34801561031357600080fd5b5061032e60048036038101906103299190613372565b610c2c565b005b34801561033c57600080fd5b50610345610d44565b6040516103529190613d96565b60405180910390f35b34801561036757600080fd5b50610370610d55565b60405161037d9190613d96565b60405180910390f35b34801561039257600080fd5b5061039b610d5b565b6040516103a89190613d96565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d3919061326c565b610d61565b005b3480156103e657600080fd5b506103ef610dc1565b6040516103fc9190613d96565b60405180910390f35b34801561041157600080fd5b5061041a610dc7565b6040516104279190613d96565b60405180910390f35b34801561043c57600080fd5b5061045760048036038101906104529190613207565b610dcd565b6040516104649190613d96565b60405180910390f35b34801561047957600080fd5b50610482610e81565b60405161048f9190613d96565b60405180910390f35b3480156104a457600080fd5b506104ad610e8e565b005b3480156104bb57600080fd5b506104d660048036038101906104d1919061326c565b6110c0565b005b3480156104e457600080fd5b506104ff60048036038101906104fa9190613207565b6110e0565b60405161050c9190613a1c565b60405180910390f35b34801561052157600080fd5b5061053c60048036038101906105379190613400565b61123b565b005b34801561054a57600080fd5b506105536112d1565b6040516105609190613a3e565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613441565b6112e4565b60405161059d919061398c565b60405180910390f35b6105c060048036038101906105bb9190613493565b611396565b005b3480156105ce57600080fd5b506105e960048036038101906105e49190613207565b611a5c565b6040516105f69190613d96565b60405180910390f35b34801561060b57600080fd5b50610614611b14565b005b34801561062257600080fd5b5061063d60048036038101906106389190613441565b611b9c565b005b34801561064b57600080fd5b50610654611c22565b005b34801561066257600080fd5b5061067d60048036038101906106789190613441565b611cbb565b005b34801561068b57600080fd5b506106a660048036038101906106a19190613441565b611d41565b005b3480156106b457600080fd5b506106bd611dc7565b6040516106ca9190613d96565b60405180910390f35b3480156106df57600080fd5b506106e8611dcf565b6040516106f5919061398c565b60405180910390f35b34801561070a57600080fd5b5061072560048036038101906107209190613441565b611df9565b6040516107329190613d96565b60405180910390f35b34801561074757600080fd5b50610750611e1d565b60405161075d9190613a59565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613336565b611eaf565b005b34801561079b57600080fd5b506107a4612030565b6040516107b19190613d96565b60405180910390f35b3480156107c657600080fd5b506107cf61203c565b6040516107dc9190613d96565b60405180910390f35b3480156107f157600080fd5b5061080c60048036038101906108079190613441565b612042565b6040516108199190613a3e565b60405180910390f35b34801561082e57600080fd5b50610849600480360381019061084491906132bb565b61206c565b005b34801561085757600080fd5b50610872600480360381019061086d9190613441565b6120ce565b60405161087f9190613a59565b60405180910390f35b34801561089457600080fd5b5061089d612175565b6040516108aa9190613d7b565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613441565b61217b565b6040516108e79190613a3e565b60405180910390f35b3480156108fc57600080fd5b5061091760048036038101906109129190613230565b61219b565b6040516109249190613a3e565b60405180910390f35b34801561093957600080fd5b50610954600480360381019061094f9190613207565b61222f565b005b34801561096257600080fd5b5061097d60048036038101906109789190613372565b612327565b60405161098a9190613d96565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a5e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a6e5750610a6d82612402565b5b9050919050565b610a7d61246c565b73ffffffffffffffffffffffffffffffffffffffff16610a9b611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae890613c9b565b60405180910390fd5b426009819055506001600e60006101000a81548160ff021916908315150217905550565b606060008054610b249061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054610b509061409a565b8015610b9d5780601f10610b7257610100808354040283529160200191610b9d565b820191906000526020600020905b815481529060010190602001808311610b8057829003601f168201915b5050505050905090565b6000610bb282612474565b610bf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be890613c7b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c37826112e4565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ca8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9f90613cfb565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cc761246c565b73ffffffffffffffffffffffffffffffffffffffff161480610cf65750610cf581610cf061246c565b61219b565b5b610d35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d2c90613bdb565b60405180910390fd5b610d3f83836124e0565b505050565b6000610d5060076123f4565b905090565b600d5481565b600b5481565b610d72610d6c61246c565b82612599565b610db1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da890613d3b565b60405180910390fd5b610dbc838383612677565b505050565b600c5481565b600a5481565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231836040518263ffffffff1660e01b8152600401610e2a919061398c565b60206040518083038186803b158015610e4257600080fd5b505afa158015610e56573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e7a919061346a565b9050919050565b6000601180549050905090565b610e9661246c565b73ffffffffffffffffffffffffffffffffffffffff16610eb4611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614610f0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0190613c9b565b60405180910390fd5b60004711610f4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4490613b1b565b60405180910390fd5b600047905060007320e087c55c6c15260987ef59738468511a9948c190508073ffffffffffffffffffffffffffffffffffffffff166108fc600a600685610f949190613f3b565b610f9e9190613f0a565b9081150290604051600060405180830381858888f19350505050158015610fc9573d6000803e3d6000fd5b50600073f0467b3fc5736fb5d5e852d001248b4277a7c08990508073ffffffffffffffffffffffffffffffffffffffff166108fc600a60038661100c9190613f3b565b6110169190613f0a565b9081150290604051600060405180830381858888f19350505050158015611041573d6000803e3d6000fd5b506000733097617cba85a26adc214a1f87b680be4b275cd090508073ffffffffffffffffffffffffffffffffffffffff166108fc600a6001876110849190613f3b565b61108e9190613f0a565b9081150290604051600060405180830381858888f193505050501580156110b9573d6000803e3d6000fd5b5050505050565b6110db8383836040518060200160405280600081525061206c565b505050565b606060006110ed83611a5c565b905060008167ffffffffffffffff811115611131577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561115f5781602001602082028036833780820191505090505b50905060006001905060005b8381108015611180575061040661ffff168211155b1561122f576000611190836112e4565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561121b5782848381518110611200577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508180611217906140fd565b9250505b8280611226906140fd565b9350505061116b565b82945050505050919050565b61124361246c565b73ffffffffffffffffffffffffffffffffffffffff16611261611dcf565b73ffffffffffffffffffffffffffffffffffffffff16146112b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ae90613c9b565b60405180910390fd5b80600890805190602001906112cd929190612fe0565b5050565b600e60009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561138d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138490613c1b565b60405180910390fd5b80915050919050565b601160006113a49190613066565b600a8160ff1611156113eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e290613a9b565b60405180910390fd5b61040661ffff166113fa610d44565b8260ff166114089190613eb4565b1115611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161144090613d1b565b60405180910390fd5b60011515600e60009054906101000a900460ff1615151461149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690613c5b565b60405180910390fd5b600a546009546114af9190613eb4565b421161171f5760006114c033610dcd565b11611500576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f790613b7b565b60405180910390fd5b8060ff16600c546115119190613f3b565b3414611552576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154990613d5b565b60405180910390fd5b60005b61155e33610dcd565b8110156115f35760006115713383612327565b9050600115156010600083815260200190815260200160002060009054906101000a900460ff161515146115c95760118290806001815401808255809150506001900390600052602060002001600090919091909150555b8260ff1660118054905014156115df57506115f3565b5080806115eb906140fd565b915050611555565b508060ff166011805490501461163e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163590613adb565b60405180910390fd5b60005b6011805490508160ff16101561171d5760006116a43360118460ff1681548110611694577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154612327565b90506116af816128d3565b6116b960076123de565b60006116c560076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516116f69190613d96565b60405180910390a16117083382612902565b5050808061171590614146565b915050611641565b505b600a5460095461172f9190613eb4565b421180156117595750600b54600a5460095461174b9190613eb4565b6117559190613eb4565b4211155b1561187b57600061176933610dcd565b116117a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117a090613b7b565b60405180910390fd5b8060ff16600c546117ba9190613f3b565b34146117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613d5b565b60405180910390fd5b60005b8160ff168160ff1610156118795761181660076123de565b600061182260076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a285816040516118539190613d96565b60405180910390a16118653382612902565b50808061187190614146565b9150506117fe565b505b600b54600a5460095461188e9190613eb4565b6118989190613eb4565b421115611a595760006118aa33610dcd565b1115611986578060ff16600c546118c19190613f3b565b3414611902576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f990613d5b565b60405180910390fd5b60005b8160ff168160ff1610156119805761191d60076123de565b600061192960076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a2858160405161195a9190613d96565b60405180910390a161196c3382612902565b50808061197890614146565b915050611905565b50611a58565b8060ff16600d546119979190613f3b565b34146119d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119cf90613bbb565b60405180910390fd5b60005b8160ff168160ff161015611a56576119f360076123de565b60006119ff60076123f4565b90507f6c29ed792f8b613fbba10b9e105a1dcebd92b4dd7938e36de410329ef452a28581604051611a309190613d96565b60405180910390a1611a423382612902565b508080611a4e90614146565b9150506119db565b505b5b50565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611acd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac490613bfb565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611b1c61246c565b73ffffffffffffffffffffffffffffffffffffffff16611b3a611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611b90576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8790613c9b565b60405180910390fd5b611b9a6000612ad0565b565b611ba461246c565b73ffffffffffffffffffffffffffffffffffffffff16611bc2611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611c18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0f90613c9b565b60405180910390fd5b80600d8190555050565b611c2a61246c565b73ffffffffffffffffffffffffffffffffffffffff16611c48611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611c9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c9590613c9b565b60405180910390fd5b6000600e60006101000a81548160ff021916908315150217905550565b611cc361246c565b73ffffffffffffffffffffffffffffffffffffffff16611ce1611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611d37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2e90613c9b565b60405180910390fd5b80600c8190555050565b611d4961246c565b73ffffffffffffffffffffffffffffffffffffffff16611d67611dcf565b73ffffffffffffffffffffffffffffffffffffffff1614611dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611db490613c9b565b60405180910390fd5b8060098190555050565b600042905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60118181548110611e0957600080fd5b906000526020600020016000915090505481565b606060018054611e2c9061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054611e589061409a565b8015611ea55780601f10611e7a57610100808354040283529160200191611ea5565b820191906000526020600020905b815481529060010190602001808311611e8857829003601f168201915b5050505050905090565b611eb761246c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f1c90613b5b565b60405180910390fd5b8060056000611f3261246c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611fdf61246c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120249190613a3e565b60405180910390a35050565b60078060000154905081565b60095481565b60006010600083815260200190815260200160002060009054906101000a900460ff169050919050565b61207d61207761246c565b83612599565b6120bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b390613d3b565b60405180910390fd5b6120c884848484612b96565b50505050565b60606120d982612474565b612118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210f90613cdb565b60405180910390fd5b6000612122612bf2565b90506000815111612142576040518060200160405280600081525061216d565b8061214c84612c84565b60405160200161215d929190613968565b6040516020818303038152906040525b915050919050565b61040681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61223761246c565b73ffffffffffffffffffffffffffffffffffffffff16612255611dcf565b73ffffffffffffffffffffffffffffffffffffffff16146122ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122a290613c9b565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561231b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231290613abb565b60405180910390fd5b61232481612ad0565b50565b6000600e60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c5984846040518363ffffffff1660e01b81526004016123869291906139f3565b60206040518083038186803b15801561239e57600080fd5b505afa1580156123b2573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123d6919061346a565b905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16612553836112e4565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006125a482612474565b6125e3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125da90613b9b565b60405180910390fd5b60006125ee836112e4565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061265d57508373ffffffffffffffffffffffffffffffffffffffff1661264584610ba7565b73ffffffffffffffffffffffffffffffffffffffff16145b8061266e575061266d818561219b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612697826112e4565b73ffffffffffffffffffffffffffffffffffffffff16146126ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126e490613cbb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161275490613b3b565b60405180910390fd5b612768838383612e31565b6127736000826124e0565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546127c39190613f95565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461281a9190613eb4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60016010600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612972576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161296990613c3b565b60405180910390fd5b61297b81612474565b156129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b290613afb565b60405180910390fd5b6129c760008383612e31565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a179190613eb4565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612ba1848484612677565b612bad84848484612e36565b612bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be390613a7b565b60405180910390fd5b50505050565b606060088054612c019061409a565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2d9061409a565b8015612c7a5780601f10612c4f57610100808354040283529160200191612c7a565b820191906000526020600020905b815481529060010190602001808311612c5d57829003601f168201915b5050505050905090565b60606000821415612ccc576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612e2c565b600082905060005b60008214612cfe578080612ce7906140fd565b915050600a82612cf79190613f0a565b9150612cd4565b60008167ffffffffffffffff811115612d40577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612d725781602001600182028036833780820191505090505b5090505b60008514612e2557600182612d8b9190613f95565b9150600a85612d9a9190614170565b6030612da69190613eb4565b60f81b818381518110612de2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612e1e9190613f0a565b9450612d76565b8093505050505b919050565b505050565b6000612e578473ffffffffffffffffffffffffffffffffffffffff16612fcd565b15612fc0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612e8061246c565b8786866040518563ffffffff1660e01b8152600401612ea294939291906139a7565b602060405180830381600087803b158015612ebc57600080fd5b505af1925050508015612eed57506040513d601f19601f82011682018060405250810190612eea91906133d7565b60015b612f70573d8060008114612f1d576040519150601f19603f3d011682016040523d82523d6000602084013e612f22565b606091505b50600081511415612f68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f5f90613a7b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612fc5565b600190505b949350505050565b600080823b905060008111915050919050565b828054612fec9061409a565b90600052602060002090601f01602090048101928261300e5760008555613055565b82601f1061302757805160ff1916838001178555613055565b82800160010185558215613055579182015b82811115613054578251825591602001919060010190613039565b5b5090506130629190613087565b5090565b50805460008255906000526020600020908101906130849190613087565b50565b5b808211156130a0576000816000905550600101613088565b5090565b60006130b76130b284613dd6565b613db1565b9050828152602081018484840111156130cf57600080fd5b6130da848285614058565b509392505050565b60006130f56130f084613e07565b613db1565b90508281526020810184848401111561310d57600080fd5b613118848285614058565b509392505050565b60008135905061312f8161485a565b92915050565b60008135905061314481614871565b92915050565b60008135905061315981614888565b92915050565b60008151905061316e81614888565b92915050565b600082601f83011261318557600080fd5b81356131958482602086016130a4565b91505092915050565b600082601f8301126131af57600080fd5b81356131bf8482602086016130e2565b91505092915050565b6000813590506131d78161489f565b92915050565b6000815190506131ec8161489f565b92915050565b600081359050613201816148b6565b92915050565b60006020828403121561321957600080fd5b600061322784828501613120565b91505092915050565b6000806040838503121561324357600080fd5b600061325185828601613120565b925050602061326285828601613120565b9150509250929050565b60008060006060848603121561328157600080fd5b600061328f86828701613120565b93505060206132a086828701613120565b92505060406132b1868287016131c8565b9150509250925092565b600080600080608085870312156132d157600080fd5b60006132df87828801613120565b94505060206132f087828801613120565b9350506040613301878288016131c8565b925050606085013567ffffffffffffffff81111561331e57600080fd5b61332a87828801613174565b91505092959194509250565b6000806040838503121561334957600080fd5b600061335785828601613120565b925050602061336885828601613135565b9150509250929050565b6000806040838503121561338557600080fd5b600061339385828601613120565b92505060206133a4858286016131c8565b9150509250929050565b6000602082840312156133c057600080fd5b60006133ce8482850161314a565b91505092915050565b6000602082840312156133e957600080fd5b60006133f78482850161315f565b91505092915050565b60006020828403121561341257600080fd5b600082013567ffffffffffffffff81111561342c57600080fd5b6134388482850161319e565b91505092915050565b60006020828403121561345357600080fd5b6000613461848285016131c8565b91505092915050565b60006020828403121561347c57600080fd5b600061348a848285016131dd565b91505092915050565b6000602082840312156134a557600080fd5b60006134b3848285016131f2565b91505092915050565b60006134c8838361394a565b60208301905092915050565b6134dd81613fc9565b82525050565b60006134ee82613e48565b6134f88185613e76565b935061350383613e38565b8060005b8381101561353457815161351b88826134bc565b975061352683613e69565b925050600181019050613507565b5085935050505092915050565b61354a81613fdb565b82525050565b600061355b82613e53565b6135658185613e87565b9350613575818560208601614067565b61357e8161425d565b840191505092915050565b600061359482613e5e565b61359e8185613e98565b93506135ae818560208601614067565b6135b78161425d565b840191505092915050565b60006135cd82613e5e565b6135d78185613ea9565b93506135e7818560208601614067565b80840191505092915050565b6000613600603283613e98565b915061360b8261426e565b604082019050919050565b6000613623601e83613e98565b915061362e826142bd565b602082019050919050565b6000613646602683613e98565b9150613651826142e6565b604082019050919050565b6000613669600e83613e98565b915061367482614335565b602082019050919050565b600061368c601c83613e98565b91506136978261435e565b602082019050919050565b60006136af601883613e98565b91506136ba82614387565b602082019050919050565b60006136d2602483613e98565b91506136dd826143b0565b604082019050919050565b60006136f5601983613e98565b9150613700826143ff565b602082019050919050565b6000613718601683613e98565b915061372382614428565b602082019050919050565b600061373b602c83613e98565b915061374682614451565b604082019050919050565b600061375e603f83613e98565b9150613769826144a0565b604082019050919050565b6000613781603883613e98565b915061378c826144ef565b604082019050919050565b60006137a4602a83613e98565b91506137af8261453e565b604082019050919050565b60006137c7602983613e98565b91506137d28261458d565b604082019050919050565b60006137ea602083613e98565b91506137f5826145dc565b602082019050919050565b600061380d601083613e98565b915061381882614605565b602082019050919050565b6000613830602c83613e98565b915061383b8261462e565b604082019050919050565b6000613853602083613e98565b915061385e8261467d565b602082019050919050565b6000613876602983613e98565b9150613881826146a6565b604082019050919050565b6000613899602f83613e98565b91506138a4826146f5565b604082019050919050565b60006138bc602183613e98565b91506138c782614744565b604082019050919050565b60006138df601683613e98565b91506138ea82614793565b602082019050919050565b6000613902603183613e98565b915061390d826147bc565b604082019050919050565b6000613925603f83613e98565b91506139308261480b565b604082019050919050565b61394481614013565b82525050565b61395381614041565b82525050565b61396281614041565b82525050565b600061397482856135c2565b915061398082846135c2565b91508190509392505050565b60006020820190506139a160008301846134d4565b92915050565b60006080820190506139bc60008301876134d4565b6139c960208301866134d4565b6139d66040830185613959565b81810360608301526139e88184613550565b905095945050505050565b6000604082019050613a0860008301856134d4565b613a156020830184613959565b9392505050565b60006020820190508181036000830152613a3681846134e3565b905092915050565b6000602082019050613a536000830184613541565b92915050565b60006020820190508181036000830152613a738184613589565b905092915050565b60006020820190508181036000830152613a94816135f3565b9050919050565b60006020820190508181036000830152613ab481613616565b9050919050565b60006020820190508181036000830152613ad481613639565b9050919050565b60006020820190508181036000830152613af48161365c565b9050919050565b60006020820190508181036000830152613b148161367f565b9050919050565b60006020820190508181036000830152613b34816136a2565b9050919050565b60006020820190508181036000830152613b54816136c5565b9050919050565b60006020820190508181036000830152613b74816136e8565b9050919050565b60006020820190508181036000830152613b948161370b565b9050919050565b60006020820190508181036000830152613bb48161372e565b9050919050565b60006020820190508181036000830152613bd481613751565b9050919050565b60006020820190508181036000830152613bf481613774565b9050919050565b60006020820190508181036000830152613c1481613797565b9050919050565b60006020820190508181036000830152613c34816137ba565b9050919050565b60006020820190508181036000830152613c54816137dd565b9050919050565b60006020820190508181036000830152613c7481613800565b9050919050565b60006020820190508181036000830152613c9481613823565b9050919050565b60006020820190508181036000830152613cb481613846565b9050919050565b60006020820190508181036000830152613cd481613869565b9050919050565b60006020820190508181036000830152613cf48161388c565b9050919050565b60006020820190508181036000830152613d14816138af565b9050919050565b60006020820190508181036000830152613d34816138d2565b9050919050565b60006020820190508181036000830152613d54816138f5565b9050919050565b60006020820190508181036000830152613d7481613918565b9050919050565b6000602082019050613d90600083018461393b565b92915050565b6000602082019050613dab6000830184613959565b92915050565b6000613dbb613dcc565b9050613dc782826140cc565b919050565b6000604051905090565b600067ffffffffffffffff821115613df157613df061422e565b5b613dfa8261425d565b9050602081019050919050565b600067ffffffffffffffff821115613e2257613e2161422e565b5b613e2b8261425d565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613ebf82614041565b9150613eca83614041565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eff57613efe6141a1565b5b828201905092915050565b6000613f1582614041565b9150613f2083614041565b925082613f3057613f2f6141d0565b5b828204905092915050565b6000613f4682614041565b9150613f5183614041565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8a57613f896141a1565b5b828202905092915050565b6000613fa082614041565b9150613fab83614041565b925082821015613fbe57613fbd6141a1565b5b828203905092915050565b6000613fd482614021565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b8381101561408557808201518184015260208101905061406a565b83811115614094576000848401525b50505050565b600060028204905060018216806140b257607f821691505b602082108114156140c6576140c56141ff565b5b50919050565b6140d58261425d565b810181811067ffffffffffffffff821117156140f4576140f361422e565b5b80604052505050565b600061410882614041565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561413b5761413a6141a1565b5b600182019050919050565b60006141518261404b565b915060ff821415614165576141646141a1565b5b600182019050919050565b600061417b82614041565b915061418683614041565b925082614196576141956141d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f63616e206d696e74206f6e6c79203130206d617820617420612074696d650000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f536f646120706173732075736564000000000000000000000000000000000000600082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f42616c616e6365206d75737420626520706f7369746976650000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4e6565647320746f206861766520536f64615061737300000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3037204554482070657220746f6b656e00602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f53616c65204e6f74205374617274656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4574686572207375626d697474656420646f6573206e6f74206d61746368206360008201527f757272656e7420707269636520302e3036204554482070657220746f6b656e00602082015250565b61486381613fc9565b811461486e57600080fd5b50565b61487a81613fdb565b811461488557600080fd5b50565b61489181613fe7565b811461489c57600080fd5b50565b6148a881614041565b81146148b357600080fd5b50565b6148bf8161404b565b81146148ca57600080fd5b5056fea26469706673582212204c0e9f56363138a20f7328cf9cdecfd54d76515f5f91e665700ea8d0eb359ef264736f6c63430008030033

Deployed Bytecode Sourcemap

50647:7565:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25328:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51795:114;;;;;;;;;;;;;:::i;:::-;;26273:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27832:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27355:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53260:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51095:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50947:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28722:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51021:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50906:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52214:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56729:103;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57580:629;;;;;;;;;;;;;:::i;:::-;;29132:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56840:695;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52840:120;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51167:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25967:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53394:3327;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25697:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3906:94;;;;;;;;;;;;;:::i;:::-;;52709:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52127:75;;;;;;;;;;;;;:::i;:::-;;52570:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52459:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52359:88;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3255:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51432:22;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26442:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28125:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50731:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50864:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52010:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29388:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26617:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50777:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51381:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28491:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4155:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53082:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25328:305;25430:4;25482:25;25467:40;;;:11;:40;;;;:105;;;;25539:33;25524:48;;;:11;:48;;;;25467:105;:158;;;;25589:36;25613:11;25589:23;:36::i;:::-;25467:158;25447:178;;25328:305;;;:::o;51795:114::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51856:15:::1;51843:10;:28;;;;51897:4;51882:12;;:19;;;;;;;;;;;;;;;;;;51795:114::o:0;26273:100::-;26327:13;26360:5;26353:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26273:100;:::o;27832:221::-;27908:7;27936:16;27944:7;27936;:16::i;:::-;27928:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:15;:24;28037:7;28021:24;;;;;;;;;;;;;;;;;;;;;28014:31;;27832:221;;;:::o;27355:411::-;27436:13;27452:23;27467:7;27452:14;:23::i;:::-;27436:39;;27500:5;27494:11;;:2;:11;;;;27486:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27594:5;27578:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27603:37;27620:5;27627:12;:10;:12::i;:::-;27603:16;:37::i;:::-;27578:62;27556:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27737:21;27746:2;27750:7;27737:8;:21::i;:::-;27355:411;;;:::o;53260:95::-;53303:7;53328:19;:9;:17;:19::i;:::-;53321:26;;53260:95;:::o;51095:39::-;;;;:::o;50947:34::-;;;;:::o;28722:339::-;28917:41;28936:12;:10;:12::i;:::-;28950:7;28917:18;:41::i;:::-;28909:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29025:28;29035:4;29041:2;29045:7;29025:9;:28::i;:::-;28722:339;;;:::o;51021:40::-;;;;:::o;50906:34::-;;;;:::o;52214:132::-;52276:15;52310:13;;;;;;;;;;;:23;;;52334:3;52310:28;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52303:35;;52214:132;;;:::o;56729:103::-;56777:7;56809:8;:15;;;;56802:22;;56729:103;:::o;57580:629::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57660:1:::1;57636:21;:25;57628:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;57711:16;57730:21;57711:40;;57762:19;57784:42;57762:64;;57845:11;57837:29;;:48;57882:2;57879:1;57868:8;:12;;;;:::i;:::-;57867:17;;;;:::i;:::-;57837:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57915:18;57936:42;57915:63;;57997:10;57989:28;;:47;58033:2;58030:1;58019:8;:12;;;;:::i;:::-;58018:17;;;;:::i;:::-;57989:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;58067:19;58089:42;58067:64;;58150:11;58142:29;;:48;58187:2;58184:1;58173:8;:12;;;;:::i;:::-;58172:17;;;;:::i;:::-;58142:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;3546:1;;;;57580:629::o:0;29132:185::-;29270:39;29287:4;29293:2;29297:7;29270:39;;;;;;;;;;;;:16;:39::i;:::-;29132:185;;;:::o;56840:695::-;56927:16;56961:23;56987:17;56997:6;56987:9;:17::i;:::-;56961:43;;57015:30;57062:15;57048:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57015:63;;57089:22;57114:1;57089:26;;57126:23;57166:329;57191:15;57173;:33;:64;;;;;50812:4;57210:27;;:14;:27;;57173:64;57166:329;;;57250:25;57278:23;57286:14;57278:7;:23::i;:::-;57250:51;;57339:6;57318:27;;:17;:27;;;57314:141;;;57395:14;57362:13;57376:15;57362:30;;;;;;;;;;;;;;;;;;;;;:47;;;;;57426:17;;;;;:::i;:::-;;;;57314:141;57467:16;;;;;:::i;:::-;;;;57166:329;;;;57514:13;57507:20;;;;;;56840:695;;;:::o;52840:120::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52936:16:::1;52920:13;:32;;;;;;;;;;;;:::i;:::-;;52840:120:::0;:::o;51167:32::-;;;;;;;;;;;;;:::o;25967:239::-;26039:7;26059:13;26075:7;:16;26083:7;26075:16;;;;;;;;;;;;;;;;;;;;;26059:32;;26127:1;26110:19;;:5;:19;;;;26102:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26193:5;26186:12;;;25967:239;;;:::o;53394:3327::-;53474:8;;53467:15;;;;:::i;:::-;53521:2;53502:15;:21;;;;53494:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;50812:4;53576:46;;53595:13;:11;:13::i;:::-;53577:15;:31;;;;;;:::i;:::-;53576:46;;53568:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;53682:4;53666:20;;:12;;;;;;;;;;;:20;;;53658:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;53829:11;;53816:10;;:24;;;;:::i;:::-;53796:15;:45;53793:1308;;53908:1;53875:30;53894:10;53875:18;:30::i;:::-;:34;53867:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;53994:15;53974:35;;:17;;:35;;;;:::i;:::-;53960:9;:50;53952:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;54094:9;54090:467;54113:30;54132:10;54113:18;:30::i;:::-;54109:1;:34;54090:467;;;54186:15;54204:32;54223:10;54234:1;54204:18;:32::i;:::-;54186:50;;54290:4;54266:28;;:12;:21;54279:7;54266:21;;;;;;;;;;;;;;;;;;;;;:28;;;54263:108;;54327:8;54341:1;54327:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54263:108;54419:15;54400:34;;:8;:15;;;;:34;54397:128;;;54492:5;;;54397:128;54090:467;54145:3;;;;;:::i;:::-;;;;54090:467;;;;54603:15;54584:34;;:8;:15;;;;:34;54576:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;54680:7;54676:391;54697:8;:15;;;;54693:1;:19;;;54676:391;;;54737:15;54755:42;54774:10;54785:8;54794:1;54785:11;;;;;;;;;;;;;;;;;;;;;;;;;;54755:18;:42::i;:::-;54737:60;;54822:18;54832:7;54822:9;:18::i;:::-;54863:21;:9;:19;:21::i;:::-;54907:17;54927:19;:9;:17;:19::i;:::-;54907:39;;54974:22;54986:9;54974:22;;;;;;:::i;:::-;;;;;;;;55019:28;55025:10;55037:9;55019:5;:28::i;:::-;54676:391;;54714:3;;;;;:::i;:::-;;;;54676:391;;;;53793:1308;55146:11;;55133:10;;:24;;;;:::i;:::-;55114:15;:44;:107;;;;;55209:11;;55195;;55182:10;;:24;;;;:::i;:::-;:38;;;;:::i;:::-;55162:15;:59;;55114:107;55111:605;;;55278:1;55245:30;55264:10;55245:18;:30::i;:::-;:34;55237:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;55364:15;55344:35;;:17;;:35;;;;:::i;:::-;55330:9;:50;55322:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;55468:7;55463:241;55485:15;55481:19;;:1;:19;;;55463:241;;;55524:21;:9;:19;:21::i;:::-;55562:17;55582:19;:9;:17;:19::i;:::-;55562:39;;55623:22;55635:9;55623:22;;;;;;:::i;:::-;;;;;;;;55662:28;55668:10;55680:9;55662:5;:28::i;:::-;55463:241;55502:3;;;;;:::i;:::-;;;;55463:241;;;;55111:605;55775:11;;55761;;55748:10;;:24;;;;:::i;:::-;:38;;;;:::i;:::-;55729:15;:58;55726:986;;;55842:1;55809:30;55828:10;55809:18;:30::i;:::-;:34;55806:894;;;55905:15;55885:35;;:17;;:35;;;;:::i;:::-;55871:9;:50;55863:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;56010:7;56005:247;56027:15;56023:19;;:1;:19;;;56005:247;;;56066:21;:9;:19;:21::i;:::-;56104:17;56124:19;:9;:17;:19::i;:::-;56104:39;;56165:22;56177:9;56165:22;;;;;;:::i;:::-;;;;;;;;56204:28;56210:10;56222:9;56204:5;:28::i;:::-;56005:247;56044:3;;;;;:::i;:::-;;;;56005:247;;;;55806:894;;;56346:15;56327:34;;:16;;:34;;;;:::i;:::-;56313:9;:49;56305:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;56450:7;56445:240;56467:15;56463:19;;:1;:19;;;56445:240;;;56505:21;:9;:19;:21::i;:::-;56542:17;56562:19;:9;:17;:19::i;:::-;56542:39;;56602:22;56614:9;56602:22;;;;;;:::i;:::-;;;;;;;;56640:28;56646:10;56658:9;56640:5;:28::i;:::-;56445:240;56484:3;;;;;:::i;:::-;;;;56445:240;;;;55806:894;55726:986;53394:3327;:::o;25697:208::-;25769:7;25814:1;25797:19;;:5;:19;;;;25789:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25881:9;:16;25891:5;25881:16;;;;;;;;;;;;;;;;25874:23;;25697:208;;;:::o;3906:94::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3971:21:::1;3989:1;3971:9;:21::i;:::-;3906:94::o:0;52709:123::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52809:15:::1;52790:16;:34;;;;52709:123:::0;:::o;52127:75::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52189:5:::1;52174:12;;:20;;;;;;;;;;;;;;;;;;52127:75::o:0;52570:127::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52673:16:::1;52653:17;:36;;;;52570:127:::0;:::o;52459:99::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52541:9:::1;52528:10;:22;;;;52459:99:::0;:::o;52359:88::-;52398:7;52424:15;52417:22;;52359:88;:::o;3255:87::-;3301:7;3328:6;;;;;;;;;;;3321:13;;3255:87;:::o;51432:22::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;26442:104::-;26498:13;26531:7;26524:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26442:104;:::o;28125:295::-;28240:12;:10;:12::i;:::-;28228:24;;:8;:24;;;;28220:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28340:8;28295:18;:32;28314:12;:10;:12::i;:::-;28295:32;;;;;;;;;;;;;;;:42;28328:8;28295:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;28393:8;28364:48;;28379:12;:10;:12::i;:::-;28364:48;;;28403:8;28364:48;;;;;;:::i;:::-;;;;;;;;28125:295;;:::o;50731:33::-;;;;;;;;;:::o;50864:25::-;;;;:::o;52010:105::-;52063:8;52090:12;:17;52103:3;52090:17;;;;;;;;;;;;;;;;;;;;;52083:24;;52010:105;;;:::o;29388:328::-;29563:41;29582:12;:10;:12::i;:::-;29596:7;29563:18;:41::i;:::-;29555:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29669:39;29683:4;29689:2;29693:7;29702:5;29669:13;:39::i;:::-;29388:328;;;;:::o;26617:334::-;26690:13;26724:16;26732:7;26724;:16::i;:::-;26716:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;26805:21;26829:10;:8;:10::i;:::-;26805:34;;26881:1;26863:7;26857:21;:25;:86;;;;;;;;;;;;;;;;;26909:7;26918:18;:7;:16;:18::i;:::-;26892:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26857:86;26850:93;;;26617:334;;;:::o;50777:39::-;50812:4;50777:39;:::o;51381:44::-;;;;;;;;;;;;;;;;;;;;;;:::o;28491:164::-;28588:4;28612:18;:25;28631:5;28612:25;;;;;;;;;;;;;;;:35;28638:8;28612:35;;;;;;;;;;;;;;;;;;;;;;;;;28605:42;;28491:164;;;;:::o;4155:192::-;3486:12;:10;:12::i;:::-;3475:23;;:7;:5;:7::i;:::-;:23;;;3467:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4264:1:::1;4244:22;;:8;:22;;;;4236:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4320:19;4330:8;4320:9;:19::i;:::-;4155:192:::0;:::o;53082:168::-;53161:15;53195:13;;;;;;;;;;;:33;;;53229:5;53235:6;53195:47;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53188:54;;53082:168;;;;:::o;1008:127::-;1115:1;1097:7;:14;;;:19;;;;;;;;;;;1008:127;:::o;886:114::-;951:7;978;:14;;;971:21;;886:114;;;:::o;6366:157::-;6451:4;6490:25;6475:40;;;:11;:40;;;;6468:47;;6366:157;;;:::o;2100:98::-;2153:7;2180:10;2173:17;;2100:98;:::o;31226:127::-;31291:4;31343:1;31315:30;;:7;:16;31323:7;31315:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31308:37;;31226:127;;;:::o;35208:174::-;35310:2;35283:15;:24;35299:7;35283:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35366:7;35362:2;35328:46;;35337:23;35352:7;35337:14;:23::i;:::-;35328:46;;;;;;;;;;;;35208:174;;:::o;31520:348::-;31613:4;31638:16;31646:7;31638;:16::i;:::-;31630:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31714:13;31730:23;31745:7;31730:14;:23::i;:::-;31714:39;;31783:5;31772:16;;:7;:16;;;:51;;;;31816:7;31792:31;;:20;31804:7;31792:11;:20::i;:::-;:31;;;31772:51;:87;;;;31827:32;31844:5;31851:7;31827:16;:32::i;:::-;31772:87;31764:96;;;31520:348;;;;:::o;34512:578::-;34671:4;34644:31;;:23;34659:7;34644:14;:23::i;:::-;:31;;;34636:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34754:1;34740:16;;:2;:16;;;;34732:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34810:39;34831:4;34837:2;34841:7;34810:20;:39::i;:::-;34914:29;34931:1;34935:7;34914:8;:29::i;:::-;34975:1;34956:9;:15;34966:4;34956:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;35004:1;34987:9;:13;34997:2;34987:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35035:2;35016:7;:16;35024:7;35016:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35074:7;35070:2;35055:27;;35064:4;35055:27;;;;;;;;;;;;34512:578;;;:::o;51917:85::-;51988:4;51968:12;:17;51981:3;51968:17;;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;;51917:85;:::o;33204:382::-;33298:1;33284:16;;:2;:16;;;;33276:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33357:16;33365:7;33357;:16::i;:::-;33356:17;33348:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33419:45;33448:1;33452:2;33456:7;33419:20;:45::i;:::-;33494:1;33477:9;:13;33487:2;33477:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33525:2;33506:7;:16;33514:7;33506:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33570:7;33566:2;33545:33;;33562:1;33545:33;;;;;;;;;;;;33204:382;;:::o;4355:173::-;4411:16;4430:6;;;;;;;;;;;4411:25;;4456:8;4447:6;;:17;;;;;;;;;;;;;;;;;;4511:8;4480:40;;4501:8;4480:40;;;;;;;;;;;;4355:173;;:::o;30598:315::-;30755:28;30765:4;30771:2;30775:7;30755:9;:28::i;:::-;30802:48;30825:4;30831:2;30835:7;30844:5;30802:22;:48::i;:::-;30794:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30598:315;;;;:::o;52968:106::-;53020:13;53053;53046:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52968:106;:::o;6837:723::-;6893:13;7123:1;7114:5;:10;7110:53;;;7141:10;;;;;;;;;;;;;;;;;;;;;7110:53;7173:12;7188:5;7173:20;;7204:14;7229:78;7244:1;7236:4;:9;7229:78;;7262:8;;;;;:::i;:::-;;;;7293:2;7285:10;;;;;:::i;:::-;;;7229:78;;;7317:19;7349:6;7339:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7317:39;;7367:154;7383:1;7374:5;:10;7367:154;;7411:1;7401:11;;;;;:::i;:::-;;;7478:2;7470:5;:10;;;;:::i;:::-;7457:2;:24;;;;:::i;:::-;7444:39;;7427:6;7434;7427:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;7507:2;7498:11;;;;;:::i;:::-;;;7367:154;;;7545:6;7531:21;;;;;6837:723;;;;:::o;37322:126::-;;;;:::o;35947:803::-;36102:4;36123:15;:2;:13;;;:15::i;:::-;36119:624;;;36175:2;36159:36;;;36196:12;:10;:12::i;:::-;36210:4;36216:7;36225:5;36159:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36155:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36422:1;36405:6;:13;:18;36401:272;;;36448:60;;;;;;;;;;:::i;:::-;;;;;;;;36401:272;36623:6;36617:13;36608:6;36604:2;36600:15;36593:38;36155:533;36292:45;;;36282:55;;;:6;:55;;;;36275:62;;;;;36119:624;36727:4;36720:11;;35947:803;;;;;;;:::o;9412:387::-;9472:4;9680:12;9747:7;9735:20;9727:28;;9790:1;9783:4;:8;9776:15;;;9412:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;;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:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:143::-;;2097:6;2091:13;2082:22;;2113:33;2140:5;2113:33;:::i;:::-;2072:80;;;;:::o;2158:135::-;;2240:6;2227:20;2218:29;;2256:31;2281:5;2256:31;:::i;:::-;2208:85;;;;:::o;2299:262::-;;2407:2;2395:9;2386:7;2382:23;2378:32;2375:2;;;2423:1;2420;2413:12;2375:2;2466:1;2491:53;2536:7;2527:6;2516:9;2512:22;2491:53;:::i;:::-;2481:63;;2437:117;2365:196;;;;:::o;2567:407::-;;;2692:2;2680:9;2671:7;2667:23;2663:32;2660:2;;;2708:1;2705;2698:12;2660:2;2751:1;2776:53;2821:7;2812:6;2801:9;2797:22;2776:53;:::i;:::-;2766:63;;2722:117;2878:2;2904:53;2949:7;2940:6;2929:9;2925:22;2904:53;:::i;:::-;2894:63;;2849:118;2650:324;;;;;:::o;2980:552::-;;;;3122:2;3110:9;3101:7;3097:23;3093:32;3090:2;;;3138:1;3135;3128:12;3090:2;3181:1;3206:53;3251:7;3242:6;3231:9;3227:22;3206:53;:::i;:::-;3196:63;;3152:117;3308:2;3334:53;3379:7;3370:6;3359:9;3355:22;3334:53;:::i;:::-;3324:63;;3279:118;3436:2;3462:53;3507:7;3498:6;3487:9;3483:22;3462:53;:::i;:::-;3452:63;;3407:118;3080:452;;;;;:::o;3538:809::-;;;;;3706:3;3694:9;3685:7;3681:23;3677:33;3674:2;;;3723:1;3720;3713:12;3674:2;3766:1;3791:53;3836:7;3827:6;3816:9;3812:22;3791:53;:::i;:::-;3781:63;;3737:117;3893:2;3919:53;3964:7;3955:6;3944:9;3940:22;3919:53;:::i;:::-;3909:63;;3864:118;4021:2;4047:53;4092:7;4083:6;4072:9;4068:22;4047:53;:::i;:::-;4037:63;;3992:118;4177:2;4166:9;4162:18;4149:32;4208:18;4200:6;4197:30;4194:2;;;4240:1;4237;4230:12;4194:2;4268:62;4322:7;4313:6;4302:9;4298:22;4268:62;:::i;:::-;4258:72;;4120:220;3664:683;;;;;;;:::o;4353:401::-;;;4475:2;4463:9;4454:7;4450:23;4446:32;4443:2;;;4491:1;4488;4481:12;4443:2;4534:1;4559:53;4604:7;4595:6;4584:9;4580:22;4559:53;:::i;:::-;4549:63;;4505:117;4661:2;4687:50;4729:7;4720:6;4709:9;4705:22;4687:50;:::i;:::-;4677:60;;4632:115;4433:321;;;;;:::o;4760:407::-;;;4885:2;4873:9;4864:7;4860:23;4856:32;4853:2;;;4901:1;4898;4891:12;4853:2;4944:1;4969:53;5014:7;5005:6;4994:9;4990:22;4969:53;:::i;:::-;4959:63;;4915:117;5071:2;5097:53;5142:7;5133:6;5122:9;5118:22;5097:53;:::i;:::-;5087:63;;5042:118;4843:324;;;;;:::o;5173:260::-;;5280:2;5268:9;5259:7;5255:23;5251:32;5248:2;;;5296:1;5293;5286:12;5248:2;5339:1;5364:52;5408:7;5399:6;5388:9;5384:22;5364:52;:::i;:::-;5354:62;;5310:116;5238:195;;;;:::o;5439:282::-;;5557:2;5545:9;5536:7;5532:23;5528:32;5525:2;;;5573:1;5570;5563:12;5525:2;5616:1;5641:63;5696:7;5687:6;5676:9;5672:22;5641:63;:::i;:::-;5631:73;;5587:127;5515:206;;;;:::o;5727:375::-;;5845:2;5833:9;5824:7;5820:23;5816:32;5813:2;;;5861:1;5858;5851:12;5813:2;5932:1;5921:9;5917:17;5904:31;5962:18;5954:6;5951:30;5948:2;;;5994:1;5991;5984:12;5948:2;6022:63;6077:7;6068:6;6057:9;6053:22;6022:63;:::i;:::-;6012:73;;5875:220;5803:299;;;;:::o;6108:262::-;;6216:2;6204:9;6195:7;6191:23;6187:32;6184:2;;;6232:1;6229;6222:12;6184:2;6275:1;6300:53;6345:7;6336:6;6325:9;6321:22;6300:53;:::i;:::-;6290:63;;6246:117;6174:196;;;;:::o;6376:284::-;;6495:2;6483:9;6474:7;6470:23;6466:32;6463:2;;;6511:1;6508;6501:12;6463:2;6554:1;6579:64;6635:7;6626:6;6615:9;6611:22;6579:64;:::i;:::-;6569:74;;6525:128;6453:207;;;;:::o;6666:258::-;;6772:2;6760:9;6751:7;6747:23;6743:32;6740:2;;;6788:1;6785;6778:12;6740:2;6831:1;6856:51;6899:7;6890:6;6879:9;6875:22;6856:51;:::i;:::-;6846:61;;6802:115;6730:194;;;;:::o;6930:179::-;;7020:46;7062:3;7054:6;7020:46;:::i;:::-;7098:4;7093:3;7089:14;7075:28;;7010:99;;;;:::o;7115:118::-;7202:24;7220:5;7202:24;:::i;:::-;7197:3;7190:37;7180:53;;:::o;7269:732::-;;7417:54;7465:5;7417:54;:::i;:::-;7487:86;7566:6;7561:3;7487:86;:::i;:::-;7480:93;;7597:56;7647:5;7597:56;:::i;:::-;7676:7;7707:1;7692:284;7717:6;7714:1;7711:13;7692:284;;;7793:6;7787:13;7820:63;7879:3;7864:13;7820:63;:::i;:::-;7813:70;;7906:60;7959:6;7906:60;:::i;:::-;7896:70;;7752:224;7739:1;7736;7732:9;7727:14;;7692:284;;;7696:14;7992:3;7985:10;;7393:608;;;;;;;:::o;8007:109::-;8088:21;8103:5;8088:21;:::i;:::-;8083:3;8076:34;8066:50;;:::o;8122:360::-;;8236:38;8268:5;8236:38;:::i;:::-;8290:70;8353:6;8348:3;8290:70;:::i;:::-;8283:77;;8369:52;8414:6;8409:3;8402:4;8395:5;8391:16;8369:52;:::i;:::-;8446:29;8468:6;8446:29;:::i;:::-;8441:3;8437:39;8430:46;;8212:270;;;;;:::o;8488:364::-;;8604:39;8637:5;8604:39;:::i;:::-;8659:71;8723:6;8718:3;8659:71;:::i;:::-;8652:78;;8739:52;8784:6;8779:3;8772:4;8765:5;8761:16;8739:52;:::i;:::-;8816:29;8838:6;8816:29;:::i;:::-;8811:3;8807:39;8800:46;;8580:272;;;;;:::o;8858:377::-;;8992:39;9025:5;8992:39;:::i;:::-;9047:89;9129:6;9124:3;9047:89;:::i;:::-;9040:96;;9145:52;9190:6;9185:3;9178:4;9171:5;9167:16;9145:52;:::i;:::-;9222:6;9217:3;9213:16;9206:23;;8968:267;;;;;:::o;9241:366::-;;9404:67;9468:2;9463:3;9404:67;:::i;:::-;9397:74;;9480:93;9569:3;9480:93;:::i;:::-;9598:2;9593:3;9589:12;9582:19;;9387:220;;;:::o;9613:366::-;;9776:67;9840:2;9835:3;9776:67;:::i;:::-;9769:74;;9852:93;9941:3;9852:93;:::i;:::-;9970:2;9965:3;9961:12;9954:19;;9759:220;;;:::o;9985:366::-;;10148:67;10212:2;10207:3;10148:67;:::i;:::-;10141:74;;10224:93;10313:3;10224:93;:::i;:::-;10342:2;10337:3;10333:12;10326:19;;10131:220;;;:::o;10357:366::-;;10520:67;10584:2;10579:3;10520:67;:::i;:::-;10513:74;;10596:93;10685:3;10596:93;:::i;:::-;10714:2;10709:3;10705:12;10698:19;;10503:220;;;:::o;10729:366::-;;10892:67;10956:2;10951:3;10892:67;:::i;:::-;10885:74;;10968:93;11057:3;10968:93;:::i;:::-;11086:2;11081:3;11077:12;11070:19;;10875:220;;;:::o;11101:366::-;;11264:67;11328:2;11323:3;11264:67;:::i;:::-;11257:74;;11340:93;11429:3;11340:93;:::i;:::-;11458:2;11453:3;11449:12;11442:19;;11247:220;;;:::o;11473:366::-;;11636:67;11700:2;11695:3;11636:67;:::i;:::-;11629:74;;11712:93;11801:3;11712:93;:::i;:::-;11830:2;11825:3;11821:12;11814:19;;11619:220;;;:::o;11845:366::-;;12008:67;12072:2;12067:3;12008:67;:::i;:::-;12001:74;;12084:93;12173:3;12084:93;:::i;:::-;12202:2;12197:3;12193:12;12186:19;;11991:220;;;:::o;12217:366::-;;12380:67;12444:2;12439:3;12380:67;:::i;:::-;12373:74;;12456:93;12545:3;12456:93;:::i;:::-;12574:2;12569:3;12565:12;12558:19;;12363:220;;;:::o;12589:366::-;;12752:67;12816:2;12811:3;12752:67;:::i;:::-;12745:74;;12828:93;12917:3;12828:93;:::i;:::-;12946:2;12941:3;12937:12;12930:19;;12735:220;;;:::o;12961:366::-;;13124:67;13188:2;13183:3;13124:67;:::i;:::-;13117:74;;13200:93;13289:3;13200:93;:::i;:::-;13318:2;13313:3;13309:12;13302:19;;13107:220;;;:::o;13333:366::-;;13496:67;13560:2;13555:3;13496:67;:::i;:::-;13489:74;;13572:93;13661:3;13572:93;:::i;:::-;13690:2;13685:3;13681:12;13674:19;;13479:220;;;:::o;13705:366::-;;13868:67;13932:2;13927:3;13868:67;:::i;:::-;13861:74;;13944:93;14033:3;13944:93;:::i;:::-;14062:2;14057:3;14053:12;14046:19;;13851:220;;;:::o;14077:366::-;;14240:67;14304:2;14299:3;14240:67;:::i;:::-;14233:74;;14316:93;14405:3;14316:93;:::i;:::-;14434:2;14429:3;14425:12;14418:19;;14223:220;;;:::o;14449:366::-;;14612:67;14676:2;14671:3;14612:67;:::i;:::-;14605:74;;14688:93;14777:3;14688:93;:::i;:::-;14806:2;14801:3;14797:12;14790:19;;14595:220;;;:::o;14821:366::-;;14984:67;15048:2;15043:3;14984:67;:::i;:::-;14977:74;;15060:93;15149:3;15060:93;:::i;:::-;15178:2;15173:3;15169:12;15162:19;;14967:220;;;:::o;15193:366::-;;15356:67;15420:2;15415:3;15356:67;:::i;:::-;15349:74;;15432:93;15521:3;15432:93;:::i;:::-;15550:2;15545:3;15541:12;15534:19;;15339:220;;;:::o;15565:366::-;;15728:67;15792:2;15787:3;15728:67;:::i;:::-;15721:74;;15804:93;15893:3;15804:93;:::i;:::-;15922:2;15917:3;15913:12;15906:19;;15711:220;;;:::o;15937:366::-;;16100:67;16164:2;16159:3;16100:67;:::i;:::-;16093:74;;16176:93;16265:3;16176:93;:::i;:::-;16294:2;16289:3;16285:12;16278:19;;16083:220;;;:::o;16309:366::-;;16472:67;16536:2;16531:3;16472:67;:::i;:::-;16465:74;;16548:93;16637:3;16548:93;:::i;:::-;16666:2;16661:3;16657:12;16650:19;;16455:220;;;:::o;16681:366::-;;16844:67;16908:2;16903:3;16844:67;:::i;:::-;16837:74;;16920:93;17009:3;16920:93;:::i;:::-;17038:2;17033:3;17029:12;17022:19;;16827:220;;;:::o;17053:366::-;;17216:67;17280:2;17275:3;17216:67;:::i;:::-;17209:74;;17292:93;17381:3;17292:93;:::i;:::-;17410:2;17405:3;17401:12;17394:19;;17199:220;;;:::o;17425:366::-;;17588:67;17652:2;17647:3;17588:67;:::i;:::-;17581:74;;17664:93;17753:3;17664:93;:::i;:::-;17782:2;17777:3;17773:12;17766:19;;17571:220;;;:::o;17797:366::-;;17960:67;18024:2;18019:3;17960:67;:::i;:::-;17953:74;;18036:93;18125:3;18036:93;:::i;:::-;18154:2;18149:3;18145:12;18138:19;;17943:220;;;:::o;18169:115::-;18254:23;18271:5;18254:23;:::i;:::-;18249:3;18242:36;18232:52;;:::o;18290:108::-;18367:24;18385:5;18367:24;:::i;:::-;18362:3;18355:37;18345:53;;:::o;18404:118::-;18491:24;18509:5;18491:24;:::i;:::-;18486:3;18479:37;18469:53;;:::o;18528:435::-;;18730:95;18821:3;18812:6;18730:95;:::i;:::-;18723:102;;18842:95;18933:3;18924:6;18842:95;:::i;:::-;18835:102;;18954:3;18947:10;;18712:251;;;;;:::o;18969:222::-;;19100:2;19089:9;19085:18;19077:26;;19113:71;19181:1;19170:9;19166:17;19157:6;19113:71;:::i;:::-;19067:124;;;;:::o;19197:640::-;;19430:3;19419:9;19415:19;19407:27;;19444:71;19512:1;19501:9;19497:17;19488:6;19444:71;:::i;:::-;19525:72;19593:2;19582:9;19578:18;19569:6;19525:72;:::i;:::-;19607;19675:2;19664:9;19660:18;19651:6;19607:72;:::i;:::-;19726:9;19720:4;19716:20;19711:2;19700:9;19696:18;19689:48;19754:76;19825:4;19816:6;19754:76;:::i;:::-;19746:84;;19397:440;;;;;;;:::o;19843:332::-;;20002:2;19991:9;19987:18;19979:26;;20015:71;20083:1;20072:9;20068:17;20059:6;20015:71;:::i;:::-;20096:72;20164:2;20153:9;20149:18;20140:6;20096:72;:::i;:::-;19969:206;;;;;:::o;20181:373::-;;20362:2;20351:9;20347:18;20339:26;;20411:9;20405:4;20401:20;20397:1;20386:9;20382:17;20375:47;20439:108;20542:4;20533:6;20439:108;:::i;:::-;20431:116;;20329:225;;;;:::o;20560:210::-;;20685:2;20674:9;20670:18;20662:26;;20698:65;20760:1;20749:9;20745:17;20736:6;20698:65;:::i;:::-;20652:118;;;;:::o;20776:313::-;;20927:2;20916:9;20912:18;20904:26;;20976:9;20970:4;20966:20;20962:1;20951:9;20947:17;20940:47;21004:78;21077:4;21068:6;21004:78;:::i;:::-;20996:86;;20894:195;;;;:::o;21095:419::-;;21299:2;21288:9;21284:18;21276:26;;21348:9;21342:4;21338:20;21334:1;21323:9;21319:17;21312:47;21376:131;21502:4;21376:131;:::i;:::-;21368:139;;21266:248;;;:::o;21520:419::-;;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21691:248;;;:::o;21945:419::-;;22149:2;22138:9;22134:18;22126:26;;22198:9;22192:4;22188:20;22184:1;22173:9;22169:17;22162:47;22226:131;22352:4;22226:131;:::i;:::-;22218:139;;22116:248;;;:::o;22370:419::-;;22574:2;22563:9;22559:18;22551:26;;22623:9;22617:4;22613:20;22609:1;22598:9;22594:17;22587:47;22651:131;22777:4;22651:131;:::i;:::-;22643:139;;22541:248;;;:::o;22795:419::-;;22999:2;22988:9;22984:18;22976:26;;23048:9;23042:4;23038:20;23034:1;23023:9;23019:17;23012:47;23076:131;23202:4;23076:131;:::i;:::-;23068:139;;22966:248;;;:::o;23220:419::-;;23424:2;23413:9;23409:18;23401:26;;23473:9;23467:4;23463:20;23459:1;23448:9;23444:17;23437:47;23501:131;23627:4;23501:131;:::i;:::-;23493:139;;23391:248;;;:::o;23645:419::-;;23849:2;23838:9;23834:18;23826:26;;23898:9;23892:4;23888:20;23884:1;23873:9;23869:17;23862:47;23926:131;24052:4;23926:131;:::i;:::-;23918:139;;23816:248;;;:::o;24070:419::-;;24274:2;24263:9;24259:18;24251:26;;24323:9;24317:4;24313:20;24309:1;24298:9;24294:17;24287:47;24351:131;24477:4;24351:131;:::i;:::-;24343:139;;24241:248;;;:::o;24495:419::-;;24699:2;24688:9;24684:18;24676:26;;24748:9;24742:4;24738:20;24734:1;24723:9;24719:17;24712:47;24776:131;24902:4;24776:131;:::i;:::-;24768:139;;24666:248;;;:::o;24920:419::-;;25124:2;25113:9;25109:18;25101:26;;25173:9;25167:4;25163:20;25159:1;25148:9;25144:17;25137:47;25201:131;25327:4;25201:131;:::i;:::-;25193:139;;25091:248;;;:::o;25345:419::-;;25549:2;25538:9;25534:18;25526:26;;25598:9;25592:4;25588:20;25584:1;25573:9;25569:17;25562:47;25626:131;25752:4;25626:131;:::i;:::-;25618:139;;25516:248;;;:::o;25770:419::-;;25974:2;25963:9;25959:18;25951:26;;26023:9;26017:4;26013:20;26009:1;25998:9;25994:17;25987:47;26051:131;26177:4;26051:131;:::i;:::-;26043:139;;25941:248;;;:::o;26195:419::-;;26399:2;26388:9;26384:18;26376:26;;26448:9;26442:4;26438:20;26434:1;26423:9;26419:17;26412:47;26476:131;26602:4;26476:131;:::i;:::-;26468:139;;26366:248;;;:::o;26620:419::-;;26824:2;26813:9;26809:18;26801:26;;26873:9;26867:4;26863:20;26859:1;26848:9;26844:17;26837:47;26901:131;27027:4;26901:131;:::i;:::-;26893:139;;26791:248;;;:::o;27045:419::-;;27249:2;27238:9;27234:18;27226:26;;27298:9;27292:4;27288:20;27284:1;27273:9;27269:17;27262:47;27326:131;27452:4;27326:131;:::i;:::-;27318:139;;27216:248;;;:::o;27470:419::-;;27674:2;27663:9;27659:18;27651:26;;27723:9;27717:4;27713:20;27709:1;27698:9;27694:17;27687:47;27751:131;27877:4;27751:131;:::i;:::-;27743:139;;27641:248;;;:::o;27895:419::-;;28099:2;28088:9;28084:18;28076:26;;28148:9;28142:4;28138:20;28134:1;28123:9;28119:17;28112:47;28176:131;28302:4;28176:131;:::i;:::-;28168:139;;28066:248;;;:::o;28320:419::-;;28524:2;28513:9;28509:18;28501:26;;28573:9;28567:4;28563:20;28559:1;28548:9;28544:17;28537:47;28601:131;28727:4;28601:131;:::i;:::-;28593:139;;28491:248;;;:::o;28745:419::-;;28949:2;28938:9;28934:18;28926:26;;28998:9;28992:4;28988:20;28984:1;28973:9;28969:17;28962:47;29026:131;29152:4;29026:131;:::i;:::-;29018:139;;28916:248;;;:::o;29170:419::-;;29374:2;29363:9;29359:18;29351:26;;29423:9;29417:4;29413:20;29409:1;29398:9;29394:17;29387:47;29451:131;29577:4;29451:131;:::i;:::-;29443:139;;29341:248;;;:::o;29595:419::-;;29799:2;29788:9;29784:18;29776:26;;29848:9;29842:4;29838:20;29834:1;29823:9;29819:17;29812:47;29876:131;30002:4;29876:131;:::i;:::-;29868:139;;29766:248;;;:::o;30020:419::-;;30224:2;30213:9;30209:18;30201:26;;30273:9;30267:4;30263:20;30259:1;30248:9;30244:17;30237:47;30301:131;30427:4;30301:131;:::i;:::-;30293:139;;30191:248;;;:::o;30445:419::-;;30649:2;30638:9;30634:18;30626:26;;30698:9;30692:4;30688:20;30684:1;30673:9;30669:17;30662:47;30726:131;30852:4;30726:131;:::i;:::-;30718:139;;30616:248;;;:::o;30870:419::-;;31074:2;31063:9;31059:18;31051:26;;31123:9;31117:4;31113:20;31109:1;31098:9;31094:17;31087:47;31151:131;31277:4;31151:131;:::i;:::-;31143:139;;31041:248;;;:::o;31295:218::-;;31424:2;31413:9;31409:18;31401:26;;31437:69;31503:1;31492:9;31488:17;31479:6;31437:69;:::i;:::-;31391:122;;;;:::o;31519:222::-;;31650:2;31639:9;31635:18;31627:26;;31663:71;31731:1;31720:9;31716:17;31707:6;31663:71;:::i;:::-;31617:124;;;;:::o;31747:129::-;;31808:20;;:::i;:::-;31798:30;;31837:33;31865:4;31857:6;31837:33;:::i;:::-;31788:88;;;:::o;31882:75::-;;31948:2;31942:9;31932:19;;31922:35;:::o;31963:307::-;;32114:18;32106:6;32103:30;32100:2;;;32136:18;;:::i;:::-;32100:2;32174:29;32196:6;32174:29;:::i;:::-;32166:37;;32258:4;32252;32248:15;32240:23;;32029:241;;;:::o;32276:308::-;;32428:18;32420:6;32417:30;32414:2;;;32450:18;;:::i;:::-;32414:2;32488:29;32510:6;32488:29;:::i;:::-;32480:37;;32572:4;32566;32562:15;32554:23;;32343:241;;;:::o;32590:132::-;;32680:3;32672:11;;32710:4;32705:3;32701:14;32693:22;;32662:60;;;:::o;32728:114::-;;32829:5;32823:12;32813:22;;32802:40;;;:::o;32848:98::-;;32933:5;32927:12;32917:22;;32906:40;;;:::o;32952:99::-;;33038:5;33032:12;33022:22;;33011:40;;;:::o;33057:113::-;;33159:4;33154:3;33150:14;33142:22;;33132:38;;;:::o;33176:184::-;;33309:6;33304:3;33297:19;33349:4;33344:3;33340:14;33325:29;;33287:73;;;;:::o;33366:168::-;;33483:6;33478:3;33471:19;33523:4;33518:3;33514:14;33499:29;;33461:73;;;;:::o;33540:169::-;;33658:6;33653:3;33646:19;33698:4;33693:3;33689:14;33674:29;;33636:73;;;;:::o;33715:148::-;;33854:3;33839:18;;33829:34;;;;:::o;33869:305::-;;33928:20;33946:1;33928:20;:::i;:::-;33923:25;;33962:20;33980:1;33962:20;:::i;:::-;33957:25;;34116:1;34048:66;34044:74;34041:1;34038:81;34035:2;;;34122:18;;:::i;:::-;34035:2;34166:1;34163;34159:9;34152:16;;33913:261;;;;:::o;34180:185::-;;34237:20;34255:1;34237:20;:::i;:::-;34232:25;;34271:20;34289:1;34271:20;:::i;:::-;34266:25;;34310:1;34300:2;;34315:18;;:::i;:::-;34300:2;34357:1;34354;34350:9;34345:14;;34222:143;;;;:::o;34371:348::-;;34434:20;34452:1;34434:20;:::i;:::-;34429:25;;34468:20;34486:1;34468:20;:::i;:::-;34463:25;;34656:1;34588:66;34584:74;34581:1;34578:81;34573:1;34566:9;34559:17;34555:105;34552:2;;;34663:18;;:::i;:::-;34552:2;34711:1;34708;34704:9;34693:20;;34419:300;;;;:::o;34725:191::-;;34785:20;34803:1;34785:20;:::i;:::-;34780:25;;34819:20;34837:1;34819:20;:::i;:::-;34814:25;;34858:1;34855;34852:8;34849:2;;;34863:18;;:::i;:::-;34849:2;34908:1;34905;34901:9;34893:17;;34770:146;;;;:::o;34922:96::-;;34988:24;35006:5;34988:24;:::i;:::-;34977:35;;34967:51;;;:::o;35024:90::-;;35101:5;35094:13;35087:21;35076:32;;35066:48;;;:::o;35120:149::-;;35196:66;35189:5;35185:78;35174:89;;35164:105;;;:::o;35275:89::-;;35351:6;35344:5;35340:18;35329:29;;35319:45;;;:::o;35370:126::-;;35447:42;35440:5;35436:54;35425:65;;35415:81;;;:::o;35502:77::-;;35568:5;35557:16;;35547:32;;;:::o;35585:86::-;;35660:4;35653:5;35649:16;35638:27;;35628:43;;;:::o;35677:154::-;35761:6;35756:3;35751;35738:30;35823:1;35814:6;35809:3;35805:16;35798:27;35728:103;;;:::o;35837:307::-;35905:1;35915:113;35929:6;35926:1;35923:13;35915:113;;;36014:1;36009:3;36005:11;35999:18;35995:1;35990:3;35986:11;35979:39;35951:2;35948:1;35944:10;35939:15;;35915:113;;;36046:6;36043:1;36040:13;36037:2;;;36126:1;36117:6;36112:3;36108:16;36101:27;36037:2;35886:258;;;;:::o;36150:320::-;;36231:1;36225:4;36221:12;36211:22;;36278:1;36272:4;36268:12;36299:18;36289:2;;36355:4;36347:6;36343:17;36333:27;;36289:2;36417;36409:6;36406:14;36386:18;36383:38;36380:2;;;36436:18;;:::i;:::-;36380:2;36201:269;;;;:::o;36476:281::-;36559:27;36581:4;36559:27;:::i;:::-;36551:6;36547:40;36689:6;36677:10;36674:22;36653:18;36641:10;36638:34;36635:62;36632:2;;;36700:18;;:::i;:::-;36632:2;36740:10;36736:2;36729:22;36519:238;;;:::o;36763:233::-;;36825:24;36843:5;36825:24;:::i;:::-;36816:33;;36871:66;36864:5;36861:77;36858:2;;;36941:18;;:::i;:::-;36858:2;36988:1;36981:5;36977:13;36970:20;;36806:190;;;:::o;37002:167::-;;37062:22;37078:5;37062:22;:::i;:::-;37053:31;;37106:4;37099:5;37096:15;37093:2;;;37114:18;;:::i;:::-;37093:2;37161:1;37154:5;37150:13;37143:20;;37043:126;;;:::o;37175:176::-;;37224:20;37242:1;37224:20;:::i;:::-;37219:25;;37258:20;37276:1;37258:20;:::i;:::-;37253:25;;37297:1;37287:2;;37302:18;;:::i;:::-;37287:2;37343:1;37340;37336:9;37331:14;;37209:142;;;;:::o;37357:180::-;37405:77;37402:1;37395:88;37502:4;37499:1;37492:15;37526:4;37523:1;37516:15;37543:180;37591:77;37588:1;37581:88;37688:4;37685:1;37678:15;37712:4;37709:1;37702:15;37729:180;37777:77;37774:1;37767:88;37874:4;37871:1;37864:15;37898:4;37895:1;37888:15;37915:180;37963:77;37960:1;37953:88;38060:4;38057:1;38050:15;38084:4;38081:1;38074:15;38101:102;;38193:2;38189:7;38184:2;38177:5;38173:14;38169:28;38159:38;;38149:54;;;:::o;38209:237::-;38349:34;38345:1;38337:6;38333:14;38326:58;38418:20;38413:2;38405:6;38401:15;38394:45;38315:131;:::o;38452:180::-;38592:32;38588:1;38580:6;38576:14;38569:56;38558:74;:::o;38638:225::-;38778:34;38774:1;38766:6;38762:14;38755:58;38847:8;38842:2;38834:6;38830:15;38823:33;38744:119;:::o;38869:164::-;39009:16;39005:1;38997:6;38993:14;38986:40;38975:58;:::o;39039:178::-;39179:30;39175:1;39167:6;39163:14;39156:54;39145:72;:::o;39223:174::-;39363:26;39359:1;39351:6;39347:14;39340:50;39329:68;:::o;39403:223::-;39543:34;39539:1;39531:6;39527:14;39520:58;39612:6;39607:2;39599:6;39595:15;39588:31;39509:117;:::o;39632:175::-;39772:27;39768:1;39760:6;39756:14;39749:51;39738:69;:::o;39813:172::-;39953:24;39949:1;39941:6;39937:14;39930:48;39919:66;:::o;39991:231::-;40131:34;40127:1;40119:6;40115:14;40108:58;40200:14;40195:2;40187:6;40183:15;40176:39;40097:125;:::o;40228:250::-;40368:34;40364:1;40356:6;40352:14;40345:58;40437:33;40432:2;40424:6;40420:15;40413:58;40334:144;:::o;40484:243::-;40624:34;40620:1;40612:6;40608:14;40601:58;40693:26;40688:2;40680:6;40676:15;40669:51;40590:137;:::o;40733:229::-;40873:34;40869:1;40861:6;40857:14;40850:58;40942:12;40937:2;40929:6;40925:15;40918:37;40839:123;:::o;40968:228::-;41108:34;41104:1;41096:6;41092:14;41085:58;41177:11;41172:2;41164:6;41160:15;41153:36;41074:122;:::o;41202:182::-;41342:34;41338:1;41330:6;41326:14;41319:58;41308:76;:::o;41390:166::-;41530:18;41526:1;41518:6;41514:14;41507:42;41496:60;:::o;41562:231::-;41702:34;41698:1;41690:6;41686:14;41679:58;41771:14;41766:2;41758:6;41754:15;41747:39;41668:125;:::o;41799:182::-;41939:34;41935:1;41927:6;41923:14;41916:58;41905:76;:::o;41987:228::-;42127:34;42123:1;42115:6;42111:14;42104:58;42196:11;42191:2;42183:6;42179:15;42172:36;42093:122;:::o;42221:234::-;42361:34;42357:1;42349:6;42345:14;42338:58;42430:17;42425:2;42417:6;42413:15;42406:42;42327:128;:::o;42461:220::-;42601:34;42597:1;42589:6;42585:14;42578:58;42670:3;42665:2;42657:6;42653:15;42646:28;42567:114;:::o;42687:172::-;42827:24;42823:1;42815:6;42811:14;42804:48;42793:66;:::o;42865:236::-;43005:34;43001:1;42993:6;42989:14;42982:58;43074:19;43069:2;43061:6;43057:15;43050:44;42971:130;:::o;43107:250::-;43247:34;43243:1;43235:6;43231:14;43224:58;43316:33;43311:2;43303:6;43299:15;43292:58;43213:144;:::o;43363:122::-;43436:24;43454:5;43436:24;:::i;:::-;43429:5;43426:35;43416:2;;43475:1;43472;43465:12;43416:2;43406:79;:::o;43491:116::-;43561:21;43576:5;43561:21;:::i;:::-;43554:5;43551:32;43541:2;;43597:1;43594;43587:12;43541:2;43531:76;:::o;43613:120::-;43685:23;43702:5;43685:23;:::i;:::-;43678:5;43675:34;43665:2;;43723:1;43720;43713:12;43665:2;43655:78;:::o;43739:122::-;43812:24;43830:5;43812:24;:::i;:::-;43805:5;43802:35;43792:2;;43851:1;43848;43841:12;43792:2;43782:79;:::o;43867:118::-;43938:22;43954:5;43938:22;:::i;:::-;43931:5;43928:33;43918:2;;43975:1;43972;43965:12;43918:2;43908:77;:::o

Swarm Source

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