ETH Price: $2,644.09 (+1.12%)

Token

Tribes of the Aftermath TOTA (TOTA)
 

Overview

Max Total Supply

1,146 TOTA

Holders

0

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 0 Decimals)

Balance
0 TOTA

Value
$0.00
0xaf81ded8d27faba4ad5fbd4f30be3521228ab2fe
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:
TribesOfTheAftermathTOTA

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-16
*/

// SPDX-License-Identifier: MIT

/**
  * @title T.O.T.A Contract by 7K Labs - Props to Chiru Labs for that erc721A goodness
  *   
  *   __________________________________________________________ 
  *  /\____/\\\\\\\\\\\\\\\___/\\\______/\\\_____/\\\___________\
  *  \/\___\/////////////\\\__\/\\\____/\\\/_____\/\\\___________\
  *   \/\______________/\\\/___\/\\\__/\\\/_______\/\\\___________\
  *    \/\____________/\\\/_____\/\\\/\\\/_________\/\\\___________\
  *     \/\__________/\\\/_______\/\\\\/\\\_________\/\\\___________\
  *      \/\________/\\\/_________\/\\\\///\\\_______\/\\\___________\
  *       \/\______/\\\/___________\/\\\__\///\\\_____\/\\\___________\
  *        \/\____/\\\/_____________\/\\\____\///\\\___\/\\\\\\\\\\\\\_\
  *         \/\___\///_______________\///_______\///____\/////////////__\
  *          \/\_________________________________________________________\
  *           \/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/
  *
  */


// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


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

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

// File: https://github.com/chiru-labs/ERC721A/blob/main/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;









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

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

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

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
    }

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex times
        unchecked {
            return _currentIndex - _burnCounter;    
        }
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (!ownership.burned) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }
        revert TokenIndexOutOfBounds();
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     * This read function is O(totalSupply). If calling from a separate contract, be sure to test gas first.
     * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view override returns (uint256) {
        if (index >= balanceOf(owner)) revert OwnerIndexOutOfBounds();
        uint256 numMintedSoFar = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when
        // uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; i < numMintedSoFar; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    if (tokenIdsIdx == index) {
                        return i;
                    }
                    tokenIdsIdx++;
                }
            }
        }

        // Execution should never reach this point.
        revert();
    }

    /**
     * @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 ||
            interfaceId == type(IERC721Enumerable).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (!_checkOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

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

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

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

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

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

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

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe && !_checkOnERC721Received(address(0), to, updatedIndex, _data)) {
                    revert TransferToNonERC721ReceiverImplementer();
                }
                updatedIndex++;
            }

            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

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

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

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 TransferToNonERC721ReceiverImplementer();
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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


pragma solidity >=0.7.0 <0.9.0;

contract TribesOfTheAftermathTOTA is ERC721A, Ownable {

    using Strings for uint256;

    string internal contractName = "Tribes of the Aftermath TOTA";
    string internal contractAbbr = "TOTA";

    string public uriPrefix = "";
    string public uriSuffix = "";
    string public hiddenMetadataUri = "ipfs://QmQF6vN693xtnbtGNw4HVT6UdmQKuxvDxe59dG8w3NzaHv/tota.json";
    bool public isRevealed = false;
    
    uint256 public preSaleCost = 0.08 ether;
    uint256 public pubSaleCost = 0.08 ether;
    
    uint256 public maxPreSalePerWallet = 5;
    uint256 public maxPubSalePerWallet = 20;
    uint256 public maxMintAmountPerTx = 10;

    uint256 public maxSupply = 8888;
    uint256 private ownerMintOnDeployment = 1;
    uint256 private ownerReserved = 150;

    bool public isSaleActive = false;
    bool public isPreSaleActive = true;

    // 0 = bypass, 1 = off-chain, 2 = on-chain
    uint256 public preSaleType = 1;
    address[] internal whitelistedAddresses;
    bytes32 public merkleRoot = 0xc6d7e6e2d994b666611235bdf1714dc30f20b966386a81ce610273f349dedb39;

    // team wallet addresses
    address internal raWallet = 0xe23D436Fc2F715d2B4Ec402511965E1474699fc9;
    address internal jrWallet = 0x6E035e0Dbd225E97AA171b87902ce6fe8527f16C;
    address internal tmWallet = 0xDac0B32df6DCFE658Af3bd1Fdf0c95D2af0b678A;
    address internal dgWallet = 0x6d587352dF7e0C377E87983586459609e9baf94e;
    address internal scWallet = 0xa130D1133Ef1A84F39B84467b16f5A0DD0577d4A;
    address internal spWallet = 0x56df8E01CC2fE2e1e01f6A0ee9B79c5aE54f3560;
    address internal devWallet = 0x1C81E289886544A04691936B13570e9B35495746;
    address internal teamWallet = 0x1C5b3F89D3Acf80223E2484897D2e38cF61E7c20;


    constructor() ERC721A(contractName, contractAbbr) {
        setHiddenMetadataUri(hiddenMetadataUri);
        _safeMint(teamWallet, ownerMintOnDeployment);
    }

    /**
     * @dev keeps track of the wallets that have minted during the whitelist and how many tokens they have minted
     */
    struct Minter {
        bool exists;
        uint256 hasMintedByWhitelist;
        uint256 hasMintedInPublicSale;
    }
    mapping(address => Minter) public minters;

    /**
     * @dev public mint function takes in the amount of tokens to mint
     */
    function mintPubSale(uint256 _mintAmount) public payable {
        require(isSaleActive, "Sale is not active!");
        require(!isPreSaleActive, "Pre Sale is active!");
        require(totalSupply() + _mintAmount <= maxSupply - ownerReserved, "Max supply exceeded!");
        require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
        require(msg.value >= pubSaleCost * _mintAmount, "Insufficient funds!");
        require(
            minters[msg.sender].hasMintedInPublicSale + _mintAmount <= maxPubSalePerWallet,
            "Exceeds per wallet limit."
        );
        if (!minters[msg.sender].exists) minters[msg.sender].exists = true;
        minters[msg.sender].hasMintedInPublicSale = minters[msg.sender].hasMintedInPublicSale + _mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    /**
     * @dev presale mint function takes in the amount of tokens to mint and the proof for the merkel tree
     *      if the merkle tree is not being used then feed in an empty array ([]) or if doing it from 
     *      etherscan feed in 0x0000000000000000000000000000000000000000000000000000000000000000
     */
    function mintPreSale(uint256 _mintAmount, bytes32[] calldata _markleProof) public payable {
        require(isSaleActive, "Sale is not active!");
        require(totalSupply() + _mintAmount <= maxSupply - ownerReserved, "Max supply exceeded!");
        require(isPreSaleActive, "Pre Sale is not active!");
        require(msg.value >= preSaleCost * _mintAmount, "Insufficient funds!");
        require(_mintAmount > 0, "Invalid mint amount!");
        require(_mintAmount <= maxPreSalePerWallet, "Exceeds per wallet presale limit.");
        if (preSaleType == 1) require(isWhitelistedByMerkle(_markleProof, msg.sender), "You are not whitelisted.");
        if (preSaleType == 2) require(isWhitelistedByAddress(msg.sender), "You are not whitelisted.");
        require(
            minters[msg.sender].hasMintedByWhitelist + _mintAmount <= maxPreSalePerWallet,
            "Exceeds per wallet presale limit."
        );
        if (!minters[msg.sender].exists) minters[msg.sender].exists = true;
        minters[msg.sender].hasMintedByWhitelist = minters[msg.sender].hasMintedByWhitelist + _mintAmount;
        _safeMint(msg.sender, _mintAmount);
    }

    /**
     * @dev returns an array of token IDs that the wallet owns
     */
    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 ownerTokenCount = balanceOf(_owner);
        uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
        uint256 currentTokenId = 0;
        uint256 ownedTokenIndex = 0;
        while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
            address currentTokenOwner = ownerOf(currentTokenId);
            if (currentTokenOwner == _owner) {
                ownedTokenIds[ownedTokenIndex] = currentTokenId;
                ownedTokenIndex++;
            }
            currentTokenId++;
        }
        return ownedTokenIds;
    }

    /**
     * @dev tests whether the wallet address has been whitelisted by the merkle tree by verifying  
     *      the proof provided to the function
     */
    function isWhitelistedByMerkle(bytes32[] calldata _markleProof, address _user) public view returns(bool) {
        bytes32 leaf = keccak256(abi.encodePacked(_user));
        return MerkleProof.verify(_markleProof, merkleRoot, leaf);
    }

    /**
     * @dev tests whether the wallet address has been whitelisted by the checking the whitelistedAddresses  
     *      array and returning a true/false flag
     */
    function isWhitelistedByAddress(address _user) public view returns (bool) {
        for (uint i = 0; i < whitelistedAddresses.length; i++) {
            if (whitelistedAddresses[i] == _user) {
                return true;
            }
        }
        return false;
    }

    /**
     * @dev a simple `is whitelisted` function which tests the following things
     *      1) is the sale is active and the presale not active (public sale is active) - returns true
     *      2) presale type is 1 (merkle tree) - calls the isWhitelistedByMerkle() function
     *      3) presale type is 2 (standard whitelist) - calls the isWhitelistedByAddress() function
     *      4) if the above is not met, then return false
     */
    function isWhitelisted(bytes32[] calldata _markleProof, address _user) public view returns(bool) {
        if (isSaleActive && !isPreSaleActive) {
            return true;
        }
        if (preSaleType == 0) {
            return true;
        }
        if (preSaleType == 1) {
            return isWhitelistedByMerkle(_markleProof, _user);
        }
        if (preSaleType == 2) {
            return isWhitelistedByAddress(_user);
        }
        return false;
    }

    /**
     * @dev returns all whitelisted addresses in an array
     */
    function getWhitelistAddresses() public view returns(address[] memory) {
        return whitelistedAddresses;
    }

    /**
     * @dev returns the token URI - will return the hidden metadata if the isRevealed state is false
     */
    function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
        require(_exists(_tokenId),"ERC721Metadata: URI query for nonexistent token");
        if (isRevealed == false) {
            return hiddenMetadataUri;
        }
        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0
            ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
            : "";
    }

    /**
     * @dev returns the base token sufix
     */
    function _baseURI() internal view virtual override returns (string memory) {
        return uriPrefix;
    }

    /**
     * @dev returns the remaining public supply
     */
    function getRemainingPublicSupply() public view returns (uint256) {
        return maxSupply - ownerReserved - totalSupply();
    }

    /**
     * @dev returns the remaining reserved supply
     */
    function getRemainingReservedSupply() public view returns (uint256) {
        return ownerReserved;
    }

    // 
    // only owner functions

    /**
     * @dev sets the presale type - 1 is merkle tree validation and 2 is standard whitelist array
     */
    function setPreSaleType(uint8 _type) public onlyOwner {
        // 0 = bypass whitelist, 1 = merkle tree, 2 = wl addresses
        require(_type == 0 || _type == 1 || _type == 2, "Invalid whitelist type.");
        preSaleType = _type;
    }

    /**
     * @dev sets the merkle root for the verification (wl type 1)
     */
    function setMerkleRoot(bytes32 _merkleRoot) public onlyOwner {
        merkleRoot = _merkleRoot;
    }

    /**
     * @dev sets the array for the whitelists (wl type 2) 
     *      this will reset the original whitelist with whatever is set here. therefore the entire
     *      whitelist needs to be provided again
     */
    function setWhitelistAddresses(address[] calldata _users) public onlyOwner {
        delete whitelistedAddresses;
        whitelistedAddresses = _users;
    }

    /**
     * @dev allows the contract owner to manually mint a set amount to a specified wallet address
     *      where only the gas needs to be paid. these tokens come out of the public supply
     */
    function sendPublicTokenToAddr(uint256 _mintAmount, address _receiver) public onlyOwner {
        require(totalSupply() + _mintAmount <= maxSupply - ownerReserved, "Max supply exceeded!");
        require(_mintAmount > 0, "Invalid mint amount");
        _safeMint(_receiver, _mintAmount);
    }

    /**
     * @dev allows the contract owner to manually mint a set amount to a specified wallet address
     *      where only the gas needs to be paid. these tokens come out of the reserved/non-public supply
     */
    function sendReservedTokenToAddr(uint256 _mintAmount, address _receiver) public onlyOwner {
        require(ownerReserved > 0 && _mintAmount <= ownerReserved, "Exceeds reserved supply!");
        require(_mintAmount > 0, "Invalid mint amount");
        require(totalSupply() + _mintAmount <= maxSupply, "Max supply exceeded!");
        setReservedSupply(ownerReserved - _mintAmount);
        _safeMint(_receiver, _mintAmount);
    }

    /**
     * @dev allows the contract owner to change the amount they have reserved 
     */
    function setReservedSupply(uint256 _amount) public onlyOwner {
        require(_amount >= 0 && _amount <= maxSupply - totalSupply(), "Exceeds remaining supply!");
        ownerReserved = _amount;
    }

    /**
     * @dev flips the revealed state from false to true. it can be flipped back but all metadata on OpenSea 
     *      would need to be refresed again.
     */
    function flipRevealedState() public onlyOwner {
        isRevealed = !isRevealed;
    }

    /**
     * @dev sets the presale price of the token. this has to be sent through in wei and not eth
     *      eg 1 eth = 1000000000000000000 wei
     */
    function setPreSaleCost(uint256 _cost) public onlyOwner {
        preSaleCost = _cost;
    }

    /**
     * @dev sets the public sale price of the token. this has to be sent through in wei and not eth
     *      eg 1 eth = 1000000000000000000 wei
     */
    function setPubSaleCost(uint256 _cost) public onlyOwner {
        pubSaleCost = _cost;
    }

    /**
     * @dev sets the max amount per transaction in the public sale
     */
    function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
        maxMintAmountPerTx = _maxMintAmountPerTx;
    }

    /**
     * @dev sets the max amount per wallet in the presale
     */
    function setMaxPreSalePerWallet(uint256 _maxMintAmount) public onlyOwner {
        require(_maxMintAmount > 0, "Must be greater than zero");
        maxPreSalePerWallet = _maxMintAmount;
    }

    /**
     * @dev sets the max amount per wallet in the public sale
     */
    function setMaxPubSalePerWallet(uint256 _maxMintAmount) public onlyOwner {
        require(_maxMintAmount > 0, "Must be greater than zero");
        maxPubSalePerWallet = _maxMintAmount;
    }

    /**
     * @dev sets the not revealed metadata path (if using ipfs if must be entered ipfs://<CID>/hidden.json)
     */
    function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
        hiddenMetadataUri = _hiddenMetadataUri;
    }

    /**
     * @dev sets the path to the token (if using ipfs if must be entered ipfs://<CID>/) with the trailing slash
     *      an api can just be called as eg https://api.myurl.com/token/
     */
    function setUriPrefix(string memory _uriPrefix) public onlyOwner {
        uriPrefix = _uriPrefix;
    }

    /**
     * @dev sets the uri suffix (ie if the metadata is stored on ipfs this should be set to .json)
     */
    function setUriSuffix(string memory _uriSuffix) public onlyOwner {
        uriSuffix = _uriSuffix;
    }

    /**
     * @dev sets the uri suffix to blank if it has been set and you want to use an api to call your metadata
     */
    function setUriSuffixToBlank() public onlyOwner {
        uriSuffix = "";
    }

    /**
     * @dev sets the sale state (either true to false or false to true) this must be set to true for any 
     *      public minting to occur (even the presale)
     */
    function flipSaleState() public onlyOwner {
        isSaleActive = !isSaleActive;
    }

    /**
     * @dev sets the presale state (either true to false or false to true) this must be set to true for any 
     *      presale functionality to occur)
     */
    function flipPreSaleState() public onlyOwner {
        isPreSaleActive = !isPreSaleActive;
    }

    /**
     * @dev called to withdraw funds from the contract. this will pay x% to a developer wallet and the remaining balance 
     *      to the contract owner. the dev wallet and % are set at the top of this contract
     */
    function withdraw() public onlyOwner {

        uint256 _balance = address(this).balance;

        (bool ra, ) = payable(raWallet).call{value: _balance * 14 / 100}("");
        require(ra);

        (bool jr, ) = payable(jrWallet).call{value: _balance * 28 / 100}("");
        require(jr);

        (bool tm, ) = payable(tmWallet).call{value: _balance * 3 / 100}("");
        require(tm);

        (bool dg, ) = payable(dgWallet).call{value: _balance * 4 / 100}("");
        require(dg);

        (bool sc, ) = payable(scWallet).call{value: _balance * 15 / 100}("");
        require(sc);

        (bool sp, ) = payable(spWallet).call{value: _balance * 8 / 100}("");
        require(sp);

        (bool dw, ) = payable(devWallet).call{value: _balance * 10 / 100}("");
        require(dw);

        (bool tw, ) = payable(teamWallet).call{value: address(this).balance}("");
        require(tw);
    }


}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TokenIndexOutOfBounds","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipRevealedState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingPublicSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRemainingReservedSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getWhitelistAddresses","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"isPreSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_markleProof","type":"bytes32[]"},{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelistedByAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"_markleProof","type":"bytes32[]"},{"internalType":"address","name":"_user","type":"address"}],"name":"isWhitelistedByMerkle","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPreSalePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPubSalePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"bytes32[]","name":"_markleProof","type":"bytes32[]"}],"name":"mintPreSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mintPubSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"bool","name":"exists","type":"bool"},{"internalType":"uint256","name":"hasMintedByWhitelist","type":"uint256"},{"internalType":"uint256","name":"hasMintedInPublicSale","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pubSaleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"sendPublicTokenToAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"sendReservedTokenToAddr","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxPreSalePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxPubSalePerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPreSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"setPreSaleType","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_cost","type":"uint256"}],"name":"setPubSaleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setReservedSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setUriSuffixToBlank","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_users","type":"address[]"}],"name":"setWhitelistAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","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"}]

60c0604052601c60808190527f547269626573206f66207468652041667465726d61746820544f54410000000060a090815262000040916009919062000839565b5060408051808201909152600480825263544f544160e01b60209092019182526200006e91600a9162000839565b506040805160208101918290526000908190526200008f91600b9162000839565b50604080516020810191829052600090819052620000b091600c9162000839565b506040518060600160405280603f8152602001620040e2603f91398051620000e191600d9160209091019062000839565b50600e805460ff1916905567011c37937e080000600f819055601055600560115560146012819055600a6013556122b890556001601581905560966016556017805461ffff19166101001790556018557fc6d7e6e2d994b666611235bdf1714dc30f20b966386a81ce610273f349dedb39601a55601b80546001600160a01b031990811673e23d436fc2f715d2b4ec402511965e1474699fc917909155601c80548216736e035e0dbd225e97aa171b87902ce6fe8527f16c179055601d8054821673dac0b32df6dcfe658af3bd1fdf0c95d2af0b678a179055601e80548216736d587352df7e0c377e87983586459609e9baf94e179055601f8054821673a130d1133ef1a84f39b84467b16f5a0dd0577d4a1790556020805482167356df8e01cc2fe2e1e01f6a0ee9b79c5ae54f3560179055602180548216731c81e289886544a04691936b13570e9b3549574617905560228054909116731c5b3f89d3acf80223e2484897d2e38cf61e7c201790553480156200025e57600080fd5b50600980546200026e90620008df565b80601f01602080910402602001604051908101604052809291908181526020018280546200029c90620008df565b8015620002ed5780601f10620002c157610100808354040283529160200191620002ed565b820191906000526020600020905b815481529060010190602001808311620002cf57829003601f168201915b5050505050600a80546200030190620008df565b80601f01602080910402602001604051908101604052809291908181526020018280546200032f90620008df565b8015620003805780601f10620003545761010080835404028352916020019162000380565b820191906000526020600020905b8154815290600101906020018083116200036257829003601f168201915b505084516200039a93506002925060208601915062000839565b508051620003b090600390602084019062000839565b505050620003cd620003c76200048c60201b60201c565b62000490565b6200046b600d8054620003e090620008df565b80601f01602080910402602001604051908101604052809291908181526020018280546200040e90620008df565b80156200045f5780601f1062000433576101008083540402835291602001916200045f565b820191906000526020600020905b8154815290600101906020018083116200044157829003601f168201915b5050620004e292505050565b60225460155462000486916001600160a01b0316906200055a565b620009ca565b3390565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6008546001600160a01b03163314620005415760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b80516200055690600d90602084019062000839565b5050565b620005568282604051806020016040528060008152506200057c60201b60201c565b6200058b838383600162000590565b505050565b6000546001600160a01b038516620005ba57604051622e076360e81b815260040160405180910390fd5b83620005d95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546001600160801b031981166001600160401b038083168c018116918217680100000000000000006001600160401b031990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015620006f05760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015620006c45750620006c26000888488620006fb565b155b15620006e3576040516368d2bf6b60e11b815260040160405180910390fd5b6001918201910162000669565b506000555050505050565b60006200071c846001600160a01b03166200082a60201b620025a61760201c565b156200081e57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290620007569033908990889088906004016200091c565b602060405180830381600087803b1580156200077157600080fd5b505af1925050508015620007a4575060408051601f3d908101601f19168201909252620007a19181019062000997565b60015b62000803573d808015620007d5576040519150601f19603f3d011682016040523d82523d6000602084013e620007da565b606091505b508051620007fb576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905062000822565b5060015b949350505050565b6001600160a01b03163b151590565b8280546200084790620008df565b90600052602060002090601f0160209004810192826200086b5760008555620008b6565b82601f106200088657805160ff1916838001178555620008b6565b82800160010185558215620008b6579182015b82811115620008b657825182559160200191906001019062000899565b50620008c4929150620008c8565b5090565b5b80821115620008c45760008155600101620008c9565b600181811c90821680620008f457607f821691505b602082108114156200091657634e487b7160e01b600052602260045260246000fd5b50919050565b600060018060a01b038087168352602081871681850152856040850152608060608501528451915081608085015260005b828110156200096b5785810182015185820160a0015281016200094d565b828111156200097e57600060a084870101525b5050601f01601f19169190910160a00195945050505050565b600060208284031215620009aa57600080fd5b81516001600160e01b031981168114620009c357600080fd5b9392505050565b61370880620009da6000396000f3fe6080604052600436106103ad5760003560e01c80636d9ba9a7116101e7578063b071401b1161010d578063debefaa6116100a0578063f03255491161006f578063f032554914610a6c578063f2fde38b14610a81578063f46eccc414610aa1578063f52ccc2d14610afe57600080fd5b8063debefaa6146109d8578063e985e9c5146109f8578063ea4cd25214610a41578063ea50ac8214610a5757600080fd5b8063c87b56dd116100dc578063c87b56dd1461096c578063cc9ff9c61461098c578063d5abeb01146109a2578063d69568ea146109b857600080fd5b8063b071401b146108ec578063b5462f5e1461090c578063b88d4fde1461092c578063b8bb3c541461094c57600080fd5b80638da5cb5b116101855780639e6b2c5b116101545780639e6b2c5b14610884578063a22cb46514610897578063a45ba8e7146108b7578063a8e95aa8146108cc57600080fd5b80638da5cb5b1461081c57806394354fd01461083a57806395d89b41146108505780639d044ed31461086557600080fd5b8063715018a6116101c1578063715018a6146107a7578063722ee540146107bc5780637cb64759146107dc5780637ec4a659146107fc57600080fd5b80636d9ba9a7146107525780636f7607321461077257806370a082311461078757600080fd5b8063374751b4116102d757806354214f691161026a57806362b99ad41161023957806362b99ad4146106e85780636352211e146106fd578063691db28b1461071d5780636972d2fc1461073d57600080fd5b806354214f691461067d5780635503a0e814610697578063564566a8146106ac578063578cbd1f146106c657600080fd5b8063438b6300116102a6578063438b6300146105fd5780634624ddc01461062a5780634f6ccce71461063d5780634fdd43cb1461065d57600080fd5b8063374751b41461059c5780633ccfd60b146105b2578063427c19b7146105c757806342842e0e146105dd57600080fd5b80631e13f86b1161034f5780632b50de211161031e5780632b50de21146105315780632eb4a7ab146105515780632f745c591461056757806334918dfd1461058757600080fd5b80631e13f86b146104bb578063207fd32c146104db578063231b0716146104f157806323b872dd1461051157600080fd5b8063095ea7b31161038b578063095ea7b31461044157806311788d4c1461046357806316ba10e01461047857806318160ddd1461049857600080fd5b806301ffc9a7146103b257806306fdde03146103e7578063081812fc14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612f12565b610b1e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc610b8b565b6040516103de9190612f87565b34801561041557600080fd5b50610429610424366004612f9a565b610c1d565b6040516001600160a01b0390911681526020016103de565b34801561044d57600080fd5b5061046161045c366004612fcf565b610c61565b005b34801561046f57600080fd5b50610461610cef565b34801561048457600080fd5b50610461610493366004613084565b610d43565b3480156104a457600080fd5b50600154600054035b6040519081526020016103de565b3480156104c757600080fd5b506104616104d6366004612f9a565b610d84565b3480156104e757600080fd5b506104ad60185481565b3480156104fd57600080fd5b5061046161050c366004612f9a565b610e16565b34801561051d57600080fd5b5061046161052c3660046130cc565b610e45565b34801561053d57600080fd5b5061046161054c366004613108565b610e50565b34801561055d57600080fd5b506104ad601a5481565b34801561057357600080fd5b506104ad610582366004612fcf565b610f10565b34801561059357600080fd5b50610461611003565b3480156105a857600080fd5b506104ad60115481565b3480156105be57600080fd5b50610461611041565b3480156105d357600080fd5b506104ad60125481565b3480156105e957600080fd5b506104616105f83660046130cc565b611410565b34801561060957600080fd5b5061061d610618366004613134565b61142b565b6040516103de919061314f565b610461610638366004612f9a565b61150a565b34801561064957600080fd5b506104ad610658366004612f9a565b61176d565b34801561066957600080fd5b50610461610678366004613084565b61180e565b34801561068957600080fd5b50600e546103d29060ff1681565b3480156106a357600080fd5b506103fc61184b565b3480156106b857600080fd5b506017546103d29060ff1681565b3480156106d257600080fd5b506106db6118d9565b6040516103de9190613193565b3480156106f457600080fd5b506103fc61193a565b34801561070957600080fd5b50610429610718366004612f9a565b611947565b34801561072957600080fd5b506103d2610738366004613134565b611959565b34801561074957600080fd5b506104ad6119c3565b34801561075e57600080fd5b5061046161076d366004613108565b6119f1565b34801561077e57600080fd5b506016546104ad565b34801561079357600080fd5b506104ad6107a2366004613134565b611b0b565b3480156107b357600080fd5b50610461611b59565b3480156107c857600080fd5b506103d26107d736600461321f565b611b8f565b3480156107e857600080fd5b506104616107f7366004612f9a565b611c17565b34801561080857600080fd5b50610461610817366004613084565b611c46565b34801561082857600080fd5b506008546001600160a01b0316610429565b34801561084657600080fd5b506104ad60135481565b34801561085c57600080fd5b506103fc611c83565b34801561087157600080fd5b506017546103d290610100900460ff1681565b610461610892366004613272565b611c92565b3480156108a357600080fd5b506104616108b23660046132bd565b611f9a565b3480156108c357600080fd5b506103fc612030565b3480156108d857600080fd5b506104616108e73660046132f9565b61203d565b3480156108f857600080fd5b50610461610907366004612f9a565b6120dc565b34801561091857600080fd5b50610461610927366004612f9a565b61210b565b34801561093857600080fd5b5061046161094736600461331c565b612186565b34801561095857600080fd5b50610461610967366004612f9a565b6121c0565b34801561097857600080fd5b506103fc610987366004612f9a565b6121ef565b34801561099857600080fd5b506104ad600f5481565b3480156109ae57600080fd5b506104ad60145481565b3480156109c457600080fd5b506104616109d3366004612f9a565b612358565b3480156109e457600080fd5b506103d26109f336600461321f565b6123d3565b348015610a0457600080fd5b506103d2610a13366004613397565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a4d57600080fd5b506104ad60105481565b348015610a6357600080fd5b50610461612447565b348015610a7857600080fd5b50610461612485565b348015610a8d57600080fd5b50610461610a9c366004613134565b6124cc565b348015610aad57600080fd5b50610ae1610abc366004613134565b60236020526000908152604090208054600182015460029092015460ff909116919083565b6040805193151584526020840192909252908201526060016103de565b348015610b0a57600080fd5b50610461610b193660046133c1565b612564565b60006001600160e01b031982166380ac58cd60e01b1480610b4f57506001600160e01b03198216635b5e139f60e01b145b80610b6a57506001600160e01b0319821663780e9d6360e01b145b80610b8557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610b9a90613402565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690613402565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000610c28826125b5565b610c45576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c6c82611947565b9050806001600160a01b0316836001600160a01b03161415610ca15760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cc15750610cbf8133610a13565b155b15610cdf576040516367d9dca160e11b815260040160405180910390fd5b610cea8383836125e0565b505050565b6008546001600160a01b03163314610d225760405162461bcd60e51b8152600401610d199061343d565b60405180910390fd5b604080516020810191829052600090819052610d4091600c91612df2565b50565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600c906020840190612df2565b5050565b6008546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d199061343d565b60015460005403601454610dc29190613488565b811115610e115760405162461bcd60e51b815260206004820152601960248201527f457863656564732072656d61696e696e6720737570706c7921000000000000006044820152606401610d19565b601655565b6008546001600160a01b03163314610e405760405162461bcd60e51b8152600401610d199061343d565b600f55565b610cea83838361263c565b6008546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401610d199061343d565b601654601454610e8a9190613488565b82610e986001546000540390565b610ea2919061349f565b1115610ec05760405162461bcd60e51b8152600401610d19906134b7565b60008211610f065760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610d19565b610d808183612850565b6000610f1b83611b0b565b8210610f3a576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610ffd57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290610fa95750610ff5565b80516001600160a01b031615610fbe57805192505b876001600160a01b0316836001600160a01b03161415610ff35786841415610fec57509350610b8592505050565b6001909301925b505b600101610f42565b50600080fd5b6008546001600160a01b0316331461102d5760405162461bcd60e51b8152600401610d199061343d565b6017805460ff19811660ff90911615179055565b6008546001600160a01b0316331461106b5760405162461bcd60e51b8152600401610d199061343d565b601b5447906000906001600160a01b0316606461108984600e6134e5565b611093919061351a565b604051600081818185875af1925050503d80600081146110cf576040519150601f19603f3d011682016040523d82523d6000602084013e6110d4565b606091505b50509050806110e257600080fd5b601c80546000916001600160a01b03909116906064906111039086906134e5565b61110d919061351a565b604051600081818185875af1925050503d8060008114611149576040519150601f19603f3d011682016040523d82523d6000602084013e61114e565b606091505b505090508061115c57600080fd5b601d546000906001600160a01b031660646111788660036134e5565b611182919061351a565b604051600081818185875af1925050503d80600081146111be576040519150601f19603f3d011682016040523d82523d6000602084013e6111c3565b606091505b50509050806111d157600080fd5b601e546000906001600160a01b031660646111ed8760046134e5565b6111f7919061351a565b604051600081818185875af1925050503d8060008114611233576040519150601f19603f3d011682016040523d82523d6000602084013e611238565b606091505b505090508061124657600080fd5b601f546000906001600160a01b0316606461126288600f6134e5565b61126c919061351a565b604051600081818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b6020546000906001600160a01b031660646112d78960086134e5565b6112e1919061351a565b604051600081818185875af1925050503d806000811461131d576040519150601f19603f3d011682016040523d82523d6000602084013e611322565b606091505b505090508061133057600080fd5b6021546000906001600160a01b0316606461134c8a600a6134e5565b611356919061351a565b604051600081818185875af1925050503d8060008114611392576040519150601f19603f3d011682016040523d82523d6000602084013e611397565b606091505b50509050806113a557600080fd5b6022546040516000916001600160a01b03169047908381818185875af1925050503d80600081146113f2576040519150601f19603f3d011682016040523d82523d6000602084013e6113f7565b606091505b505090508061140557600080fd5b505050505050505050565b610cea83838360405180602001604052806000815250612186565b6060600061143883611b0b565b90506000816001600160401b0381111561145457611454612ff9565b60405190808252806020026020018201604052801561147d578160200160208202803683370190505b5090506000805b838110801561149557506014548211155b156115005760006114a583611947565b9050866001600160a01b0316816001600160a01b031614156114ed57828483815181106114d4576114d461352e565b6020908102919091010152816114e981613544565b9250505b826114f781613544565b93505050611484565b5090949350505050565b60175460ff166115525760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d19565b601754610100900460ff16156115a05760405162461bcd60e51b81526020600482015260136024820152725072652053616c65206973206163746976652160681b6044820152606401610d19565b6016546014546115b09190613488565b816115be6001546000540390565b6115c8919061349f565b11156115e65760405162461bcd60e51b8152600401610d19906134b7565b6000811180156115f857506013548111155b61163b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610d19565b8060105461164991906134e5565b34101561168e5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610d19565b601254336000908152602360205260409020600201546116af90839061349f565b11156116fd5760405162461bcd60e51b815260206004820152601960248201527f45786365656473207065722077616c6c6574206c696d69742e000000000000006044820152606401610d19565b3360009081526023602052604090205460ff1661172f57336000908152602360205260409020805460ff191660011790555b3360009081526023602052604090206002015461174d90829061349f565b33600081815260236020526040902060020191909155610d409082612850565b6000805481805b828110156117f457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906117eb57858314156117e45750949350505050565b6001909201915b50600101611774565b506040516329c8c00760e21b815260040160405180910390fd5b6008546001600160a01b031633146118385760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600d906020840190612df2565b600c805461185890613402565b80601f016020809104026020016040519081016040528092919081815260200182805461188490613402565b80156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b505050505081565b60606019805480602002602001604051908101604052809291908181526020018280548015610c1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611913575050505050905090565b600b805461185890613402565b60006119528261286a565b5192915050565b6000805b6019548110156119ba57826001600160a01b0316601982815481106119845761198461352e565b6000918252602090912001546001600160a01b031614156119a85750600192915050565b806119b281613544565b91505061195d565b50600092915050565b60006119d26001546000540390565b6016546014546119e29190613488565b6119ec9190613488565b905090565b6008546001600160a01b03163314611a1b5760405162461bcd60e51b8152600401610d199061343d565b6000601654118015611a2f57506016548211155b611a7b5760405162461bcd60e51b815260206004820152601860248201527f4578636565647320726573657276656420737570706c792100000000000000006044820152606401610d19565b60008211611ac15760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610d19565b60145482611ad26001546000540390565b611adc919061349f565b1115611afa5760405162461bcd60e51b8152600401610d19906134b7565b610f06826016546104d69190613488565b60006001600160a01b038216611b34576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314611b835760405162461bcd60e51b8152600401610d199061343d565b611b8d6000612983565b565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611c0c85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491508490506129d5565b9150505b9392505050565b6008546001600160a01b03163314611c415760405162461bcd60e51b8152600401610d199061343d565b601a55565b6008546001600160a01b03163314611c705760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600b906020840190612df2565b606060038054610b9a90613402565b60175460ff16611cda5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d19565b601654601454611cea9190613488565b83611cf86001546000540390565b611d02919061349f565b1115611d205760405162461bcd60e51b8152600401610d19906134b7565b601754610100900460ff16611d775760405162461bcd60e51b815260206004820152601760248201527f5072652053616c65206973206e6f7420616374697665210000000000000000006044820152606401610d19565b82600f54611d8591906134e5565b341015611dca5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610d19565b60008311611e115760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610d19565b601154831115611e335760405162461bcd60e51b8152600401610d199061355f565b60185460011415611e9057611e49828233611b8f565b611e905760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba103bb434ba32b634b9ba32b21760411b6044820152606401610d19565b60185460021415611eeb57611ea433611959565b611eeb5760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba103bb434ba32b634b9ba32b21760411b6044820152606401610d19565b60115433600090815260236020526040902060010154611f0c90859061349f565b1115611f2a5760405162461bcd60e51b8152600401610d199061355f565b3360009081526023602052604090205460ff16611f5c57336000908152602360205260409020805460ff191660011790555b33600090815260236020526040902060010154611f7a90849061349f565b33600081815260236020526040902060010191909155610cea9084612850565b6001600160a01b038216331415611fc45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d805461185890613402565b6008546001600160a01b031633146120675760405162461bcd60e51b8152600401610d199061343d565b60ff8116158061207a57508060ff166001145b8061208857508060ff166002145b6120d45760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642077686974656c69737420747970652e0000000000000000006044820152606401610d19565b60ff16601855565b6008546001600160a01b031633146121065760405162461bcd60e51b8152600401610d199061343d565b601355565b6008546001600160a01b031633146121355760405162461bcd60e51b8152600401610d199061343d565b600081116121815760405162461bcd60e51b81526020600482015260196024820152784d7573742062652067726561746572207468616e207a65726f60381b6044820152606401610d19565b601255565b61219184848461263c565b61219d848484846129eb565b6121ba576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146121ea5760405162461bcd60e51b8152600401610d199061343d565b601055565b60606121fa826125b5565b61225e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d19565b600e5460ff166122fa57600d805461227590613402565b80601f01602080910402602001604051908101604052809291908181526020018280546122a190613402565b80156122ee5780601f106122c3576101008083540402835291602001916122ee565b820191906000526020600020905b8154815290600101906020018083116122d157829003601f168201915b50505050509050919050565b6000612304612afa565b905060008151116123245760405180602001604052806000815250611c10565b8061232e84612b09565b600c604051602001612342939291906135a0565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146123825760405162461bcd60e51b8152600401610d199061343d565b600081116123ce5760405162461bcd60e51b81526020600482015260196024820152784d7573742062652067726561746572207468616e207a65726f60381b6044820152606401610d19565b601155565b60175460009060ff1680156123f05750601754610100900460ff16155b156123fd57506001611c10565b60185461240c57506001611c10565b6018546001141561242957612422848484611b8f565b9050611c10565b6018546002141561243d5761242282611959565b5060009392505050565b6008546001600160a01b031633146124715760405162461bcd60e51b8152600401610d199061343d565b600e805460ff19811660ff90911615179055565b6008546001600160a01b031633146124af5760405162461bcd60e51b8152600401610d199061343d565b6017805461ff001981166101009182900460ff1615909102179055565b6008546001600160a01b031633146124f65760405162461bcd60e51b8152600401610d199061343d565b6001600160a01b03811661255b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d19565b610d4081612983565b6008546001600160a01b0316331461258e5760405162461bcd60e51b8152600401610d199061343d565b61259a60196000612e76565b610cea60198383612e94565b6001600160a01b03163b151590565b6000805482108015610b85575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006126478261286a565b80519091506000906001600160a01b0316336001600160a01b03161480612675575081516126759033610a13565b8061269057503361268584610c1d565b6001600160a01b0316145b9050806126b057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146126e55760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661270c57604051633a954ecd60e21b815260040160405180910390fd5b61271c60008484600001516125e0565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128065760005481101561280657825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610d80828260405180602001604052806000815250612c06565b604080516060810182526000808252602082018190529181018290529054829081101561296a57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906129685780516001600160a01b0316156128ff579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612963579392505050565b6128ff565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826129e28584612c13565b14949350505050565b60006001600160a01b0384163b15612aee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a2f903390899088908890600401613664565b602060405180830381600087803b158015612a4957600080fd5b505af1925050508015612a79575060408051601f3d908101601f19168201909252612a76918101906136a1565b60015b612ad4573d808015612aa7576040519150601f19603f3d011682016040523d82523d6000602084013e612aac565b606091505b508051612acc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612af2565b5060015b949350505050565b6060600b8054610b9a90613402565b606081612b2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b575780612b4181613544565b9150612b509050600a8361351a565b9150612b31565b6000816001600160401b03811115612b7157612b71612ff9565b6040519080825280601f01601f191660200182016040528015612b9b576020820181803683370190505b5090505b8415612af257612bb0600183613488565b9150612bbd600a866136be565b612bc890603061349f565b60f81b818381518110612bdd57612bdd61352e565b60200101906001600160f81b031916908160001a905350612bff600a8661351a565b9450612b9f565b610cea8383836001612c87565b600081815b8451811015612c7f576000858281518110612c3557612c3561352e565b60200260200101519050808311612c5b5760008381526020829052604090209250612c6c565b600081815260208490526040902092505b5080612c7781613544565b915050612c18565b509392505050565b6000546001600160a01b038516612cb057604051622e076360e81b815260040160405180910390fd5b83612cce5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612de95760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612dbf5750612dbd60008884886129eb565b155b15612ddd576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612d68565b50600055612849565b828054612dfe90613402565b90600052602060002090601f016020900481019282612e205760008555612e66565b82601f10612e3957805160ff1916838001178555612e66565b82800160010185558215612e66579182015b82811115612e66578251825591602001919060010190612e4b565b50612e72929150612ee7565b5090565b5080546000825590600052602060002090810190610d409190612ee7565b828054828255906000526020600020908101928215612e66579160200282015b82811115612e665781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612eb4565b5b80821115612e725760008155600101612ee8565b6001600160e01b031981168114610d4057600080fd5b600060208284031215612f2457600080fd5b8135611c1081612efc565b60005b83811015612f4a578181015183820152602001612f32565b838111156121ba5750506000910152565b60008151808452612f73816020860160208601612f2f565b601f01601f19169290920160200192915050565b602081526000611c106020830184612f5b565b600060208284031215612fac57600080fd5b5035919050565b80356001600160a01b0381168114612fca57600080fd5b919050565b60008060408385031215612fe257600080fd5b612feb83612fb3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561302957613029612ff9565b604051601f8501601f19908116603f0116810190828211818310171561305157613051612ff9565b8160405280935085815286868601111561306a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561309657600080fd5b81356001600160401b038111156130ac57600080fd5b8201601f810184136130bd57600080fd5b612af28482356020840161300f565b6000806000606084860312156130e157600080fd5b6130ea84612fb3565b92506130f860208501612fb3565b9150604084013590509250925092565b6000806040838503121561311b57600080fd5b8235915061312b60208401612fb3565b90509250929050565b60006020828403121561314657600080fd5b611c1082612fb3565b6020808252825182820181905260009190848201906040850190845b818110156131875783518352928401929184019160010161316b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131875783516001600160a01b0316835292840192918401916001016131af565b60008083601f8401126131e657600080fd5b5081356001600160401b038111156131fd57600080fd5b6020830191508360208260051b850101111561321857600080fd5b9250929050565b60008060006040848603121561323457600080fd5b83356001600160401b0381111561324a57600080fd5b613256868287016131d4565b9094509250613269905060208501612fb3565b90509250925092565b60008060006040848603121561328757600080fd5b8335925060208401356001600160401b038111156132a457600080fd5b6132b0868287016131d4565b9497909650939450505050565b600080604083850312156132d057600080fd5b6132d983612fb3565b9150602083013580151581146132ee57600080fd5b809150509250929050565b60006020828403121561330b57600080fd5b813560ff81168114611c1057600080fd5b6000806000806080858703121561333257600080fd5b61333b85612fb3565b935061334960208601612fb3565b92506040850135915060608501356001600160401b0381111561336b57600080fd5b8501601f8101871361337c57600080fd5b61338b8782356020840161300f565b91505092959194509250565b600080604083850312156133aa57600080fd5b6133b383612fb3565b915061312b60208401612fb3565b600080602083850312156133d457600080fd5b82356001600160401b038111156133ea57600080fd5b6133f6858286016131d4565b90969095509350505050565b600181811c9082168061341657607f821691505b6020821081141561343757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561349a5761349a613472565b500390565b600082198211156134b2576134b2613472565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008160001904831182151516156134ff576134ff613472565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261352957613529613504565b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561355857613558613472565b5060010190565b60208082526021908201527f45786365656473207065722077616c6c65742070726573616c65206c696d69746040820152601760f91b606082015260800190565b6000845160206135b38285838a01612f2f565b8551918401916135c68184848a01612f2f565b8554920191600090600181811c90808316806135e357607f831692505b85831081141561360157634e487b7160e01b85526022600452602485fd5b808015613615576001811461362657613653565b60ff19851688528388019550613653565b60008b81526020902060005b8581101561364b5781548a820152908401908801613632565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061369790830184612f5b565b9695505050505050565b6000602082840312156136b357600080fd5b8151611c1081612efc565b6000826136cd576136cd613504565b50069056fea2646970667358221220b48bb92211ac1cbd4aac68571404b26410a50cc7c973dbb5a96c6427743fa21564736f6c63430008090033697066733a2f2f516d514636764e36393378746e6274474e77344856543655646d514b757876447865353964473877334e7a6148762f746f74612e6a736f6e

Deployed Bytecode

0x6080604052600436106103ad5760003560e01c80636d9ba9a7116101e7578063b071401b1161010d578063debefaa6116100a0578063f03255491161006f578063f032554914610a6c578063f2fde38b14610a81578063f46eccc414610aa1578063f52ccc2d14610afe57600080fd5b8063debefaa6146109d8578063e985e9c5146109f8578063ea4cd25214610a41578063ea50ac8214610a5757600080fd5b8063c87b56dd116100dc578063c87b56dd1461096c578063cc9ff9c61461098c578063d5abeb01146109a2578063d69568ea146109b857600080fd5b8063b071401b146108ec578063b5462f5e1461090c578063b88d4fde1461092c578063b8bb3c541461094c57600080fd5b80638da5cb5b116101855780639e6b2c5b116101545780639e6b2c5b14610884578063a22cb46514610897578063a45ba8e7146108b7578063a8e95aa8146108cc57600080fd5b80638da5cb5b1461081c57806394354fd01461083a57806395d89b41146108505780639d044ed31461086557600080fd5b8063715018a6116101c1578063715018a6146107a7578063722ee540146107bc5780637cb64759146107dc5780637ec4a659146107fc57600080fd5b80636d9ba9a7146107525780636f7607321461077257806370a082311461078757600080fd5b8063374751b4116102d757806354214f691161026a57806362b99ad41161023957806362b99ad4146106e85780636352211e146106fd578063691db28b1461071d5780636972d2fc1461073d57600080fd5b806354214f691461067d5780635503a0e814610697578063564566a8146106ac578063578cbd1f146106c657600080fd5b8063438b6300116102a6578063438b6300146105fd5780634624ddc01461062a5780634f6ccce71461063d5780634fdd43cb1461065d57600080fd5b8063374751b41461059c5780633ccfd60b146105b2578063427c19b7146105c757806342842e0e146105dd57600080fd5b80631e13f86b1161034f5780632b50de211161031e5780632b50de21146105315780632eb4a7ab146105515780632f745c591461056757806334918dfd1461058757600080fd5b80631e13f86b146104bb578063207fd32c146104db578063231b0716146104f157806323b872dd1461051157600080fd5b8063095ea7b31161038b578063095ea7b31461044157806311788d4c1461046357806316ba10e01461047857806318160ddd1461049857600080fd5b806301ffc9a7146103b257806306fdde03146103e7578063081812fc14610409575b600080fd5b3480156103be57600080fd5b506103d26103cd366004612f12565b610b1e565b60405190151581526020015b60405180910390f35b3480156103f357600080fd5b506103fc610b8b565b6040516103de9190612f87565b34801561041557600080fd5b50610429610424366004612f9a565b610c1d565b6040516001600160a01b0390911681526020016103de565b34801561044d57600080fd5b5061046161045c366004612fcf565b610c61565b005b34801561046f57600080fd5b50610461610cef565b34801561048457600080fd5b50610461610493366004613084565b610d43565b3480156104a457600080fd5b50600154600054035b6040519081526020016103de565b3480156104c757600080fd5b506104616104d6366004612f9a565b610d84565b3480156104e757600080fd5b506104ad60185481565b3480156104fd57600080fd5b5061046161050c366004612f9a565b610e16565b34801561051d57600080fd5b5061046161052c3660046130cc565b610e45565b34801561053d57600080fd5b5061046161054c366004613108565b610e50565b34801561055d57600080fd5b506104ad601a5481565b34801561057357600080fd5b506104ad610582366004612fcf565b610f10565b34801561059357600080fd5b50610461611003565b3480156105a857600080fd5b506104ad60115481565b3480156105be57600080fd5b50610461611041565b3480156105d357600080fd5b506104ad60125481565b3480156105e957600080fd5b506104616105f83660046130cc565b611410565b34801561060957600080fd5b5061061d610618366004613134565b61142b565b6040516103de919061314f565b610461610638366004612f9a565b61150a565b34801561064957600080fd5b506104ad610658366004612f9a565b61176d565b34801561066957600080fd5b50610461610678366004613084565b61180e565b34801561068957600080fd5b50600e546103d29060ff1681565b3480156106a357600080fd5b506103fc61184b565b3480156106b857600080fd5b506017546103d29060ff1681565b3480156106d257600080fd5b506106db6118d9565b6040516103de9190613193565b3480156106f457600080fd5b506103fc61193a565b34801561070957600080fd5b50610429610718366004612f9a565b611947565b34801561072957600080fd5b506103d2610738366004613134565b611959565b34801561074957600080fd5b506104ad6119c3565b34801561075e57600080fd5b5061046161076d366004613108565b6119f1565b34801561077e57600080fd5b506016546104ad565b34801561079357600080fd5b506104ad6107a2366004613134565b611b0b565b3480156107b357600080fd5b50610461611b59565b3480156107c857600080fd5b506103d26107d736600461321f565b611b8f565b3480156107e857600080fd5b506104616107f7366004612f9a565b611c17565b34801561080857600080fd5b50610461610817366004613084565b611c46565b34801561082857600080fd5b506008546001600160a01b0316610429565b34801561084657600080fd5b506104ad60135481565b34801561085c57600080fd5b506103fc611c83565b34801561087157600080fd5b506017546103d290610100900460ff1681565b610461610892366004613272565b611c92565b3480156108a357600080fd5b506104616108b23660046132bd565b611f9a565b3480156108c357600080fd5b506103fc612030565b3480156108d857600080fd5b506104616108e73660046132f9565b61203d565b3480156108f857600080fd5b50610461610907366004612f9a565b6120dc565b34801561091857600080fd5b50610461610927366004612f9a565b61210b565b34801561093857600080fd5b5061046161094736600461331c565b612186565b34801561095857600080fd5b50610461610967366004612f9a565b6121c0565b34801561097857600080fd5b506103fc610987366004612f9a565b6121ef565b34801561099857600080fd5b506104ad600f5481565b3480156109ae57600080fd5b506104ad60145481565b3480156109c457600080fd5b506104616109d3366004612f9a565b612358565b3480156109e457600080fd5b506103d26109f336600461321f565b6123d3565b348015610a0457600080fd5b506103d2610a13366004613397565b6001600160a01b03918216600090815260076020908152604080832093909416825291909152205460ff1690565b348015610a4d57600080fd5b506104ad60105481565b348015610a6357600080fd5b50610461612447565b348015610a7857600080fd5b50610461612485565b348015610a8d57600080fd5b50610461610a9c366004613134565b6124cc565b348015610aad57600080fd5b50610ae1610abc366004613134565b60236020526000908152604090208054600182015460029092015460ff909116919083565b6040805193151584526020840192909252908201526060016103de565b348015610b0a57600080fd5b50610461610b193660046133c1565b612564565b60006001600160e01b031982166380ac58cd60e01b1480610b4f57506001600160e01b03198216635b5e139f60e01b145b80610b6a57506001600160e01b0319821663780e9d6360e01b145b80610b8557506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060028054610b9a90613402565b80601f0160208091040260200160405190810160405280929190818152602001828054610bc690613402565b8015610c135780601f10610be857610100808354040283529160200191610c13565b820191906000526020600020905b815481529060010190602001808311610bf657829003601f168201915b5050505050905090565b6000610c28826125b5565b610c45576040516333d1c03960e21b815260040160405180910390fd5b506000908152600660205260409020546001600160a01b031690565b6000610c6c82611947565b9050806001600160a01b0316836001600160a01b03161415610ca15760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b03821614801590610cc15750610cbf8133610a13565b155b15610cdf576040516367d9dca160e11b815260040160405180910390fd5b610cea8383836125e0565b505050565b6008546001600160a01b03163314610d225760405162461bcd60e51b8152600401610d199061343d565b60405180910390fd5b604080516020810191829052600090819052610d4091600c91612df2565b50565b6008546001600160a01b03163314610d6d5760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600c906020840190612df2565b5050565b6008546001600160a01b03163314610dae5760405162461bcd60e51b8152600401610d199061343d565b60015460005403601454610dc29190613488565b811115610e115760405162461bcd60e51b815260206004820152601960248201527f457863656564732072656d61696e696e6720737570706c7921000000000000006044820152606401610d19565b601655565b6008546001600160a01b03163314610e405760405162461bcd60e51b8152600401610d199061343d565b600f55565b610cea83838361263c565b6008546001600160a01b03163314610e7a5760405162461bcd60e51b8152600401610d199061343d565b601654601454610e8a9190613488565b82610e986001546000540390565b610ea2919061349f565b1115610ec05760405162461bcd60e51b8152600401610d19906134b7565b60008211610f065760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610d19565b610d808183612850565b6000610f1b83611b0b565b8210610f3a576040516306ed618760e11b815260040160405180910390fd5b600080549080805b83811015610ffd57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161580159282019290925290610fa95750610ff5565b80516001600160a01b031615610fbe57805192505b876001600160a01b0316836001600160a01b03161415610ff35786841415610fec57509350610b8592505050565b6001909301925b505b600101610f42565b50600080fd5b6008546001600160a01b0316331461102d5760405162461bcd60e51b8152600401610d199061343d565b6017805460ff19811660ff90911615179055565b6008546001600160a01b0316331461106b5760405162461bcd60e51b8152600401610d199061343d565b601b5447906000906001600160a01b0316606461108984600e6134e5565b611093919061351a565b604051600081818185875af1925050503d80600081146110cf576040519150601f19603f3d011682016040523d82523d6000602084013e6110d4565b606091505b50509050806110e257600080fd5b601c80546000916001600160a01b03909116906064906111039086906134e5565b61110d919061351a565b604051600081818185875af1925050503d8060008114611149576040519150601f19603f3d011682016040523d82523d6000602084013e61114e565b606091505b505090508061115c57600080fd5b601d546000906001600160a01b031660646111788660036134e5565b611182919061351a565b604051600081818185875af1925050503d80600081146111be576040519150601f19603f3d011682016040523d82523d6000602084013e6111c3565b606091505b50509050806111d157600080fd5b601e546000906001600160a01b031660646111ed8760046134e5565b6111f7919061351a565b604051600081818185875af1925050503d8060008114611233576040519150601f19603f3d011682016040523d82523d6000602084013e611238565b606091505b505090508061124657600080fd5b601f546000906001600160a01b0316606461126288600f6134e5565b61126c919061351a565b604051600081818185875af1925050503d80600081146112a8576040519150601f19603f3d011682016040523d82523d6000602084013e6112ad565b606091505b50509050806112bb57600080fd5b6020546000906001600160a01b031660646112d78960086134e5565b6112e1919061351a565b604051600081818185875af1925050503d806000811461131d576040519150601f19603f3d011682016040523d82523d6000602084013e611322565b606091505b505090508061133057600080fd5b6021546000906001600160a01b0316606461134c8a600a6134e5565b611356919061351a565b604051600081818185875af1925050503d8060008114611392576040519150601f19603f3d011682016040523d82523d6000602084013e611397565b606091505b50509050806113a557600080fd5b6022546040516000916001600160a01b03169047908381818185875af1925050503d80600081146113f2576040519150601f19603f3d011682016040523d82523d6000602084013e6113f7565b606091505b505090508061140557600080fd5b505050505050505050565b610cea83838360405180602001604052806000815250612186565b6060600061143883611b0b565b90506000816001600160401b0381111561145457611454612ff9565b60405190808252806020026020018201604052801561147d578160200160208202803683370190505b5090506000805b838110801561149557506014548211155b156115005760006114a583611947565b9050866001600160a01b0316816001600160a01b031614156114ed57828483815181106114d4576114d461352e565b6020908102919091010152816114e981613544565b9250505b826114f781613544565b93505050611484565b5090949350505050565b60175460ff166115525760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d19565b601754610100900460ff16156115a05760405162461bcd60e51b81526020600482015260136024820152725072652053616c65206973206163746976652160681b6044820152606401610d19565b6016546014546115b09190613488565b816115be6001546000540390565b6115c8919061349f565b11156115e65760405162461bcd60e51b8152600401610d19906134b7565b6000811180156115f857506013548111155b61163b5760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610d19565b8060105461164991906134e5565b34101561168e5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610d19565b601254336000908152602360205260409020600201546116af90839061349f565b11156116fd5760405162461bcd60e51b815260206004820152601960248201527f45786365656473207065722077616c6c6574206c696d69742e000000000000006044820152606401610d19565b3360009081526023602052604090205460ff1661172f57336000908152602360205260409020805460ff191660011790555b3360009081526023602052604090206002015461174d90829061349f565b33600081815260236020526040902060020191909155610d409082612850565b6000805481805b828110156117f457600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906117eb57858314156117e45750949350505050565b6001909201915b50600101611774565b506040516329c8c00760e21b815260040160405180910390fd5b6008546001600160a01b031633146118385760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600d906020840190612df2565b600c805461185890613402565b80601f016020809104026020016040519081016040528092919081815260200182805461188490613402565b80156118d15780601f106118a6576101008083540402835291602001916118d1565b820191906000526020600020905b8154815290600101906020018083116118b457829003601f168201915b505050505081565b60606019805480602002602001604051908101604052809291908181526020018280548015610c1357602002820191906000526020600020905b81546001600160a01b03168152600190910190602001808311611913575050505050905090565b600b805461185890613402565b60006119528261286a565b5192915050565b6000805b6019548110156119ba57826001600160a01b0316601982815481106119845761198461352e565b6000918252602090912001546001600160a01b031614156119a85750600192915050565b806119b281613544565b91505061195d565b50600092915050565b60006119d26001546000540390565b6016546014546119e29190613488565b6119ec9190613488565b905090565b6008546001600160a01b03163314611a1b5760405162461bcd60e51b8152600401610d199061343d565b6000601654118015611a2f57506016548211155b611a7b5760405162461bcd60e51b815260206004820152601860248201527f4578636565647320726573657276656420737570706c792100000000000000006044820152606401610d19565b60008211611ac15760405162461bcd60e51b8152602060048201526013602482015272125b9d985b1a59081b5a5b9d08185b5bdd5b9d606a1b6044820152606401610d19565b60145482611ad26001546000540390565b611adc919061349f565b1115611afa5760405162461bcd60e51b8152600401610d19906134b7565b610f06826016546104d69190613488565b60006001600160a01b038216611b34576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152600560205260409020546001600160401b031690565b6008546001600160a01b03163314611b835760405162461bcd60e51b8152600401610d199061343d565b611b8d6000612983565b565b6040516bffffffffffffffffffffffff19606083901b1660208201526000908190603401604051602081830303815290604052805190602001209050611c0c85858080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050601a5491508490506129d5565b9150505b9392505050565b6008546001600160a01b03163314611c415760405162461bcd60e51b8152600401610d199061343d565b601a55565b6008546001600160a01b03163314611c705760405162461bcd60e51b8152600401610d199061343d565b8051610d8090600b906020840190612df2565b606060038054610b9a90613402565b60175460ff16611cda5760405162461bcd60e51b815260206004820152601360248201527253616c65206973206e6f74206163746976652160681b6044820152606401610d19565b601654601454611cea9190613488565b83611cf86001546000540390565b611d02919061349f565b1115611d205760405162461bcd60e51b8152600401610d19906134b7565b601754610100900460ff16611d775760405162461bcd60e51b815260206004820152601760248201527f5072652053616c65206973206e6f7420616374697665210000000000000000006044820152606401610d19565b82600f54611d8591906134e5565b341015611dca5760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b6044820152606401610d19565b60008311611e115760405162461bcd60e51b8152602060048201526014602482015273496e76616c6964206d696e7420616d6f756e742160601b6044820152606401610d19565b601154831115611e335760405162461bcd60e51b8152600401610d199061355f565b60185460011415611e9057611e49828233611b8f565b611e905760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba103bb434ba32b634b9ba32b21760411b6044820152606401610d19565b60185460021415611eeb57611ea433611959565b611eeb5760405162461bcd60e51b81526020600482015260186024820152772cb7ba9030b932903737ba103bb434ba32b634b9ba32b21760411b6044820152606401610d19565b60115433600090815260236020526040902060010154611f0c90859061349f565b1115611f2a5760405162461bcd60e51b8152600401610d199061355f565b3360009081526023602052604090205460ff16611f5c57336000908152602360205260409020805460ff191660011790555b33600090815260236020526040902060010154611f7a90849061349f565b33600081815260236020526040902060010191909155610cea9084612850565b6001600160a01b038216331415611fc45760405163b06307db60e01b815260040160405180910390fd5b3360008181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600d805461185890613402565b6008546001600160a01b031633146120675760405162461bcd60e51b8152600401610d199061343d565b60ff8116158061207a57508060ff166001145b8061208857508060ff166002145b6120d45760405162461bcd60e51b815260206004820152601760248201527f496e76616c69642077686974656c69737420747970652e0000000000000000006044820152606401610d19565b60ff16601855565b6008546001600160a01b031633146121065760405162461bcd60e51b8152600401610d199061343d565b601355565b6008546001600160a01b031633146121355760405162461bcd60e51b8152600401610d199061343d565b600081116121815760405162461bcd60e51b81526020600482015260196024820152784d7573742062652067726561746572207468616e207a65726f60381b6044820152606401610d19565b601255565b61219184848461263c565b61219d848484846129eb565b6121ba576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b6008546001600160a01b031633146121ea5760405162461bcd60e51b8152600401610d199061343d565b601055565b60606121fa826125b5565b61225e5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610d19565b600e5460ff166122fa57600d805461227590613402565b80601f01602080910402602001604051908101604052809291908181526020018280546122a190613402565b80156122ee5780601f106122c3576101008083540402835291602001916122ee565b820191906000526020600020905b8154815290600101906020018083116122d157829003601f168201915b50505050509050919050565b6000612304612afa565b905060008151116123245760405180602001604052806000815250611c10565b8061232e84612b09565b600c604051602001612342939291906135a0565b6040516020818303038152906040529392505050565b6008546001600160a01b031633146123825760405162461bcd60e51b8152600401610d199061343d565b600081116123ce5760405162461bcd60e51b81526020600482015260196024820152784d7573742062652067726561746572207468616e207a65726f60381b6044820152606401610d19565b601155565b60175460009060ff1680156123f05750601754610100900460ff16155b156123fd57506001611c10565b60185461240c57506001611c10565b6018546001141561242957612422848484611b8f565b9050611c10565b6018546002141561243d5761242282611959565b5060009392505050565b6008546001600160a01b031633146124715760405162461bcd60e51b8152600401610d199061343d565b600e805460ff19811660ff90911615179055565b6008546001600160a01b031633146124af5760405162461bcd60e51b8152600401610d199061343d565b6017805461ff001981166101009182900460ff1615909102179055565b6008546001600160a01b031633146124f65760405162461bcd60e51b8152600401610d199061343d565b6001600160a01b03811661255b5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610d19565b610d4081612983565b6008546001600160a01b0316331461258e5760405162461bcd60e51b8152600401610d199061343d565b61259a60196000612e76565b610cea60198383612e94565b6001600160a01b03163b151590565b6000805482108015610b85575050600090815260046020526040902054600160e01b900460ff161590565b60008281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006126478261286a565b80519091506000906001600160a01b0316336001600160a01b03161480612675575081516126759033610a13565b8061269057503361268584610c1d565b6001600160a01b0316145b9050806126b057604051632ce44b5f60e11b815260040160405180910390fd5b846001600160a01b031682600001516001600160a01b0316146126e55760405162a1148160e81b815260040160405180910390fd5b6001600160a01b03841661270c57604051633a954ecd60e21b815260040160405180910390fd5b61271c60008484600001516125e0565b6001600160a01b038581166000908152600560209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652600490945282852080546001600160e01b031916909417600160a01b4290921691909102179092559086018083529120549091166128065760005481101561280657825160008281526004602090815260409091208054918601516001600160401b0316600160a01b026001600160e01b03199092166001600160a01b03909316929092171790555b5082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b5050505050565b610d80828260405180602001604052806000815250612c06565b604080516060810182526000808252602082018190529181018290529054829081101561296a57600081815260046020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906129685780516001600160a01b0316156128ff579392505050565b5060001901600081815260046020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff1615159281019290925215612963579392505050565b6128ff565b505b604051636f96cda160e11b815260040160405180910390fd5b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6000826129e28584612c13565b14949350505050565b60006001600160a01b0384163b15612aee57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612a2f903390899088908890600401613664565b602060405180830381600087803b158015612a4957600080fd5b505af1925050508015612a79575060408051601f3d908101601f19168201909252612a76918101906136a1565b60015b612ad4573d808015612aa7576040519150601f19603f3d011682016040523d82523d6000602084013e612aac565b606091505b508051612acc576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612af2565b5060015b949350505050565b6060600b8054610b9a90613402565b606081612b2d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b575780612b4181613544565b9150612b509050600a8361351a565b9150612b31565b6000816001600160401b03811115612b7157612b71612ff9565b6040519080825280601f01601f191660200182016040528015612b9b576020820181803683370190505b5090505b8415612af257612bb0600183613488565b9150612bbd600a866136be565b612bc890603061349f565b60f81b818381518110612bdd57612bdd61352e565b60200101906001600160f81b031916908160001a905350612bff600a8661351a565b9450612b9f565b610cea8383836001612c87565b600081815b8451811015612c7f576000858281518110612c3557612c3561352e565b60200260200101519050808311612c5b5760008381526020829052604090209250612c6c565b600081815260208490526040902092505b5080612c7781613544565b915050612c18565b509392505050565b6000546001600160a01b038516612cb057604051622e076360e81b815260040160405180910390fd5b83612cce5760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b038516600081815260056020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c018116909202179091558584526004909252822080546001600160e01b031916909317600160a01b42909216919091021790915581905b85811015612de95760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4838015612dbf5750612dbd60008884886129eb565b155b15612ddd576040516368d2bf6b60e11b815260040160405180910390fd5b60019182019101612d68565b50600055612849565b828054612dfe90613402565b90600052602060002090601f016020900481019282612e205760008555612e66565b82601f10612e3957805160ff1916838001178555612e66565b82800160010185558215612e66579182015b82811115612e66578251825591602001919060010190612e4b565b50612e72929150612ee7565b5090565b5080546000825590600052602060002090810190610d409190612ee7565b828054828255906000526020600020908101928215612e66579160200282015b82811115612e665781546001600160a01b0319166001600160a01b03843516178255602090920191600190910190612eb4565b5b80821115612e725760008155600101612ee8565b6001600160e01b031981168114610d4057600080fd5b600060208284031215612f2457600080fd5b8135611c1081612efc565b60005b83811015612f4a578181015183820152602001612f32565b838111156121ba5750506000910152565b60008151808452612f73816020860160208601612f2f565b601f01601f19169290920160200192915050565b602081526000611c106020830184612f5b565b600060208284031215612fac57600080fd5b5035919050565b80356001600160a01b0381168114612fca57600080fd5b919050565b60008060408385031215612fe257600080fd5b612feb83612fb3565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b60006001600160401b038084111561302957613029612ff9565b604051601f8501601f19908116603f0116810190828211818310171561305157613051612ff9565b8160405280935085815286868601111561306a57600080fd5b858560208301376000602087830101525050509392505050565b60006020828403121561309657600080fd5b81356001600160401b038111156130ac57600080fd5b8201601f810184136130bd57600080fd5b612af28482356020840161300f565b6000806000606084860312156130e157600080fd5b6130ea84612fb3565b92506130f860208501612fb3565b9150604084013590509250925092565b6000806040838503121561311b57600080fd5b8235915061312b60208401612fb3565b90509250929050565b60006020828403121561314657600080fd5b611c1082612fb3565b6020808252825182820181905260009190848201906040850190845b818110156131875783518352928401929184019160010161316b565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156131875783516001600160a01b0316835292840192918401916001016131af565b60008083601f8401126131e657600080fd5b5081356001600160401b038111156131fd57600080fd5b6020830191508360208260051b850101111561321857600080fd5b9250929050565b60008060006040848603121561323457600080fd5b83356001600160401b0381111561324a57600080fd5b613256868287016131d4565b9094509250613269905060208501612fb3565b90509250925092565b60008060006040848603121561328757600080fd5b8335925060208401356001600160401b038111156132a457600080fd5b6132b0868287016131d4565b9497909650939450505050565b600080604083850312156132d057600080fd5b6132d983612fb3565b9150602083013580151581146132ee57600080fd5b809150509250929050565b60006020828403121561330b57600080fd5b813560ff81168114611c1057600080fd5b6000806000806080858703121561333257600080fd5b61333b85612fb3565b935061334960208601612fb3565b92506040850135915060608501356001600160401b0381111561336b57600080fd5b8501601f8101871361337c57600080fd5b61338b8782356020840161300f565b91505092959194509250565b600080604083850312156133aa57600080fd5b6133b383612fb3565b915061312b60208401612fb3565b600080602083850312156133d457600080fd5b82356001600160401b038111156133ea57600080fd5b6133f6858286016131d4565b90969095509350505050565b600181811c9082168061341657607f821691505b6020821081141561343757634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b60008282101561349a5761349a613472565b500390565b600082198211156134b2576134b2613472565b500190565b6020808252601490820152734d617820737570706c792065786365656465642160601b604082015260600190565b60008160001904831182151516156134ff576134ff613472565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261352957613529613504565b500490565b634e487b7160e01b600052603260045260246000fd5b600060001982141561355857613558613472565b5060010190565b60208082526021908201527f45786365656473207065722077616c6c65742070726573616c65206c696d69746040820152601760f91b606082015260800190565b6000845160206135b38285838a01612f2f565b8551918401916135c68184848a01612f2f565b8554920191600090600181811c90808316806135e357607f831692505b85831081141561360157634e487b7160e01b85526022600452602485fd5b808015613615576001811461362657613653565b60ff19851688528388019550613653565b60008b81526020902060005b8581101561364b5781548a820152908401908801613632565b505083880195505b50939b9a5050505050505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061369790830184612f5b565b9695505050505050565b6000602082840312156136b357600080fd5b8151611c1081612efc565b6000826136cd576136cd613504565b50069056fea2646970667358221220b48bb92211ac1cbd4aac68571404b26410a50cc7c973dbb5a96c6427743fa21564736f6c63430008090033

Deployed Bytecode Sourcemap

49971:15541:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33482:372;;;;;;;;;;-1:-1:-1;33482:372:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;33482:372:0;;;;;;;;36092:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;37595:204::-;;;;;;;;;;-1:-1:-1;37595:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;37595:204:0;1528:203:1;37158:371:0;;;;;;;;;;-1:-1:-1;37158:371:0;;;;;:::i;:::-;;:::i;:::-;;63701:81;;;;;;;;;;;;;:::i;63459:106::-;;;;;;;;;;-1:-1:-1;63459:106:0;;;;;:::i;:::-;;:::i;30719:280::-;;;;;;;;;;-1:-1:-1;30964:12:0;;30772:7;30948:13;:28;30719:280;;;3544:25:1;;;3532:2;3517:18;30719:280:0;3398:177:1;60938:204:0;;;;;;;;;;-1:-1:-1;60938:204:0;;;;;:::i;:::-;;:::i;50897:30::-;;;;;;;;;;;;;;;;61584:94;;;;;;;;;;-1:-1:-1;61584:94:0;;;;;:::i;:::-;;:::i;38452:170::-;;;;;;;;;;-1:-1:-1;38452:170:0;;;;;:::i;:::-;;:::i;59865:298::-;;;;;;;;;;-1:-1:-1;59865:298:0;;;;;:::i;:::-;;:::i;50980:94::-;;;;;;;;;;;;;;;;32305:1105;;;;;;;;;;-1:-1:-1;32305:1105:0;;;;;:::i;:::-;;:::i;63971:89::-;;;;;;;;;;;;;:::i;50499:38::-;;;;;;;;;;;;;;;;64581:924;;;;;;;;;;;;;:::i;50544:39::-;;;;;;;;;;;;;;;;38693:185;;;;;;;;;;-1:-1:-1;38693:185:0;;;;;:::i;:::-;;:::i;54754:677::-;;;;;;;;;;-1:-1:-1;54754:677:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;52309:852::-;;;;;;:::i;:::-;;:::i;31292:713::-;;;;;;;;;;-1:-1:-1;31292:713:0;;;;;:::i;:::-;;:::i;62876:138::-;;;;;;;;;;-1:-1:-1;62876:138:0;;;;;:::i;:::-;;:::i;50358:30::-;;;;;;;;;;-1:-1:-1;50358:30:0;;;;;;;;50217:28;;;;;;;;;;;;;:::i;50767:32::-;;;;;;;;;;-1:-1:-1;50767:32:0;;;;;;;;57350:117;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;50182:28::-;;;;;;;;;;;;;:::i;35901:124::-;;;;;;;;;;-1:-1:-1;35901:124:0;;;;;:::i;:::-;;:::i;56034:280::-;;;;;;;;;;-1:-1:-1;56034:280:0;;;;;:::i;:::-;;:::i;58326:133::-;;;;;;;;;;;;;:::i;60394:438::-;;;;;;;;;;-1:-1:-1;60394:438:0;;;;;:::i;:::-;;:::i;58536:107::-;;;;;;;;;;-1:-1:-1;58622:13:0;;58536:107;;33918:206;;;;;;;;;;-1:-1:-1;33918:206:0;;;;;:::i;:::-;;:::i;8477:103::-;;;;;;;;;;;;;:::i;55606:241::-;;;;;;;;;;-1:-1:-1;55606:241:0;;;;;:::i;:::-;;:::i;59146:104::-;;;;;;;;;;-1:-1:-1;59146:104:0;;;;;:::i;:::-;;:::i;63227:106::-;;;;;;;;;;-1:-1:-1;63227:106:0;;;;;:::i;:::-;;:::i;7826:87::-;;;;;;;;;;-1:-1:-1;7899:6:0;;-1:-1:-1;;;;;7899:6:0;7826:87;;50590:38;;;;;;;;;;;;;;;;36261:104;;;;;;;;;;;;;:::i;50806:34::-;;;;;;;;;;-1:-1:-1;50806:34:0;;;;;;;;;;;53496:1168;;;;;;:::i;:::-;;:::i;37871:279::-;;;;;;;;;;-1:-1:-1;37871:279:0;;;;;:::i;:::-;;:::i;50252:99::-;;;;;;;;;;;;;:::i;58808:245::-;;;;;;;;;;-1:-1:-1;58808:245:0;;;;;:::i;:::-;;:::i;62041:136::-;;;;;;;;;;-1:-1:-1;62041:136:0;;;;;:::i;:::-;;:::i;62546:195::-;;;;;;;;;;-1:-1:-1;62546:195:0;;;;;:::i;:::-;;:::i;38949:342::-;;;;;;;;;;-1:-1:-1;38949:342:0;;;;;:::i;:::-;;:::i;61853:94::-;;;;;;;;;;-1:-1:-1;61853:94:0;;;;;:::i;:::-;;:::i;57595:478::-;;;;;;;;;;-1:-1:-1;57595:478:0;;;;;:::i;:::-;;:::i;50401:39::-;;;;;;;;;;;;;;;;50637:31;;;;;;;;;;;;;;;;62262:195;;;;;;;;;;-1:-1:-1;62262:195:0;;;;;:::i;:::-;;:::i;56778:487::-;;;;;;;;;;-1:-1:-1;56778:487:0;;;;;:::i;:::-;;:::i;38221:164::-;;;;;;;;;;-1:-1:-1;38221:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;38342:25:0;;;38318:4;38342:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;38221:164;50447:39;;;;;;;;;;;;;;;;61324:89;;;;;;;;;;;;;:::i;64241:98::-;;;;;;;;;;;;;:::i;8735:201::-;;;;;;;;;;-1:-1:-1;8735:201:0;;;;;:::i;:::-;;:::i;52169:41::-;;;;;;;;;;-1:-1:-1;52169:41:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9212:14:1;;9205:22;9187:41;;9259:2;9244:18;;9237:34;;;;9287:18;;;9280:34;9175:2;9160:18;52169:41:0;8991:329:1;59486:161:0;;;;;;;;;;-1:-1:-1;59486:161:0;;;;;:::i;:::-;;:::i;33482:372::-;33584:4;-1:-1:-1;;;;;;33621:40:0;;-1:-1:-1;;;33621:40:0;;:105;;-1:-1:-1;;;;;;;33678:48:0;;-1:-1:-1;;;33678:48:0;33621:105;:172;;;-1:-1:-1;;;;;;;33743:50:0;;-1:-1:-1;;;33743:50:0;33621:172;:225;;;-1:-1:-1;;;;;;;;;;20719:40:0;;;33810:36;33601:245;33482:372;-1:-1:-1;;33482:372:0:o;36092:100::-;36146:13;36179:5;36172:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36092:100;:::o;37595:204::-;37663:7;37688:16;37696:7;37688;:16::i;:::-;37683:64;;37713:34;;-1:-1:-1;;;37713:34:0;;;;;;;;;;;37683:64;-1:-1:-1;37767:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;37767:24:0;;37595:204::o;37158:371::-;37231:13;37247:24;37263:7;37247:15;:24::i;:::-;37231:40;;37292:5;-1:-1:-1;;;;;37286:11:0;:2;-1:-1:-1;;;;;37286:11:0;;37282:48;;;37306:24;;-1:-1:-1;;;37306:24:0;;;;;;;;;;;37282:48;6630:10;-1:-1:-1;;;;;37347:21:0;;;;;;:63;;-1:-1:-1;37373:37:0;37390:5;6630:10;38221:164;:::i;37373:37::-;37372:38;37347:63;37343:138;;;37434:35;;-1:-1:-1;;;37434:35:0;;;;;;;;;;;37343:138;37493:28;37502:2;37506:7;37515:5;37493:8;:28::i;:::-;37220:309;37158:371;;:::o;63701:81::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;;;;;;;;;63760:14:::1;::::0;;::::1;::::0;::::1;::::0;;;;-1:-1:-1;63760:14:0;;;;::::1;::::0;:9:::1;::::0;:14:::1;:::i;:::-;;63701:81::o:0;63459:106::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;63535:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;63459:106:::0;:::o;60938:204::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;30964:12;;30772:7;30948:13;:28;61045:9:::1;;:25;;;;:::i;:::-;61034:7;:36;;61010:90;;;::::0;-1:-1:-1;;;61010:90:0;;10977:2:1;61010:90:0::1;::::0;::::1;10959:21:1::0;11016:2;10996:18;;;10989:30;11055:27;11035:18;;;11028:55;11100:18;;61010:90:0::1;10775:349:1::0;61010:90:0::1;61111:13;:23:::0;60938:204::o;61584:94::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;61651:11:::1;:19:::0;61584:94::o;38452:170::-;38586:28;38596:4;38602:2;38606:7;38586:9;:28::i;59865:298::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;60015:13:::1;;60003:9;;:25;;;;:::i;:::-;59988:11;59972:13;30964:12:::0;;30772:7;30948:13;:28;;30719:280;59972:13:::1;:27;;;;:::i;:::-;:56;;59964:89;;;;-1:-1:-1::0;;;59964:89:0::1;;;;;;;:::i;:::-;60086:1;60072:11;:15;60064:47;;;::::0;-1:-1:-1;;;60064:47:0;;11813:2:1;60064:47:0::1;::::0;::::1;11795:21:1::0;11852:2;11832:18;;;11825:30;-1:-1:-1;;;11871:18:1;;;11864:49;11930:18;;60064:47:0::1;11611:343:1::0;60064:47:0::1;60122:33;60132:9;60143:11;60122:9;:33::i;32305:1105::-:0;32394:7;32427:16;32437:5;32427:9;:16::i;:::-;32418:5;:25;32414:61;;32452:23;;-1:-1:-1;;;32452:23:0;;;;;;;;;;;32414:61;32486:22;32511:13;;;32486:22;;32761:557;32781:14;32777:1;:18;32761:557;;;32821:31;32855:14;;;:11;:14;;;;;;;;;32821:48;;;;;;;;;-1:-1:-1;;;;;32821:48:0;;;;-1:-1:-1;;;32821:48:0;;-1:-1:-1;;;;;32821:48:0;;;;;;;;-1:-1:-1;;;32821:48:0;;;;;;;;;;;;;;;;32888:73;;32933:8;;;32888:73;32983:14;;-1:-1:-1;;;;;32983:28:0;;32979:111;;33056:14;;;-1:-1:-1;32979:111:0;33133:5;-1:-1:-1;;;;;33112:26:0;:17;-1:-1:-1;;;;;33112:26:0;;33108:195;;;33182:5;33167:11;:20;33163:85;;;-1:-1:-1;33223:1:0;-1:-1:-1;33216:8:0;;-1:-1:-1;;;33216:8:0;33163:85;33270:13;;;;;33108:195;32802:516;32761:557;32797:3;;32761:557;;;;33394:8;;;63971:89;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;64040:12:::1;::::0;;-1:-1:-1;;64024:28:0;::::1;64040:12;::::0;;::::1;64039:13;64024:28;::::0;;63971:89::o;64581:924::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;64706:8:::1;::::0;64650:21:::1;::::0;64631:16:::1;::::0;-1:-1:-1;;;;;64706:8:0::1;64744:3;64728:13;64650:21:::0;64739:2:::1;64728:13;:::i;:::-;:19;;;;:::i;:::-;64698:54;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64684:68;;;64771:2;64763:11;;;::::0;::::1;;64809:8;::::0;;64788:7:::1;::::0;-1:-1:-1;;;;;64809:8:0;;::::1;::::0;64847:3:::1;::::0;64831:13:::1;::::0;:8;;:13:::1;:::i;:::-;:19;;;;:::i;:::-;64801:54;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64787:68;;;64874:2;64866:11;;;::::0;::::1;;64912:8;::::0;64891:7:::1;::::0;-1:-1:-1;;;;;64912:8:0::1;64949:3;64934:12;:8:::0;64945:1:::1;64934:12;:::i;:::-;:18;;;;:::i;:::-;64904:53;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64890:67;;;64976:2;64968:11;;;::::0;::::1;;65014:8;::::0;64993:7:::1;::::0;-1:-1:-1;;;;;65014:8:0::1;65051:3;65036:12;:8:::0;65047:1:::1;65036:12;:::i;:::-;:18;;;;:::i;:::-;65006:53;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64992:67;;;65078:2;65070:11;;;::::0;::::1;;65116:8;::::0;65095:7:::1;::::0;-1:-1:-1;;;;;65116:8:0::1;65154:3;65138:13;:8:::0;65149:2:::1;65138:13;:::i;:::-;:19;;;;:::i;:::-;65108:54;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65094:68;;;65181:2;65173:11;;;::::0;::::1;;65219:8;::::0;65198:7:::1;::::0;-1:-1:-1;;;;;65219:8:0::1;65256:3;65241:12;:8:::0;65252:1:::1;65241:12;:::i;:::-;:18;;;;:::i;:::-;65211:53;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65197:67;;;65283:2;65275:11;;;::::0;::::1;;65321:9;::::0;65300:7:::1;::::0;-1:-1:-1;;;;;65321:9:0::1;65360:3;65344:13;:8:::0;65355:2:::1;65344:13;:::i;:::-;:19;;;;:::i;:::-;65313:55;::::0;::::1;::::0;;;;;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65299:69;;;65387:2;65379:11;;;::::0;::::1;;65425:10;::::0;65417:58:::1;::::0;65404:7:::1;::::0;-1:-1:-1;;;;;65425:10:0::1;::::0;65449:21:::1;::::0;65404:7;65417:58;65404:7;65417:58;65449:21;65425:10;65417:58:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;65403:72;;;65494:2;65486:11;;;::::0;::::1;;64618:887;;;;;;;;;64581:924::o:0;38693:185::-;38831:39;38848:4;38854:2;38858:7;38831:39;;;;;;;;;;;;:16;:39::i;54754:677::-;54814:16;54843:23;54869:17;54879:6;54869:9;:17::i;:::-;54843:43;;54897:30;54944:15;-1:-1:-1;;;;;54930:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54930:30:0;;54897:63;;54971:22;55008:23;55046:347;55071:15;55053;:33;:64;;;;;55108:9;;55090:14;:27;;55053:64;55046:347;;;55134:25;55162:23;55170:14;55162:7;:23::i;:::-;55134:51;;55225:6;-1:-1:-1;;;;;55204:27:0;:17;-1:-1:-1;;;;;55204:27:0;;55200:151;;;55285:14;55252:13;55266:15;55252:30;;;;;;;;:::i;:::-;;;;;;;;;;:47;55318:17;;;;:::i;:::-;;;;55200:151;55365:16;;;;:::i;:::-;;;;55119:274;55046:347;;;-1:-1:-1;55410:13:0;;54754:677;-1:-1:-1;;;;54754:677:0:o;52309:852::-;52385:12;;;;52377:44;;;;-1:-1:-1;;;52377:44:0;;13073:2:1;52377:44:0;;;13055:21:1;13112:2;13092:18;;;13085:30;-1:-1:-1;;;13131:18:1;;;13124:49;13190:18;;52377:44:0;12871:343:1;52377:44:0;52441:15;;;;;;;52440:16;52432:48;;;;-1:-1:-1;;;52432:48:0;;13421:2:1;52432:48:0;;;13403:21:1;13460:2;13440:18;;;13433:30;-1:-1:-1;;;13479:18:1;;;13472:49;13538:18;;52432:48:0;13219:343:1;52432:48:0;52542:13;;52530:9;;:25;;;;:::i;:::-;52515:11;52499:13;30964:12;;30772:7;30948:13;:28;;30719:280;52499:13;:27;;;;:::i;:::-;:56;;52491:89;;;;-1:-1:-1;;;52491:89:0;;;;;;;:::i;:::-;52613:1;52599:11;:15;:52;;;;;52633:18;;52618:11;:33;;52599:52;52591:85;;;;-1:-1:-1;;;52591:85:0;;13769:2:1;52591:85:0;;;13751:21:1;13808:2;13788:18;;;13781:30;-1:-1:-1;;;13827:18:1;;;13820:50;13887:18;;52591:85:0;13567:344:1;52591:85:0;52722:11;52708;;:25;;;;:::i;:::-;52695:9;:38;;52687:70;;;;-1:-1:-1;;;52687:70:0;;14118:2:1;52687:70:0;;;14100:21:1;14157:2;14137:18;;;14130:30;-1:-1:-1;;;14176:18:1;;;14169:49;14235:18;;52687:70:0;13916:343:1;52687:70:0;52849:19;;52798:10;52790:19;;;;:7;:19;;;;;:41;;;:55;;52834:11;;52790:55;:::i;:::-;:78;;52768:153;;;;-1:-1:-1;;;52768:153:0;;14466:2:1;52768:153:0;;;14448:21:1;14505:2;14485:18;;;14478:30;14544:27;14524:18;;;14517:55;14589:18;;52768:153:0;14264:349:1;52768:153:0;52945:10;52937:19;;;;:7;:19;;;;;:26;;;52932:66;;52973:10;52965:19;;;;:7;:19;;;;;:33;;-1:-1:-1;;52965:33:0;52994:4;52965:33;;;52932:66;53061:10;53053:19;;;;:7;:19;;;;;:41;;;:55;;53097:11;;53053:55;:::i;:::-;53017:10;53009:19;;;;:7;:19;;;;;:41;;:99;;;;53119:34;;53141:11;53119:9;:34::i;31292:713::-;31359:7;31404:13;;31359:7;;31618:328;31638:14;31634:1;:18;31618:328;;;31678:31;31712:14;;;:11;:14;;;;;;;;;31678:48;;;;;;;;;-1:-1:-1;;;;;31678:48:0;;;;-1:-1:-1;;;31678:48:0;;-1:-1:-1;;;;;31678:48:0;;;;;;;;-1:-1:-1;;;31678:48:0;;;;;;;;;;;;;;31745:186;;31810:5;31795:11;:20;31791:85;;;-1:-1:-1;31851:1:0;31292:713;-1:-1:-1;;;;31292:713:0:o;31791:85::-;31898:13;;;;;31745:186;-1:-1:-1;31654:3:0;;31618:328;;;;31974:23;;-1:-1:-1;;;31974:23:0;;;;;;;;;;;62876:138;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;62968:38;;::::1;::::0;:17:::1;::::0;:38:::1;::::0;::::1;::::0;::::1;:::i;50217:28::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;57350:117::-;57403:16;57439:20;57432:27;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;57432:27:0;;;;;;;;;;;;;;;;;;;;;;57350:117;:::o;50182:28::-;;;;;;;:::i;35901:124::-;35965:7;35992:20;36004:7;35992:11;:20::i;:::-;:25;;35901:124;-1:-1:-1;;35901:124:0:o;56034:280::-;56102:4;;56119:165;56140:20;:27;56136:31;;56119:165;;;56220:5;-1:-1:-1;;;;;56193:32:0;:20;56214:1;56193:23;;;;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;;;;56193:23:0;:32;56189:84;;;-1:-1:-1;56253:4:0;;56034:280;-1:-1:-1;;56034:280:0:o;56189:84::-;56169:3;;;;:::i;:::-;;;;56119:165;;;-1:-1:-1;56301:5:0;;56034:280;-1:-1:-1;;56034:280:0:o;58326:133::-;58383:7;58438:13;30964:12;;30772:7;30948:13;:28;;30719:280;58438:13;58422;;58410:9;;:25;;;;:::i;:::-;:41;;;;:::i;:::-;58403:48;;58326:133;:::o;60394:438::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;60519:1:::1;60503:13;;:17;:49;;;;;60539:13;;60524:11;:28;;60503:49;60495:86;;;::::0;-1:-1:-1;;;60495:86:0;;14820:2:1;60495:86:0::1;::::0;::::1;14802:21:1::0;14859:2;14839:18;;;14832:30;14898:26;14878:18;;;14871:54;14942:18;;60495:86:0::1;14618:348:1::0;60495:86:0::1;60614:1;60600:11;:15;60592:47;;;::::0;-1:-1:-1;;;60592:47:0;;11813:2:1;60592:47:0::1;::::0;::::1;11795:21:1::0;11852:2;11832:18;;;11825:30;-1:-1:-1;;;11871:18:1;;;11864:49;11930:18;;60592:47:0::1;11611:343:1::0;60592:47:0::1;60689:9;;60674:11;60658:13;30964:12:::0;;30772:7;30948:13;:28;;30719:280;60658:13:::1;:27;;;;:::i;:::-;:40;;60650:73;;;;-1:-1:-1::0;;;60650:73:0::1;;;;;;;:::i;:::-;60734:46;60768:11;60752:13;;:27;;;;:::i;33918:206::-:0;33982:7;-1:-1:-1;;;;;34006:19:0;;34002:60;;34034:28;;-1:-1:-1;;;34034:28:0;;;;;;;;;;;34002:60;-1:-1:-1;;;;;;34088:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;34088:27:0;;33918:206::o;8477:103::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;8542:30:::1;8569:1;8542:18;:30::i;:::-;8477:103::o:0;55606:241::-;55747:23;;-1:-1:-1;;15120:2:1;15116:15;;;15112:53;55747:23:0;;;15100:66:1;55705:4:0;;;;15182:12:1;;55747:23:0;;;;;;;;;;;;55737:34;;;;;;55722:49;;55789:50;55808:12;;55789:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55822:10:0;;;-1:-1:-1;55834:4:0;;-1:-1:-1;55789:18:0;:50::i;:::-;55782:57;;;55606:241;;;;;;:::o;59146:104::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;59218:10:::1;:24:::0;59146:104::o;63227:106::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;63303:22;;::::1;::::0;:9:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;36261:104::-:0;36317:13;36350:7;36343:14;;;;;:::i;53496:1168::-;53605:12;;;;53597:44;;;;-1:-1:-1;;;53597:44:0;;13073:2:1;53597:44:0;;;13055:21:1;13112:2;13092:18;;;13085:30;-1:-1:-1;;;13131:18:1;;;13124:49;13190:18;;53597:44:0;12871:343:1;53597:44:0;53703:13;;53691:9;;:25;;;;:::i;:::-;53676:11;53660:13;30964:12;;30772:7;30948:13;:28;;30719:280;53660:13;:27;;;;:::i;:::-;:56;;53652:89;;;;-1:-1:-1;;;53652:89:0;;;;;;;:::i;:::-;53760:15;;;;;;;53752:51;;;;-1:-1:-1;;;53752:51:0;;15407:2:1;53752:51:0;;;15389:21:1;15446:2;15426:18;;;15419:30;15485:25;15465:18;;;15458:53;15528:18;;53752:51:0;15205:347:1;53752:51:0;53849:11;53835;;:25;;;;:::i;:::-;53822:9;:38;;53814:70;;;;-1:-1:-1;;;53814:70:0;;14118:2:1;53814:70:0;;;14100:21:1;14157:2;14137:18;;;14130:30;-1:-1:-1;;;14176:18:1;;;14169:49;14235:18;;53814:70:0;13916:343:1;53814:70:0;53917:1;53903:11;:15;53895:48;;;;-1:-1:-1;;;53895:48:0;;13769:2:1;53895:48:0;;;13751:21:1;13808:2;13788:18;;;13781:30;-1:-1:-1;;;13827:18:1;;;13820:50;13887:18;;53895:48:0;13567:344:1;53895:48:0;53977:19;;53962:11;:34;;53954:80;;;;-1:-1:-1;;;53954:80:0;;;;;;;:::i;:::-;54049:11;;54064:1;54049:16;54045:106;;;54075:47;54097:12;;54111:10;54075:21;:47::i;:::-;54067:84;;;;-1:-1:-1;;;54067:84:0;;16161:2:1;54067:84:0;;;16143:21:1;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:54;16283:18;;54067:84:0;15959:348:1;54067:84:0;54166:11;;54181:1;54166:16;54162:93;;;54192:34;54215:10;54192:22;:34::i;:::-;54184:71;;;;-1:-1:-1;;;54184:71:0;;16161:2:1;54184:71:0;;;16143:21:1;16200:2;16180:18;;;16173:30;-1:-1:-1;;;16219:18:1;;;16212:54;16283:18;;54184:71:0;15959:348:1;54184:71:0;54346:19;;54296:10;54288:19;;;;:7;:19;;;;;:40;;;:54;;54331:11;;54288:54;:::i;:::-;:77;;54266:160;;;;-1:-1:-1;;;54266:160:0;;;;;;;:::i;:::-;54450:10;54442:19;;;;:7;:19;;;;;:26;;;54437:66;;54478:10;54470:19;;;;:7;:19;;;;;:33;;-1:-1:-1;;54470:33:0;54499:4;54470:33;;;54437:66;54565:10;54557:19;;;;:7;:19;;;;;:40;;;:54;;54600:11;;54557:54;:::i;:::-;54522:10;54514:19;;;;:7;:19;;;;;:40;;:97;;;;54622:34;;54644:11;54622:9;:34::i;37871:279::-;-1:-1:-1;;;;;37962:24:0;;6630:10;37962:24;37958:54;;;37995:17;;-1:-1:-1;;;37995:17:0;;;;;;;;;;;37958:54;6630:10;38025:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;38025:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;38025:53:0;;;;;;;;;;38094:48;;540:41:1;;;38025:42:0;;6630:10;38094:48;;513:18:1;38094:48:0;;;;;;;37871:279;;:::o;50252:99::-;;;;;;;:::i;58808:245::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;58949:10:::1;::::0;::::1;::::0;;:24:::1;;;58963:5;:10;;58972:1;58963:10;58949:24;:38;;;;58977:5;:10;;58986:1;58977:10;58949:38;58941:74;;;::::0;-1:-1:-1;;;58941:74:0;;16514:2:1;58941:74:0::1;::::0;::::1;16496:21:1::0;16553:2;16533:18;;;16526:30;16592:25;16572:18;;;16565:53;16635:18;;58941:74:0::1;16312:347:1::0;58941:74:0::1;59026:19;;:11;:19:::0;58808:245::o;62041:136::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;62129:18:::1;:40:::0;62041:136::o;62546:195::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;62655:1:::1;62638:14;:18;62630:56;;;::::0;-1:-1:-1;;;62630:56:0;;16866:2:1;62630:56:0::1;::::0;::::1;16848:21:1::0;16905:2;16885:18;;;16878:30;-1:-1:-1;;;16924:18:1;;;16917:55;16989:18;;62630:56:0::1;16664:349:1::0;62630:56:0::1;62697:19;:36:::0;62546:195::o;38949:342::-;39116:28;39126:4;39132:2;39136:7;39116:9;:28::i;:::-;39160:48;39183:4;39189:2;39193:7;39202:5;39160:22;:48::i;:::-;39155:129;;39232:40;;-1:-1:-1;;;39232:40:0;;;;;;;;;;;39155:129;38949:342;;;;:::o;61853:94::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;61920:11:::1;:19:::0;61853:94::o;57595:478::-;57669:13;57703:17;57711:8;57703:7;:17::i;:::-;57695:76;;;;-1:-1:-1;;;57695:76:0;;17220:2:1;57695:76:0;;;17202:21:1;17259:2;17239:18;;;17232:30;17298:34;17278:18;;;17271:62;-1:-1:-1;;;17349:18:1;;;17342:45;17404:19;;57695:76:0;17018:411:1;57695:76:0;57786:10;;;;57782:76;;57829:17;57822:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57595:478;;;:::o;57782:76::-;57868:28;57899:10;:8;:10::i;:::-;57868:41;;57958:1;57933:14;57927:28;:32;:138;;;;;;;;;;;;;;;;;57999:14;58015:19;:8;:17;:19::i;:::-;58036:9;57982:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57920:145;57595:478;-1:-1:-1;;;57595:478:0:o;62262:195::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;62371:1:::1;62354:14;:18;62346:56;;;::::0;-1:-1:-1;;;62346:56:0;;16866:2:1;62346:56:0::1;::::0;::::1;16848:21:1::0;16905:2;16885:18;;;16878:30;-1:-1:-1;;;16924:18:1;;;16917:55;16989:18;;62346:56:0::1;16664:349:1::0;62346:56:0::1;62413:19;:36:::0;62262:195::o;56778:487::-;56890:12;;56869:4;;56890:12;;:32;;;;-1:-1:-1;56907:15:0;;;;;;;56906:16;56890:32;56886:76;;;-1:-1:-1;56946:4:0;56939:11;;56886:76;56976:11;;56972:60;;-1:-1:-1;57016:4:0;57009:11;;56972:60;57046:11;;57061:1;57046:16;57042:98;;;57086:42;57108:12;;57122:5;57086:21;:42::i;:::-;57079:49;;;;57042:98;57154:11;;57169:1;57154:16;57150:85;;;57194:29;57217:5;57194:22;:29::i;57150:85::-;-1:-1:-1;57252:5:0;56778:487;;;;;:::o;61324:89::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;61395:10:::1;::::0;;-1:-1:-1;;61381:24:0;::::1;61395:10;::::0;;::::1;61394:11;61381:24;::::0;;61324:89::o;64241:98::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;64316:15:::1;::::0;;-1:-1:-1;;64297:34:0;::::1;64316:15;::::0;;;::::1;;;64315:16;64297:34:::0;;::::1;;::::0;;64241:98::o;8735:201::-;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;8824:22:0;::::1;8816:73;;;::::0;-1:-1:-1;;;8816:73:0;;19294:2:1;8816:73:0::1;::::0;::::1;19276:21:1::0;19333:2;19313:18;;;19306:30;19372:34;19352:18;;;19345:62;-1:-1:-1;;;19423:18:1;;;19416:36;19469:19;;8816:73:0::1;19092:402:1::0;8816:73:0::1;8900:28;8919:8;8900:18;:28::i;59486:161::-:0;7899:6;;-1:-1:-1;;;;;7899:6:0;6630:10;8046:23;8038:68;;;;-1:-1:-1;;;8038:68:0;;;;;;;:::i;:::-;59572:27:::1;59579:20;;59572:27;:::i;:::-;59610:29;:20;59633:6:::0;;59610:29:::1;:::i;10527:326::-:0;-1:-1:-1;;;;;10822:19:0;;:23;;;10527:326::o;39546:144::-;39603:4;39637:13;;39627:7;:23;:55;;;;-1:-1:-1;;39655:20:0;;;;:11;:20;;;;;:27;-1:-1:-1;;;39655:27:0;;;;39654:28;;39546:144::o;46752:196::-;46867:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;46867:29:0;-1:-1:-1;;;;;46867:29:0;;;;;;;;;46912:28;;46867:24;;46912:28;;;;;;;46752:196;;;:::o;42253:2112::-;42368:35;42406:20;42418:7;42406:11;:20::i;:::-;42481:18;;42368:58;;-1:-1:-1;42439:22:0;;-1:-1:-1;;;;;42465:34:0;6630:10;-1:-1:-1;;;;;42465:34:0;;:101;;;-1:-1:-1;42533:18:0;;42516:50;;6630:10;38221:164;:::i;42516:50::-;42465:154;;;-1:-1:-1;6630:10:0;42583:20;42595:7;42583:11;:20::i;:::-;-1:-1:-1;;;;;42583:36:0;;42465:154;42439:181;;42638:17;42633:66;;42664:35;;-1:-1:-1;;;42664:35:0;;;;;;;;;;;42633:66;42736:4;-1:-1:-1;;;;;42714:26:0;:13;:18;;;-1:-1:-1;;;;;42714:26:0;;42710:67;;42749:28;;-1:-1:-1;;;42749:28:0;;;;;;;;;;;42710:67;-1:-1:-1;;;;;42792:16:0;;42788:52;;42817:23;;-1:-1:-1;;;42817:23:0;;;;;;;;;;;42788:52;42961:49;42978:1;42982:7;42991:13;:18;;;42961:8;:49::i;:::-;-1:-1:-1;;;;;43306:18:0;;;;;;;:12;:18;;;;;;;;:31;;-1:-1:-1;;43306:31:0;;;-1:-1:-1;;;;;43306:31:0;;;-1:-1:-1;;43306:31:0;;;;;;;43352:16;;;;;;;;;:29;;;;;;;;-1:-1:-1;43352:29:0;;;;;;;;;;;43398:20;;;:11;:20;;;;;;:30;;-1:-1:-1;;;;;;43443:61:0;;;;-1:-1:-1;;;43488:15:0;43443:61;;;;;;;;;;;43778:11;;;43808:24;;;;;:29;43778:11;;43808:29;43804:445;;44033:13;;44019:11;:27;44015:219;;;44103:18;;;44071:24;;;:11;:24;;;;;;;;:50;;44186:28;;;;-1:-1:-1;;;;;44144:70:0;-1:-1:-1;;;44144:70:0;-1:-1:-1;;;;;;44144:70:0;;;-1:-1:-1;;;;;44071:50:0;;;44144:70;;;;;;;44015:219;43281:979;44296:7;44292:2;-1:-1:-1;;;;;44277:27:0;44286:4;-1:-1:-1;;;;;44277:27:0;;;;;;;;;;;44315:42;42357:2008;;42253:2112;;;:::o;39698:104::-;39767:27;39777:2;39781:8;39767:27;;;;;;;;;;;;:9;:27::i;34756:1083::-;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;34922:13:0;;34866:7;;34915:20;;34911:861;;;34956:31;34990:17;;;:11;:17;;;;;;;;;34956:51;;;;;;;;;-1:-1:-1;;;;;34956:51:0;;;;-1:-1:-1;;;34956:51:0;;-1:-1:-1;;;;;34956:51:0;;;;;;;;-1:-1:-1;;;34956:51:0;;;;;;;;;;;;;;35026:731;;35076:14;;-1:-1:-1;;;;;35076:28:0;;35072:101;;35140:9;34756:1083;-1:-1:-1;;;34756:1083:0:o;35072:101::-;-1:-1:-1;;;35517:6:0;35562:17;;;;:11;:17;;;;;;;;;35550:29;;;;;;;;;-1:-1:-1;;;;;35550:29:0;;;;;-1:-1:-1;;;35550:29:0;;-1:-1:-1;;;;;35550:29:0;;;;;;;;-1:-1:-1;;;35550:29:0;;;;;;;;;;;;;35610:28;35606:109;;35678:9;34756:1083;-1:-1:-1;;;34756:1083:0:o;35606:109::-;35477:261;;;34937:835;34911:861;35800:31;;-1:-1:-1;;;35800:31:0;;;;;;;;;;;9096:191;9189:6;;;-1:-1:-1;;;;;9206:17:0;;;-1:-1:-1;;;;;;9206:17:0;;;;;;;9239:40;;9189:6;;;9206:17;9189:6;;9239:40;;9170:16;;9239:40;9159:128;9096:191;:::o;2282:190::-;2407:4;2460;2431:25;2444:5;2451:4;2431:12;:25::i;:::-;:33;;2282:190;-1:-1:-1;;;;2282:190:0:o;47513:790::-;47668:4;-1:-1:-1;;;;;47689:13:0;;10822:19;:23;47685:611;;47725:72;;-1:-1:-1;;;47725:72:0;;-1:-1:-1;;;;;47725:36:0;;;;;:72;;6630:10;;47776:4;;47782:7;;47791:5;;47725:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47725:72:0;;;;;;;;-1:-1:-1;;47725:72:0;;;;;;;;;;;;:::i;:::-;;;47721:520;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;47971:13:0;;47967:259;;48021:40;;-1:-1:-1;;;48021:40:0;;;;;;;;;;;47967:259;48176:6;48170:13;48161:6;48157:2;48153:15;48146:38;47721:520;-1:-1:-1;;;;;;47848:55:0;-1:-1:-1;;;47848:55:0;;-1:-1:-1;47841:62:0;;47685:611;-1:-1:-1;48280:4:0;47685:611;47513:790;;;;;;:::o;58141:110::-;58201:13;58234:9;58227:16;;;;;:::i;4112:723::-;4168:13;4389:10;4385:53;;-1:-1:-1;;4416:10:0;;;;;;;;;;;;-1:-1:-1;;;4416:10:0;;;;;4112:723::o;4385:53::-;4463:5;4448:12;4504:78;4511:9;;4504:78;;4537:8;;;;:::i;:::-;;-1:-1:-1;4560:10:0;;-1:-1:-1;4568:2:0;4560:10;;:::i;:::-;;;4504:78;;;4592:19;4624:6;-1:-1:-1;;;;;4614:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4614:17:0;;4592:39;;4642:154;4649:10;;4642:154;;4676:11;4686:1;4676:11;;:::i;:::-;;-1:-1:-1;4745:10:0;4753:2;4745:5;:10;:::i;:::-;4732:24;;:2;:24;:::i;:::-;4719:39;;4702:6;4709;4702:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;4702:56:0;;;;;;;;-1:-1:-1;4773:11:0;4782:2;4773:11;;:::i;:::-;;;4642:154;;40165:163;40288:32;40294:2;40298:8;40308:5;40315:4;40288:5;:32::i;2833:675::-;2916:7;2959:4;2916:7;2974:497;2998:5;:12;2994:1;:16;2974:497;;;3032:20;3055:5;3061:1;3055:8;;;;;;;;:::i;:::-;;;;;;;3032:31;;3098:12;3082;:28;3078:382;;3584:13;3634:15;;;3670:4;3663:15;;;3717:4;3701:21;;3210:57;;3078:382;;;3584:13;3634:15;;;3670:4;3663:15;;;3717:4;3701:21;;3387:57;;3078:382;-1:-1:-1;3012:3:0;;;;:::i;:::-;;;;2974:497;;;-1:-1:-1;3488:12:0;2833:675;-1:-1:-1;;;2833:675:0:o;40587:1412::-;40726:20;40749:13;-1:-1:-1;;;;;40777:16:0;;40773:48;;40802:19;;-1:-1:-1;;;40802:19:0;;;;;;;;;;;40773:48;40836:13;40832:44;;40858:18;;-1:-1:-1;;;40858:18:0;;;;;;;;;;;40832:44;-1:-1:-1;;;;;41227:16:0;;;;;;:12;:16;;;;;;;;:44;;-1:-1:-1;;41286:49:0;;-1:-1:-1;;;;;41227:44:0;;;;;;;41286:49;;;;-1:-1:-1;;41227:44:0;;;;;;41286:49;;;;;;;;;;;;;;;;41352:25;;;:11;:25;;;;;:35;;-1:-1:-1;;;;;;41402:66:0;;;;-1:-1:-1;;;41452:15:0;41402:66;;;;;;;;;;;41352:25;;41537:328;41557:8;41553:1;:12;41537:328;;;41596:38;;41621:12;;-1:-1:-1;;;;;41596:38:0;;;41613:1;;41596:38;;41613:1;;41596:38;41657:4;:68;;;;;41666:59;41697:1;41701:2;41705:12;41719:5;41666:22;:59::i;:::-;41665:60;41657:68;41653:164;;;41757:40;;-1:-1:-1;;;41757:40:0;;;;;;;;;;;41653:164;41835:14;;;;;41567:3;41537:328;;;-1:-1:-1;41881:13:0;:28;41931:60;38949:342;-1:-1:-1;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:173::-;1804:20;;-1:-1:-1;;;;;1853:31:1;;1843:42;;1833:70;;1899:1;1896;1889:12;1833:70;1736:173;;;:::o;1914:254::-;1982:6;1990;2043:2;2031:9;2022:7;2018:23;2014:32;2011:52;;;2059:1;2056;2049:12;2011:52;2082:29;2101:9;2082:29;:::i;:::-;2072:39;2158:2;2143:18;;;;2130:32;;-1:-1:-1;;;1914:254:1:o;2173:127::-;2234:10;2229:3;2225:20;2222:1;2215:31;2265:4;2262:1;2255:15;2289:4;2286:1;2279:15;2305:632;2370:5;-1:-1:-1;;;;;2441:2:1;2433:6;2430:14;2427:40;;;2447:18;;:::i;:::-;2522:2;2516:9;2490:2;2576:15;;-1:-1:-1;;2572:24:1;;;2598:2;2568:33;2564:42;2552:55;;;2622:18;;;2642:22;;;2619:46;2616:72;;;2668:18;;:::i;:::-;2708:10;2704:2;2697:22;2737:6;2728:15;;2767:6;2759;2752:22;2807:3;2798:6;2793:3;2789:16;2786:25;2783:45;;;2824:1;2821;2814:12;2783:45;2874:6;2869:3;2862:4;2854:6;2850:17;2837:44;2929:1;2922:4;2913:6;2905;2901:19;2897:30;2890:41;;;;2305:632;;;;;:::o;2942:451::-;3011:6;3064:2;3052:9;3043:7;3039:23;3035:32;3032:52;;;3080:1;3077;3070:12;3032:52;3120:9;3107:23;-1:-1:-1;;;;;3145:6:1;3142:30;3139:50;;;3185:1;3182;3175:12;3139:50;3208:22;;3261:4;3253:13;;3249:27;-1:-1:-1;3239:55:1;;3290:1;3287;3280:12;3239:55;3313:74;3379:7;3374:2;3361:16;3356:2;3352;3348:11;3313:74;:::i;3580:328::-;3657:6;3665;3673;3726:2;3714:9;3705:7;3701:23;3697:32;3694:52;;;3742:1;3739;3732:12;3694:52;3765:29;3784:9;3765:29;:::i;:::-;3755:39;;3813:38;3847:2;3836:9;3832:18;3813:38;:::i;:::-;3803:48;;3898:2;3887:9;3883:18;3870:32;3860:42;;3580:328;;;;;:::o;3913:254::-;3981:6;3989;4042:2;4030:9;4021:7;4017:23;4013:32;4010:52;;;4058:1;4055;4048:12;4010:52;4094:9;4081:23;4071:33;;4123:38;4157:2;4146:9;4142:18;4123:38;:::i;:::-;4113:48;;3913:254;;;;;:::o;4354:186::-;4413:6;4466:2;4454:9;4445:7;4441:23;4437:32;4434:52;;;4482:1;4479;4472:12;4434:52;4505:29;4524:9;4505:29;:::i;4545:632::-;4716:2;4768:21;;;4838:13;;4741:18;;;4860:22;;;4687:4;;4716:2;4939:15;;;;4913:2;4898:18;;;4687:4;4982:169;4996:6;4993:1;4990:13;4982:169;;;5057:13;;5045:26;;5126:15;;;;5091:12;;;;5018:1;5011:9;4982:169;;;-1:-1:-1;5168:3:1;;4545:632;-1:-1:-1;;;;;;4545:632:1:o;5182:658::-;5353:2;5405:21;;;5475:13;;5378:18;;;5497:22;;;5324:4;;5353:2;5576:15;;;;5550:2;5535:18;;;5324:4;5619:195;5633:6;5630:1;5627:13;5619:195;;;5698:13;;-1:-1:-1;;;;;5694:39:1;5682:52;;5789:15;;;;5754:12;;;;5730:1;5648:9;5619:195;;5845:367;5908:8;5918:6;5972:3;5965:4;5957:6;5953:17;5949:27;5939:55;;5990:1;5987;5980:12;5939:55;-1:-1:-1;6013:20:1;;-1:-1:-1;;;;;6045:30:1;;6042:50;;;6088:1;6085;6078:12;6042:50;6125:4;6117:6;6113:17;6101:29;;6185:3;6178:4;6168:6;6165:1;6161:14;6153:6;6149:27;6145:38;6142:47;6139:67;;;6202:1;6199;6192:12;6139:67;5845:367;;;;;:::o;6217:511::-;6312:6;6320;6328;6381:2;6369:9;6360:7;6356:23;6352:32;6349:52;;;6397:1;6394;6387:12;6349:52;6437:9;6424:23;-1:-1:-1;;;;;6462:6:1;6459:30;6456:50;;;6502:1;6499;6492:12;6456:50;6541:70;6603:7;6594:6;6583:9;6579:22;6541:70;:::i;:::-;6630:8;;-1:-1:-1;6515:96:1;-1:-1:-1;6684:38:1;;-1:-1:-1;6718:2:1;6703:18;;6684:38;:::i;:::-;6674:48;;6217:511;;;;;:::o;6918:505::-;7013:6;7021;7029;7082:2;7070:9;7061:7;7057:23;7053:32;7050:52;;;7098:1;7095;7088:12;7050:52;7134:9;7121:23;7111:33;;7195:2;7184:9;7180:18;7167:32;-1:-1:-1;;;;;7214:6:1;7211:30;7208:50;;;7254:1;7251;7244:12;7208:50;7293:70;7355:7;7346:6;7335:9;7331:22;7293:70;:::i;:::-;6918:505;;7382:8;;-1:-1:-1;7267:96:1;;-1:-1:-1;;;;6918:505:1:o;7428:347::-;7493:6;7501;7554:2;7542:9;7533:7;7529:23;7525:32;7522:52;;;7570:1;7567;7560:12;7522:52;7593:29;7612:9;7593:29;:::i;:::-;7583:39;;7672:2;7661:9;7657:18;7644:32;7719:5;7712:13;7705:21;7698:5;7695:32;7685:60;;7741:1;7738;7731:12;7685:60;7764:5;7754:15;;;7428:347;;;;;:::o;7780:269::-;7837:6;7890:2;7878:9;7869:7;7865:23;7861:32;7858:52;;;7906:1;7903;7896:12;7858:52;7945:9;7932:23;7995:4;7988:5;7984:16;7977:5;7974:27;7964:55;;8015:1;8012;8005:12;8054:667;8149:6;8157;8165;8173;8226:3;8214:9;8205:7;8201:23;8197:33;8194:53;;;8243:1;8240;8233:12;8194:53;8266:29;8285:9;8266:29;:::i;:::-;8256:39;;8314:38;8348:2;8337:9;8333:18;8314:38;:::i;:::-;8304:48;;8399:2;8388:9;8384:18;8371:32;8361:42;;8454:2;8443:9;8439:18;8426:32;-1:-1:-1;;;;;8473:6:1;8470:30;8467:50;;;8513:1;8510;8503:12;8467:50;8536:22;;8589:4;8581:13;;8577:27;-1:-1:-1;8567:55:1;;8618:1;8615;8608:12;8567:55;8641:74;8707:7;8702:2;8689:16;8684:2;8680;8676:11;8641:74;:::i;:::-;8631:84;;;8054:667;;;;;;;:::o;8726:260::-;8794:6;8802;8855:2;8843:9;8834:7;8830:23;8826:32;8823:52;;;8871:1;8868;8861:12;8823:52;8894:29;8913:9;8894:29;:::i;:::-;8884:39;;8942:38;8976:2;8965:9;8961:18;8942:38;:::i;9325:437::-;9411:6;9419;9472:2;9460:9;9451:7;9447:23;9443:32;9440:52;;;9488:1;9485;9478:12;9440:52;9528:9;9515:23;-1:-1:-1;;;;;9553:6:1;9550:30;9547:50;;;9593:1;9590;9583:12;9547:50;9632:70;9694:7;9685:6;9674:9;9670:22;9632:70;:::i;:::-;9721:8;;9606:96;;-1:-1:-1;9325:437:1;-1:-1:-1;;;;9325:437:1:o;9767:380::-;9846:1;9842:12;;;;9889;;;9910:61;;9964:4;9956:6;9952:17;9942:27;;9910:61;10017:2;10009:6;10006:14;9986:18;9983:38;9980:161;;;10063:10;10058:3;10054:20;10051:1;10044:31;10098:4;10095:1;10088:15;10126:4;10123:1;10116:15;9980:161;;9767:380;;;:::o;10152:356::-;10354:2;10336:21;;;10373:18;;;10366:30;10432:34;10427:2;10412:18;;10405:62;10499:2;10484:18;;10152:356::o;10513:127::-;10574:10;10569:3;10565:20;10562:1;10555:31;10605:4;10602:1;10595:15;10629:4;10626:1;10619:15;10645:125;10685:4;10713:1;10710;10707:8;10704:34;;;10718:18;;:::i;:::-;-1:-1:-1;10755:9:1;;10645:125::o;11129:128::-;11169:3;11200:1;11196:6;11193:1;11190:13;11187:39;;;11206:18;;:::i;:::-;-1:-1:-1;11242:9:1;;11129:128::o;11262:344::-;11464:2;11446:21;;;11503:2;11483:18;;;11476:30;-1:-1:-1;;;11537:2:1;11522:18;;11515:50;11597:2;11582:18;;11262:344::o;11959:168::-;11999:7;12065:1;12061;12057:6;12053:14;12050:1;12047:21;12042:1;12035:9;12028:17;12024:45;12021:71;;;12072:18;;:::i;:::-;-1:-1:-1;12112:9:1;;11959:168::o;12132:127::-;12193:10;12188:3;12184:20;12181:1;12174:31;12224:4;12221:1;12214:15;12248:4;12245:1;12238:15;12264:120;12304:1;12330;12320:35;;12335:18;;:::i;:::-;-1:-1:-1;12369:9:1;;12264:120::o;12599:127::-;12660:10;12655:3;12651:20;12648:1;12641:31;12691:4;12688:1;12681:15;12715:4;12712:1;12705:15;12731:135;12770:3;-1:-1:-1;;12791:17:1;;12788:43;;;12811:18;;:::i;:::-;-1:-1:-1;12858:1:1;12847:13;;12731:135::o;15557:397::-;15759:2;15741:21;;;15798:2;15778:18;;;15771:30;15837:34;15832:2;15817:18;;15810:62;-1:-1:-1;;;15903:2:1;15888:18;;15881:31;15944:3;15929:19;;15557:397::o;17560:1527::-;17784:3;17822:6;17816:13;17848:4;17861:51;17905:6;17900:3;17895:2;17887:6;17883:15;17861:51;:::i;:::-;17975:13;;17934:16;;;;17997:55;17975:13;17934:16;18019:15;;;17997:55;:::i;:::-;18141:13;;18074:20;;;18114:1;;18201;18223:18;;;;18276;;;;18303:93;;18381:4;18371:8;18367:19;18355:31;;18303:93;18444:2;18434:8;18431:16;18411:18;18408:40;18405:167;;;-1:-1:-1;;;18471:33:1;;18527:4;18524:1;18517:15;18557:4;18478:3;18545:17;18405:167;18588:18;18615:110;;;;18739:1;18734:328;;;;18581:481;;18615:110;-1:-1:-1;;18650:24:1;;18636:39;;18695:20;;;;-1:-1:-1;18615:110:1;;18734:328;17507:1;17500:14;;;17544:4;17531:18;;18829:1;18843:169;18857:8;18854:1;18851:15;18843:169;;;18939:14;;18924:13;;;18917:37;18982:16;;;;18874:10;;18843:169;;;18847:3;;19043:8;19036:5;19032:20;19025:27;;18581:481;-1:-1:-1;19078:3:1;;17560:1527;-1:-1:-1;;;;;;;;;;;17560:1527:1:o;19499:489::-;-1:-1:-1;;;;;19768:15:1;;;19750:34;;19820:15;;19815:2;19800:18;;19793:43;19867:2;19852:18;;19845:34;;;19915:3;19910:2;19895:18;;19888:31;;;19693:4;;19936:46;;19962:19;;19954:6;19936:46;:::i;:::-;19928:54;19499:489;-1:-1:-1;;;;;;19499:489:1:o;19993:249::-;20062:6;20115:2;20103:9;20094:7;20090:23;20086:32;20083:52;;;20131:1;20128;20121:12;20083:52;20163:9;20157:16;20182:30;20206:5;20182:30;:::i;20247:112::-;20279:1;20305;20295:35;;20310:18;;:::i;:::-;-1:-1:-1;20344:9:1;;20247:112::o

Swarm Source

ipfs://b48bb92211ac1cbd4aac68571404b26410a50cc7c973dbb5a96c6427743fa215
Loading...
Loading
Loading...
Loading
[ 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.