ETH Price: $3,405.79 (+1.53%)

NOUNDLESTHEORY (NOUNDLESTHEORY)
 

Overview

TokenID

10729

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
NoundlesTheory

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-12-03
*/

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


// OpenZeppelin Contracts v4.4.0 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

// File: contracts/EvilNoundlesVRF.sol


pragma solidity ^0.8.0;




interface InterfaceRainbows {
    function transferTokens(address _from, address _to) external;
    function burn(address user, uint256 amount) external;
}

interface InterfaceOriginals {
    function ownerOf(uint256 tokenId) external view returns (address);
    function getNoundlesFromWallet(address _noundles) external view returns (uint256[] memory);
}

interface InterfaceRandomNumber {
    function getRandomNumber(uint256 arg) external returns (uint);
    // function getRandomNumberV2(uint256 _arg) external returns (bytes32 requestId);
    function getRandomNumberV2(uint256 _arg) external payable returns (uint256 requestId);
}

// the old noundle theory contract, since we need to patch it :(
interface InterfacePatched {
    function ownerOf(uint256 tokenId) external view returns (address);
    function getTypeByTokenIds(uint256[] memory _tokenId) external view returns(uint8[] memory);
    // function totalSupply() external view returns (uint256);
}

/*
    :)
*/
contract NoundlesTheory is ERC721, Ownable {

    using Counters for Counters.Counter;
    Counters.Counter private localTotalSupply;

    // Interfaces to interact with the other contracts
    InterfaceRainbows public Rainbows;
    InterfaceOriginals public Originals;
    InterfaceRandomNumber public RandomNumber;
    InterfacePatched public BetaTheory;

    /*
     * Constants
     * MAX_EVIL_NOUNDLES        = Maximum Supply for Evil Noundles that could be minted
     * MAX_COMPANION_NOUNDLES   = Maximum Supply for public mint with eth or rainbows (with 100% chance at companion).
     * MAX_FREE_COMPANION_MINTS = Maximum Supply for every Noundle holder to mint one companion
     * MAX_FREE_LAND_MINTS      = Maximum Supply for every Genesis Noundle Holder to mint some land (you deserve it kings)
     * MAX_RESERVED_EVIL        = Evil Reserved noundles for the team for giveaways, advisors, etc.
     * MAX_RESERVED_LAND        = Land Reserved noundles for the team for giveaways, advisors, etc.
     * MAX_RESERVED_COMP        = Companions Reserved noundles for the team for giveaways, advisors, etc.
     */
    uint256 public constant MAX_EVIL_NOUNDLES        = 40000;
    uint256 public constant MAX_COMPANION_NOUNDLES   = 7000;
    uint256 public constant MAX_FREE_EVIL_MINTS      = 8888;
    uint256 public constant MAX_FREE_COMPANION_MINTS = 8888;
    uint256 public constant MAX_FREE_LAND_MINTS      = 8888;
    uint256 public constant MAX_RESERVED_EVIL        = 250;
    uint256 public constant MAX_RESERVED_LAND        = 250;
    uint256 public constant MAX_RESERVED_COMP        = 250;
    uint256 public constant OG_TOTAL_SUPPLY          = 7465;



    // Track all the mintable tokens.
    uint256[] public companionList;
    uint256[] public evilList;
    uint256[] public lowLandList;
    uint256[] public midLandList;
    uint256[] public highLandList;

    // Each number is based on a %
    uint256 public percentEvil      = 10;
    uint256 public percentSteal     = 10;
    uint256 public percentJail      = 10;
    uint256 public percentLowLand   = 75;
    uint256 public percentMidLand   = 20;
    uint256 public percentHighLand  = 5;

    // Total minted of each kind.
    uint256 public mintCountCompanions = 0;
    uint256 public mintCountEvil       = 0;
    uint256 public mintCountLandLow    = 0;
    uint256 public mintCountLandMid    = 0;
    uint256 public mintCountLandHigh   = 0;

    // Public minting costs - these will most likely change when contract is deployed, so don't look to deep into them
    uint256 public evilMintPriceRainbow = 20 ether;
    uint256 public landMintPriceRainbow = 50 ether;

    // Track the free mints for companions and evil noundle mints
    uint256 public freeCompanionMint = 0;
    uint256 public evilNoundleMint   = 0;

    // Tracks the reserved mints to make sure we don't go over it
    uint256 public reservedEvil = 0;
    uint256 public reservedLand = 0;
    uint256 public reservedComp = 0;

    // Track the whitelisted evil noundles
    mapping(address => bool) evilNoundleAllowed;
    mapping(address => bool) evilNoundleMinted;
    mapping(address => bool) freeCompanionAllowed;
    mapping(address => bool) freeCompanionMinted;
    bool public overrideContractMintBlock = false;

    // Track the whitelisted land owners
    mapping(address => bool) landAllowed;
    mapping(address => bool) landMinted;

    // Tracks the tokens that were already used to mint companions - prevents people from transfering their token to new wallets and claiming again :)
    mapping(uint256 => bool) alreadyMintedNoundles;

    // Tracks the tokens that were already used to mint land
    mapping(uint256 => bool) alreadyMintedLandNoundles;

    // Minting Settings
    uint256 public saleOneTime = 0;
    uint256 public saleTwoTime = 0; // lands + more :)

    // $RAINBOW Minting costs
    bool    public rainbowMintingEnabled = false;
    uint256 public rBaseMintPriceTier1   = 40.0 ether;
    uint256 public rBaseMintPriceTier2   = 80.0 ether;
    uint256 public rBaseMintPriceTier3   = 120.0 ether;
    uint256 public tier2Start            = 10000;
    uint256 public tier3Start            = 17500;

    // Jail Settings
    uint256 public jailLength    = 10800;
    uint256 public getOutOfJail  = 2.0 ether;
    mapping (uint256 => uint256) public jailHouse;

    // Counters.
    uint256 public counterStolenAttempted = 0;
    uint256 public counterStolen          = 0;
    uint256 public counterBail            = 0;
    uint256 public counterJailed          = 0;

    // Most Wanted
    mapping (address => uint256) public mostWantedValues;
    address [] public mostWantedMembers;

    // Tracks the amount of tokens for Noundle Theory
    mapping (address => uint256) public companionBalance;
    mapping (address => uint256) public evilBalance;

    // different tiers give different protection bonuses when being robbed
    mapping (address => uint256) public lowLandBalance;
    mapping (address => uint256) public midLandBalance;
    mapping (address => uint256) public highLandBalance;

    // Migration stuff.
    mapping (uint256 => bool)    public alreadyClaimedMigration;
    mapping (uint256 => uint256) public MigrationMapToMap;
    mapping (uint256 => uint8)   public MigrationValue;
    bool public migrationEnabled = false;

    bool public weaponsEnabled = true;

    /*
     * The types of Noundles in the Noundle Theory Game
     * 0 - companions
     * 1 - evil noundles
     * 2 - low tier land (phase 2)
     * 3 - mid tier land (phase 3)
     * 4 - high tier land (phase 4)
     **/
    mapping (uint256 => uint8) public noundleType;
    mapping (uint256 => uint256) public noundleOffsetCount;

    // random callback map.
    // mapping (bytes32 => bool)    public callbackProcessing;
    mapping (bytes32 => uint256) public callbackMap;
    mapping (uint256 => bool)    public callbackSaleBlock;
    mapping (uint256 => address) public callbackOwner;
    bool public overrideCallbackSaleBlock = false;

    // Rest of the contract settings
    string  private baseURI;
    address public founder1;
    address public founder2;


    modifier isPhaseOneStarted() {
        require(block.timestamp >= saleOneTime && saleOneTime > 0, "Phase One hasn't started");
        _;
    }

    modifier isPhaseTwoStarted() {
        require(block.timestamp >= saleTwoTime && saleTwoTime > 0, "Phase Two hasn't started");
        _;
    }

    modifier isRainbowMintingEnabled() {
        require(rainbowMintingEnabled, "Cannot mint with $RAINBOWS yet.");
        _;
    }

    constructor(string memory _uri) ERC721("NOUNDLESTHEORY", "NOUNDLESTHEORY") {
        baseURI = _uri;
    }

    // Adds a user to the claimable evil noundle mint
    function addEvilNoundlers(address[] memory _noundles) public onlyOwner {
        for (uint256 __noundles;__noundles < _noundles.length;__noundles++) {
            evilNoundleAllowed[_noundles[__noundles]] = true;
        }
    }

    // Check if a address is on the free mint.
    function checkEvilNoundlers(address _noundles) public view returns (bool) {
        return evilNoundleAllowed[_noundles];
    }

    // Adds a user to the claimable free noundle mint
    function addFreeNoundlers(address[] memory _noundles) public onlyOwner {
        for (uint256 __noundles;__noundles < _noundles.length;__noundles++) {
            freeCompanionAllowed[_noundles[__noundles]] = true;
        }
    }

    // Check if a address is on the free mint.
    function checkFreeNoundlers(address _noundles) public view returns (bool) {
        return freeCompanionAllowed[_noundles];
    }


    // generic minting function :)
    function _handleMinting(address _to, uint256 _index, uint8 _type, bool useECType) private {

        // Attempt to mint.
        _safeMint(_to, _index);

        localTotalSupply.increment();

        // Removed for now.
        if (useECType && _type == 0) {
            companionBalance[_to]++;
            companionList.push(_index);
            noundleOffsetCount[_index] = mintCountCompanions;
            mintCountCompanions++;
        } else if (useECType && _type == 1) {
            evilBalance[_to]++;
            evilList.push(_index);
            noundleOffsetCount[_index] = mintCountEvil;
            mintCountEvil++;
        } else if (_type == 2) {
            lowLandBalance[_to]++;
            lowLandList.push(_index);
            noundleOffsetCount[_index] = mintCountLandLow;
            mintCountLandLow++;
        } else if (_type == 3) {
            midLandBalance[_to]++;
            midLandList.push(_index);
            noundleOffsetCount[_index] = mintCountLandMid;
            mintCountLandMid++;
        } else if (_type == 4) {
            highLandBalance[_to]++;
            highLandList.push(_index);
            noundleOffsetCount[_index] = mintCountLandHigh;
            mintCountLandHigh++;
        }

        // Set it's type in place.
        noundleType[_index] = _type;
    }

    // Reserves some of the supply of the noundles for giveaways & the community
    function reserveNoundles(uint256 _amount, uint8 _type) public onlyOwner {
        // enforce reserve limits based on type claimed
        if (_type == 0) {
            require(reservedComp + _amount <= MAX_RESERVED_COMP, "Cannot reserve more companions!");
        } else if (_type == 1) {
            require(reservedEvil + _amount <= MAX_RESERVED_EVIL, "Cannot reserve more evil noundles!");
        } else {
            require(reservedLand + _amount <= MAX_RESERVED_LAND, "Cannot reserve more land!");
        }

        uint256 _ts = localTotalSupply.current(); // totalSupply();

        // Mint the reserves.
        for (uint256 i; i < _amount; i++) {
            _handleMinting(msg.sender, _ts + i, _type, true);

            if (_type == 0) {
                reservedComp++;
            } else if (_type == 1) {
                reservedEvil++;
            } else {
                reservedLand++;
            }
        }
    }

    // Mint your evil noundle.
    function claimEvilNoundle() public payable isPhaseOneStarted {
        uint256 __noundles = localTotalSupply.current(); // totalSupply();

        // Verify request.
        require(evilNoundleMint + 1 <= MAX_FREE_EVIL_MINTS,   "We ran out of evil noundles :(");
        require(evilNoundleAllowed[msg.sender],               "You are not on whitelist");
        require(evilNoundleMinted[msg.sender] == false,       "You already minted your free noundle.");

        // Make sure that the wallet is holding at least 1 noundle.
        // require(Originals.getNoundlesFromWallet(msg.sender).length > 0, "You must hold at least one Noundle to mint");

        // Burn the rainbows.
        Rainbows.burn(msg.sender, evilMintPriceRainbow);

        // Mark it as they already got theirs.
        evilNoundleMinted[msg.sender] = true;

        // Add to our free mint count.
        evilNoundleMint += 1;

        // Mint it.
        _handleMinting(msg.sender, __noundles, 1, true);
    }

    // Mint your free companion.
    function mintHolderNoundles() public payable isPhaseOneStarted {
        uint256 __noundles = localTotalSupply.current(); // totalSupply();

        // Verify request.
        require(freeCompanionMint + 1 <= MAX_FREE_COMPANION_MINTS,   "We ran out of evil noundles :(");
        require(freeCompanionAllowed[msg.sender],                    "You are not on whitelist");
        require(freeCompanionMinted[msg.sender] == false,            "You already minted your free companion.");

        // Make sure that the wallet is holding at least 1 noundle.
        require(Originals.getNoundlesFromWallet(msg.sender).length > 0, "You must hold at least one Noundle to mint");

        // Mark it as they already got theirs.
        freeCompanionMinted[msg.sender] = true;

        // Add to our free mint count.
        freeCompanionMint += 1;

        // Mint it.
        _handleMinting(msg.sender, __noundles, 0, true);
    }

    /*
        Rainbow Minting.
    */
    function _handleRainbowMinting(address _to, uint256 index) private {

        // make a copy of who is getting it.
        address to = _to;

        // Determine what kind of mint it should be.
        uint8 _type = 0;

        // If we determine it's evil.
        // if(percentChance(index, 100, percentEvil)){
        //    _type = 1;
        // }

        uint256 evilTokenId = getRandomEvilNoundle(index, 0);
        uint256 stealChance = percentSteal;

        // && ownerOf(evilTokenId) != msg.sender
        if(weaponsEnabled && evilTokenId != 0 && MigrationMapToMap[evilTokenId] != 0 && BetaTheory.ownerOf(MigrationMapToMap[evilTokenId]) == ownerOf(evilTokenId)){
            stealChance += MigrationValue[MigrationMapToMap[evilTokenId]];
        }

        // Determine if it was stolen, give it to the evil noundle owner.
        if(percentChance(index, 100, stealChance)){

            // If it's 0 then we don't have a evil noundle to give it to.
            if(evilTokenId != 0){

                counterStolenAttempted += 1;

                // Check if it failed to steal and needs to go to jail.
                if(percentChance(index, 100, percentJail)){
                    jailHouse[evilTokenId] = block.timestamp;

                    counterJailed += 1;
                }else{
                    // The evil noundle stole the nft.
                    to = ownerOf(evilTokenId);
                    counterStolen += 1;

                    // Add to the most wanted.
                    if(mostWantedValues[to] == 0){
                        mostWantedMembers.push(to);
                    }

                    mostWantedValues[to] += 1;
                }
            }
        }

        // Burn the rainbows.
        Rainbows.burn(msg.sender, costToMintWithRainbows());

        // Block it from trading until the type gets set.
        callbackSaleBlock[index] = true;

        // Mint it.
        _handleMinting(to, index, _type, false);

        callbackOwner[index] = to;
        bytes32 requestId = bytes32(RandomNumber.getRandomNumberV2(index));
        callbackMap[requestId] = index;
    }

    function randomCallback(bytes32 requestId, uint256 randomness) external {
        require(address(RandomNumber) == msg.sender, "No access");

        // The index we are modiying.
        uint256 _index = callbackMap[requestId];

        if(_index == 0){
            _index = uint256(requestId);
        }

        // Determine the type.
        uint8 _type = 0;

        if((randomness % 100) < percentEvil){
            _type = 1;
        }

        address ownerVal = callbackOwner[_index];

        // Set it's type in place.
        noundleType[_index] = _type;

        if (_type == 0) {
            companionBalance[ownerVal]++; // companionBalance[msg.sender]++;
            companionList.push(_index);
            noundleOffsetCount[_index] = mintCountCompanions;
            mintCountCompanions++;
        } else {
            evilBalance[ownerVal]++; // evilBalance[msg.sender]++;
            evilList.push(_index);
            noundleOffsetCount[_index] = mintCountEvil;
            mintCountEvil++;
        }

        callbackSaleBlock[_index] = false;
    }

    // setCallbackSaleBlock + setOverrideCallbackSaleBlock + setWeaponsEnabled
    function setSaleBlockandCSBandWep(uint256 _arg, bool _bool, bool _OCSB, bool _wep) public onlyOwner {
        callbackSaleBlock[_arg]   = _bool;
        overrideCallbackSaleBlock = _OCSB;
        weaponsEnabled            = _wep;
    }

    // migrate the old contract over
    function migrateOldNoundles(uint256[] memory tokens) public payable {

        require(migrationEnabled, "Migration is not enabled");

        uint256 __noundles = localTotalSupply.current(); // totalSupply();

        // Look up the types for each.
        uint8[] memory foundTypes = BetaTheory.getTypeByTokenIds(tokens);

        uint256 offset = 0;

        // Claim each token they ask to migrate.
        for(uint256 i = 0; i < tokens.length; i += 1){

            // Verify it has not already been migrated.
            if(alreadyClaimedMigration[tokens[i]]){
                continue;
            }

            // Verify the owner if the sender.
            if(BetaTheory.ownerOf(tokens[i]) != msg.sender){
                continue;
            }

            // Mark it as already migrated.
            alreadyClaimedMigration[tokens[i]] = true;

            // Mint it.
            _handleMinting(msg.sender, __noundles + offset, foundTypes[i], true);

            if(foundTypes[i] == 1){
                MigrationMapToMap[__noundles + offset] = tokens[i];

                if(percentChance(__noundles + offset, 100, 15)){
                    MigrationValue[tokens[i]] = 6;
                }else {
                    MigrationValue[tokens[i]] = 3;
                }
            }

            offset++;
        }
    }

    // Handle consuming rainbow to mint a new NFT with random chance.
    function mintWithRainbows(uint256 _noundles) public payable isRainbowMintingEnabled {

        if (overrideContractMintBlock == false) {
            require(msg.sender == tx.origin, "No contract minting allowed!");
        }

        uint256 __noundles = localTotalSupply.current(); // totalSupply();

        require(_noundles > 0 && _noundles <= 10,              "Your amount needs to be greater then 0 and can't exceed 10");
        require(_noundles + (mintCountCompanions + mintCountEvil + OG_TOTAL_SUPPLY) <= MAX_EVIL_NOUNDLES, "We ran out of noundles! Try minting with less!");

        for (uint256 ___noundles; ___noundles < _noundles; ___noundles++) {
            _handleRainbowMinting(msg.sender,  __noundles + ___noundles);
        }
    }

    // Mint your free lkand.
    function mintHolderLandNoundles(uint256 _noundles) public payable isPhaseTwoStarted {
        uint256 __noundles = localTotalSupply.current(); // totalSupply();

        require(_noundles > 0 && _noundles <= 10, "Your amount needs to be greater then 0 and can't exceed 10");
        require((mintCountLandLow + mintCountLandMid + mintCountLandHigh) + __noundles <= MAX_FREE_LAND_MINTS, "We ran out of land! Try minting with less!");

        // The noundles that the sender is holding.
        uint256[] memory holdingNoundles = Originals.getNoundlesFromWallet(msg.sender);

        uint256 offset = 0;

        // Mint as many as they are holding.
        for (uint256 index; (index < holdingNoundles.length) && offset < _noundles; index += 1){

            // Check if it has been minted before.
            if(alreadyMintedLandNoundles[holdingNoundles[index]]){
                continue;
            }

            uint8 _type = 2;

            // Pick a random type of land.
            if(percentChance(__noundles + offset, (percentLowLand + percentMidLand + percentHighLand), percentHighLand)){
                _type = 4;
            }else if(percentChance(__noundles + offset, (percentLowLand + percentMidLand + percentHighLand), percentMidLand)){
                _type = 3;
            }

            // Burn the rainbows.
            Rainbows.burn(msg.sender, landMintPriceRainbow);

            // Mark it as minted.
            alreadyMintedLandNoundles[holdingNoundles[index]] = true;

            // Mint it.
            _handleMinting(msg.sender,  __noundles + offset, _type, true);

            // Go to the next offset.
            offset += 1;
        }
    }


    /*
        Jail Related
    */
    // Get a evil out of jail.
    function getOutOfJailByTokenId(uint256 _tokenId) public payable isRainbowMintingEnabled {

        // Check that it is a evil noundle.
        require(noundleType[_tokenId] == 1, "Only evil noundles can go to jail.");

        // Burn the rainbows to get out of jail.
        Rainbows.burn(msg.sender, getOutOfJail);

        // Reset the jail time.
        jailHouse[_tokenId] = 1;

        // Stat track.
        counterBail += 1;
    }


    /*
        Helpers
    */
    function setPayoutAddresses(address[] memory _noundles) public onlyOwner {
        founder1 = _noundles[0];
        founder2 = _noundles[1];
    }

    function withdrawFunds(uint256 _noundles) public payable onlyOwner {
        uint256 percentle = _noundles / 100;

        require(payable(founder1).send(percentle * 50));
        require(payable(founder2).send(percentle * 50));
    }

    // Pick a evil noundle randomly from our list.
    function getRandomEvilNoundle(uint256 index, uint256 depth) public returns(uint256) {

        // If we have no evil noundles, return.
        if(evilList.length == 0){
            return 0;
        }

        uint256 selectedIndex = RandomNumber.getRandomNumber(index) % evilList.length;

        // If it's not in jail.
        if(jailHouse[evilList[selectedIndex]] + jailLength < block.timestamp){
            return evilList[selectedIndex];
        }

        // If we can't find one in 100 attempts, select none.
        if(depth > 99){
            return 0;
        }

        // If it's in jail, it can't steal so try again.
        return getRandomEvilNoundle(index, depth + 1);
    }

    function getRandomEvilNoundleExternal(uint256 index) external returns(address) {
        return ownerOf(getRandomEvilNoundle(index, 0));
    }

    // Pick a evil noundle randomly from our list.
    function percentChance(uint256 index, uint256 total, uint256 chance) internal returns(bool) {
        if((RandomNumber.getRandomNumber(index) % total) < chance){
            return true;
        }else{
            return false;
        }
    }

    // Determine how much to mint a one with rainbows.
    function costToMintWithRainbows() public view returns(uint256) {

        uint256 total = mintCountCompanions + mintCountEvil + OG_TOTAL_SUPPLY;

        if(total >= tier2Start){
            return rBaseMintPriceTier2;
        }
        if(total >= tier3Start){
            return rBaseMintPriceTier3;
        }

        return rBaseMintPriceTier1;
    }

    // Gets the noundle theory tokens and returns a array with all the tokens owned
    function getNoundlesFromWallet(address _noundles) external view returns (uint256[] memory) {
        uint256 __noundles = balanceOf(_noundles);

        uint256[] memory ___noundles = new uint256[](__noundles);

        uint256 offset = 0;

        for (uint256 i; (offset < __noundles) && i < localTotalSupply.current(); i++) {
            if(ownerOf(i) == _noundles){
                // ___noundles[i] = tokenOfOwnerByIndex(_noundles, i);
                ___noundles[offset] = i;
                offset += 1;
            }
        }

        return ___noundles;
    }

    // Returns the addresses that own any evil noundle - seems rare :eyes:
    function getEvilNoundleOwners() external view returns (address[] memory) {
        address[] memory result = new address[](evilList.length);

        for(uint256 index; index < evilList.length; index += 1){
            if(jailHouse[evilList[index]] + jailLength <= block.timestamp){
                result[index] = ownerOf(evilList[index]);
            }
        }

        return result;
    }

    // Helper to convert int to string (thanks stack overflow).
    function uint2str(uint _i) internal pure returns (string memory _uintAsString) {
        if (_i == 0) {
            return "0";
        }
        uint j = _i;
        uint len;
        while (j != 0) {
            len++;
            j /= 10;
        }
        bytes memory bstr = new bytes(len);
        uint k = len;
        while (_i != 0) {
            k = k-1;
            uint8 temp = (48 + uint8(_i - _i / 10 * 10));
            bytes1 b1 = bytes1(temp);
            bstr[k] = b1;
            _i /= 10;
        }
        return string(bstr);
    }

    // Most wanted.
    function getMostWanted() external view returns(address[] memory) {return mostWantedMembers;}
    function getMostWantedValue(address _arg) external view returns(uint256) {return mostWantedValues[_arg];}
    function resetMostWanted() public onlyOwner {

        // Reset the value for each.
        for(uint256 i = 0; i < mostWantedMembers.length; i += 1){
            mostWantedValues[mostWantedMembers[i]] = 0;
        }

        // Clear most wanted.
        delete mostWantedMembers;
    }

    // Contract Getters
    function _baseURI() internal view override returns (string memory) { return baseURI; }
    function getTypeByTokenIds(uint256[] memory _tokenId) external view returns(uint8[] memory) {
        uint8[] memory result = new uint8[](_tokenId.length);

        for (uint256 index; index < _tokenId.length; index += 1) {
            result[index] = noundleType[_tokenId[index]];
        }

        return result;
    }
    function totalSupply() public view returns (uint) {
        return localTotalSupply.current();
    }
    function getFreeMintUsedByTokenId(uint256 _tokenId) external view returns (bool){ return alreadyMintedNoundles[_tokenId]; }
    function getFreeLandMintUsedByTokenId(uint256 _tokenId) external view returns (bool){ return alreadyMintedLandNoundles[_tokenId]; }
    function getJailStatus(uint256 _tokenId) external view returns (uint256){ return jailHouse[_tokenId]; }
    function getJailStatusBool(uint256 _tokenId) public view returns (bool){ return (jailHouse[_tokenId] + jailLength > block.timestamp); }

    // Contract Setters (pretty standard :))
    function setBaseURI(string memory arg) public onlyOwner { baseURI = arg; }


    function setPhaseTime(uint256 _s1, uint256 _s2) public onlyOwner {
        saleOneTime = _s1;
        saleTwoTime = _s2;
    }

    function setMintCost(uint256 _evilPrice, uint256 _landPrice) external onlyOwner {
        evilMintPriceRainbow = _evilPrice;
        landMintPriceRainbow = _landPrice;
    }

    // setMigrationEnabled + setRainbowMintStatus
    function setMandRStatus(bool _m, bool _rain) external onlyOwner {
        migrationEnabled = _m;
        rainbowMintingEnabled = _rain;
    }

    // Noundle Theory Setters (incase we need to balance some things out)
    function setLandPercent(uint256 _low, uint256 _mid, uint256 _high) public onlyOwner {
       percentLowLand  = _low;
       percentMidLand  = _mid;
       percentHighLand = _high;
    }

    function setEvilPercentages(uint256 _evilPercent, uint256 _jailPercent, uint256 _stealPercent) public onlyOwner {
        percentEvil  = _evilPercent;
        percentJail  = _jailPercent;
        percentSteal = _stealPercent;
    }

    function setJailTime(uint256 _amount) external onlyOwner { jailLength = _amount; }
    function setGetOutOfJailCost(uint256 _amount) external onlyOwner { getOutOfJail = _amount; }
    function setJailTimeForEvil(uint256 _tokenId, uint256 _amount) external onlyOwner { jailHouse[_tokenId] = _amount; }

    // Contract Setters for the Genesis Contract
    function setAddresses(address _genesis, address _oldTheory, address _randomNum, address _rainbow) external onlyOwner {
        Originals    = InterfaceOriginals(_genesis);
        BetaTheory   = InterfacePatched(_oldTheory);
        RandomNumber = InterfaceRandomNumber(_randomNum);
        Rainbows     = InterfaceRainbows(_rainbow);
    }

    // Contract Setters for the Rainbows Contract
    //function setRainbowMintStatus(bool _arg) public onlyOwner { rainbowMintingEnabled = _arg; }
    function setBaseMintPriceTiers(uint256 tier1, uint256 tier2, uint256 tier3) public onlyOwner {
        rBaseMintPriceTier1 = tier1;
        rBaseMintPriceTier2 = tier2;
        rBaseMintPriceTier3 = tier3;
    }

    function setTierStart(uint256 _arg2, uint256 _arg3) public onlyOwner {
        tier2Start = _arg2;
        tier3Start = _arg3;
    }

    function setContractMintBlock(bool _arg) public onlyOwner { overrideContractMintBlock = _arg; }

    // opensea / ERC721 functions
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory base = _baseURI();

        return string(abi.encodePacked(base, uint2str(noundleType[tokenId]), "/", uint2str(noundleOffsetCount[tokenId])));
    }

    function transferFrom(address from, address to, uint256 tokenId) public override {

        // Prevent it from being sold while it's being generated.
        require(overrideCallbackSaleBlock || callbackSaleBlock[tokenId] == false, "Token is still processing");

        Rainbows.transferTokens(from, to);

        if (noundleType[tokenId] == 0) {
            companionBalance[from]--;
            companionBalance[to]++;
        } else if (noundleType[tokenId] == 1) {
            evilBalance[from]--;
            evilBalance[to]++;
        } else if (noundleType[tokenId] == 2) {
            lowLandBalance[from]--;
            lowLandBalance[to]++;
        } else if (noundleType[tokenId] == 3) {
            midLandBalance[from]--;
            midLandBalance[to]++;
        } else if (noundleType[tokenId] == 4) {
            highLandBalance[from]--;
            highLandBalance[to]++;
        }

        ERC721.transferFrom(from, to, tokenId);
    }

    function safeTransferFrom(address from, address to, uint256 tokenId) public override {

        /*
        // Prevent it from being sold while it's being generated.
        require(overrideCallbackSaleBlock || callbackSaleBlock[tokenId] == false, "Token is still processing");

        Rainbows.transferTokens(from, to);

        if (noundleType[tokenId] == 0) {
            companionBalance[from]--;
            companionBalance[to]++;
        } else if (noundleType[tokenId] == 1) {
            evilBalance[from]--;
            evilBalance[to]++;
        } else if (noundleType[tokenId] == 2) {
            lowLandBalance[from]--;
            lowLandBalance[to]++;
        } else if (noundleType[tokenId] == 3) {
            midLandBalance[from]--;
            midLandBalance[to]++;
        } else if (noundleType[tokenId] == 4) {
            highLandBalance[from]--;
            highLandBalance[to]++;
        }

        ERC721.safeTransferFrom(from, to, tokenId);
        */

        safeTransferFrom(from, to, tokenId, "");
    }

    function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override {

        // Prevent it from being sold while it's being generated.
        require(overrideCallbackSaleBlock || callbackSaleBlock[tokenId] == false, "Token is still processing");

        Rainbows.transferTokens(from, to);

        if (noundleType[tokenId] == 0) {
            companionBalance[from]--;
            companionBalance[to]++;
        } else if (noundleType[tokenId] == 1) {
            evilBalance[from]--;
            evilBalance[to]++;
        } else if (noundleType[tokenId] == 2) {
            lowLandBalance[from]--;
            lowLandBalance[to]++;
        } else if (noundleType[tokenId] == 3) {
            midLandBalance[from]--;
            midLandBalance[to]++;
        } else if (noundleType[tokenId] == 4) {
            highLandBalance[from]--;
            highLandBalance[to]++;
        }

        ERC721.safeTransferFrom(from, to, tokenId, data);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BetaTheory","outputs":[{"internalType":"contract InterfacePatched","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_COMPANION_NOUNDLES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_EVIL_NOUNDLES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_COMPANION_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_EVIL_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_LAND_MINTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVED_COMP","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVED_EVIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_RESERVED_LAND","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MigrationMapToMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"MigrationValue","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OG_TOTAL_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Originals","outputs":[{"internalType":"contract InterfaceOriginals","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Rainbows","outputs":[{"internalType":"contract InterfaceRainbows","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RandomNumber","outputs":[{"internalType":"contract InterfaceRandomNumber","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_noundles","type":"address[]"}],"name":"addEvilNoundlers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_noundles","type":"address[]"}],"name":"addFreeNoundlers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"alreadyClaimedMigration","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"callbackMap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"callbackOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"callbackSaleBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"}],"name":"checkEvilNoundlers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"}],"name":"checkFreeNoundlers","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimEvilNoundle","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"companionBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"companionList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"costToMintWithRainbows","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counterBail","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counterJailed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counterStolen","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"counterStolenAttempted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"evilBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"evilList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evilMintPriceRainbow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"evilNoundleMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founder1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"founder2","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeCompanionMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getEvilNoundleOwners","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFreeLandMintUsedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getFreeMintUsedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getJailStatus","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getJailStatusBool","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMostWanted","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_arg","type":"address"}],"name":"getMostWantedValue","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_noundles","type":"address"}],"name":"getNoundlesFromWallet","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getOutOfJail","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getOutOfJailByTokenId","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"},{"internalType":"uint256","name":"depth","type":"uint256"}],"name":"getRandomEvilNoundle","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRandomEvilNoundleExternal","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_tokenId","type":"uint256[]"}],"name":"getTypeByTokenIds","outputs":[{"internalType":"uint8[]","name":"","type":"uint8[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"highLandBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"highLandList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"jailHouse","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"jailLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"landMintPriceRainbow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"lowLandBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"lowLandList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"midLandBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"midLandList","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"migrateOldNoundles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"migrationEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountCompanions","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountEvil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountLandHigh","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountLandLow","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCountLandMid","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_noundles","type":"uint256"}],"name":"mintHolderLandNoundles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintHolderNoundles","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_noundles","type":"uint256"}],"name":"mintWithRainbows","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mostWantedMembers","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mostWantedValues","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noundleOffsetCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"noundleType","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overrideCallbackSaleBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"overrideContractMintBlock","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"percentEvil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentHighLand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentJail","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentLowLand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentMidLand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"percentSteal","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rBaseMintPriceTier1","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rBaseMintPriceTier2","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rBaseMintPriceTier3","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rainbowMintingEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"randomCallback","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"uint8","name":"_type","type":"uint8"}],"name":"reserveNoundles","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reservedComp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedEvil","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"reservedLand","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"resetMostWanted","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOneTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleTwoTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_genesis","type":"address"},{"internalType":"address","name":"_oldTheory","type":"address"},{"internalType":"address","name":"_randomNum","type":"address"},{"internalType":"address","name":"_rainbow","type":"address"}],"name":"setAddresses","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":"uint256","name":"tier1","type":"uint256"},{"internalType":"uint256","name":"tier2","type":"uint256"},{"internalType":"uint256","name":"tier3","type":"uint256"}],"name":"setBaseMintPriceTiers","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"arg","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_arg","type":"bool"}],"name":"setContractMintBlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_evilPercent","type":"uint256"},{"internalType":"uint256","name":"_jailPercent","type":"uint256"},{"internalType":"uint256","name":"_stealPercent","type":"uint256"}],"name":"setEvilPercentages","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setGetOutOfJailCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setJailTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setJailTimeForEvil","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_low","type":"uint256"},{"internalType":"uint256","name":"_mid","type":"uint256"},{"internalType":"uint256","name":"_high","type":"uint256"}],"name":"setLandPercent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_m","type":"bool"},{"internalType":"bool","name":"_rain","type":"bool"}],"name":"setMandRStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_evilPrice","type":"uint256"},{"internalType":"uint256","name":"_landPrice","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_noundles","type":"address[]"}],"name":"setPayoutAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_s1","type":"uint256"},{"internalType":"uint256","name":"_s2","type":"uint256"}],"name":"setPhaseTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arg","type":"uint256"},{"internalType":"bool","name":"_bool","type":"bool"},{"internalType":"bool","name":"_OCSB","type":"bool"},{"internalType":"bool","name":"_wep","type":"bool"}],"name":"setSaleBlockandCSBandWep","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_arg2","type":"uint256"},{"internalType":"uint256","name":"_arg3","type":"uint256"}],"name":"setTierStart","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":[],"name":"tier2Start","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tier3Start","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":"weaponsEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_noundles","type":"uint256"}],"name":"withdrawFunds","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052600a60118190556012819055601355604b601481815560155560056016556000601781905560188190556019819055601a819055601b8190556801158e460913d00000601c556802b5e3af16b1880000601d55601e819055601f8190556020819055602181905560228190556027805460ff19908116909155602c829055602d829055602e80548216905568022b1c8c1227a00000602f556804563918244f40000060305568068155a43676e0000060315561271060325561445c603355612a30603455671bc16d674ec80000603555603782905560388290556039829055603a919091556045805461ffff191661010017905581541690553480156200010a57600080fd5b50604051620060f5380380620060f58339810160408190526200012d91620002c2565b604080518082018252600e8082526d4e4f554e444c45535448454f525960901b60208084018281528551808701909652928552840152815191929162000176916000916200021c565b5080516200018c9060019060208401906200021c565b505050620001a9620001a3620001c660201b60201c565b620001ca565b8051620001be90604c9060208401906200021c565b5050620003f1565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200022a906200039e565b90600052602060002090601f0160209004810192826200024e576000855562000299565b82601f106200026957805160ff191683800117855562000299565b8280016001018555821562000299579182015b82811115620002995782518255916020019190600101906200027c565b50620002a7929150620002ab565b5090565b5b80821115620002a75760008155600101620002ac565b60006020808385031215620002d657600080fd5b82516001600160401b0380821115620002ee57600080fd5b818501915085601f8301126200030357600080fd5b815181811115620003185762000318620003db565b604051601f8201601f19908116603f01168101908382118183101715620003435762000343620003db565b8160405282815288868487010111156200035c57600080fd5b600093505b8284101562000380578484018601518185018701529285019262000361565b82841115620003925760008684830101525b98975050505050505050565b600181811c90821680620003b357607f821691505b60208210811415620003d557634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b615cf480620004016000396000f3fe6080604052600436106107995760003560e01c80638e3957d9116103dd578063cac05ca911610208578063e985e9c511610123578063f1f01b28116100b6578063f6697c8b11610085578063f6697c8b14611650578063f8dc972a1461167d578063fa429ae11461169d578063fbde6292146116bd578063fd1cb0f7146116ea57600080fd5b8063f1f01b2814611246578063f243f31a14611604578063f2fde38b1461161a578063f4b91f991461163a57600080fd5b8063ed84cd3c116100f2578063ed84cd3c1461158b578063eddce3ae146115ab578063eed0eb4b146115c1578063f1d770c5146115d757600080fd5b8063e985e9c5146114f6578063ead24c891461153f578063eb1b45dd14611555578063ec57bd371461157557600080fd5b8063d0ae0b471161019b578063de0c5e8c1161016a578063de0c5e8c1461146e578063df822b251461148e578063e13222f4146114be578063e711eba4146114c657600080fd5b8063d0ae0b47146113ff578063d26b2e5f14611415578063d43a96481461142b578063d92a16a31461145857600080fd5b8063cafa8988116101d7578063cafa8988146113a1578063cb1f08e6146113b4578063ce673d98146113ca578063cf38f85e146113df57600080fd5b8063cac05ca914611322578063cac1ad0d14611337578063cac3932914611357578063cae4b8f61461137157600080fd5b8063b88d4fde116102f8578063c1594ffc1161028b578063c761ee141161025a578063c761ee141461127c578063c7c33ccb146112b5578063c87b56dd146112d5578063c8f4b0d0146112f557600080fd5b8063c1594ffc14611230578063c26dc08414611246578063c69f16d51461125c578063c6faea401461124657600080fd5b8063bdf58fc9116102c7578063bdf58fc914610bac578063be6522f6146111cb578063c091bd03146111ed578063c0d63a991461121a57600080fd5b8063b88d4fde14611148578063b8f7443814611168578063bba55e4714611195578063bbeb2952146111b557600080fd5b8063a22cb46511610370578063af9a8df61161033f578063af9a8df6146110c2578063b3bfe6b6146110d8578063b496a6b814611105578063b6c37c1b1461111b57600080fd5b8063a22cb46514611038578063a676d15114611058578063aa35d67f14611088578063aca19e68146110a257600080fd5b806398ac19d5116103ac57806398ac19d514610fcb5780639b97eed314610fde5780639dbb2bfe14610ff8578063a12ea7871461100b57600080fd5b80638e3957d914610f605780638e3acac514610f8057806395d89b4114610f96578063981fc62714610fab57600080fd5b80634a945f8d116105c857806370a08231116104e35780637c877b4811610476578063831ee80211610445578063831ee80214610f0057806384c518d714610bac578063890e858414610f165780638d04cf3414610f2c5780638da5cb5b14610f4257600080fd5b80637c877b4814610e77578063806ba6d614610e975780638149608814610eb75780638230d1da14610eca57600080fd5b8063749e9be9116104b2578063749e9be914610df857806375fd0bb114610e1857806379d25f3814610e385780637a19dfc914610e5757600080fd5b806370a0823114610d80578063714e89ec14610da0578063715018a614610dcd578063721bdbcc14610de257600080fd5b80635e8ea4251161055b578063668035e31161052a578063668035e314610d0a5780636b477d2014610d205780636d252c8514610d405780636f0b398714610d6057600080fd5b80635e8ea42514610ca9578063600068c114610cbe5780636352211e14610cd457806365baf5db14610cf457600080fd5b806358de458e1161059757806358de458e14610c2d5780635a32d02614610c435780635b701c9714610c735780635beb0f9b14610c9357600080fd5b80634a945f8d14610bc15780634e976bf814610be157806353dd51ef14610bf757806355f804b314610c0d57600080fd5b806323b872dd116106b85780633702ff081161064b57806341f2bd771161061a57806341f2bd7714610b5657806342842e0e14610b7657806344a68d2314610b9657806345d9806b14610bac57600080fd5b80633702ff0814610ae0578063389bf05014610af6578063389c715c14610b165780633f59be1d14610b3657600080fd5b80632ffa6582116106875780632ffa658214610a63578063316d6bba14610a79578063322c012414610aa657806335b944bf14610ac657600080fd5b806323b872dd146109d7578063290d2126146109f75780632acc062b14610a2d5780632e35d97c14610a4357600080fd5b806310b34c6711610730578063166098b9116106ff578063166098b91461095357806318160ddd1461098c57806320bc87d2146109a157806321c24409146109b757600080fd5b806310b34c67146108d357806310fab524146108f3578063116b556b14610920578063155dd5ee1461094057600080fd5b8063081812fc1161076c578063081812fc1461085b578063095ea7b3146108935780630cc1f5b6146108b5578063105f9174146108cb57600080fd5b806301f9e3111461079e57806301ffc9a7146107e557806304ac9f111461081557806306fdde0314610839575b600080fd5b3480156107aa57600080fd5b506107ce6107b9366004615676565b60446020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b3480156107f157600080fd5b506108056108003660046156b1565b61170a565b60405190151581526020016107dc565b34801561082157600080fd5b5061082b601c5481565b6040519081526020016107dc565b34801561084557600080fd5b5061084e61175c565b6040516107dc9190615963565b34801561086757600080fd5b5061087b610876366004615676565b6117ee565b6040516001600160a01b0390911681526020016107dc565b34801561089f57600080fd5b506108b36108ae3660046153c4565b611888565b005b3480156108c157600080fd5b5061082b601a5481565b6108b361199e565b3480156108df57600080fd5b506108b36108ee36600461563f565b611bdb565b3480156108ff57600080fd5b5061082b61090e366004615676565b60009081526036602052604090205490565b34801561092c57600080fd5b50604d5461087b906001600160a01b031681565b6108b361094e366004615676565b611c18565b34801561095f57600080fd5b5061080561096e366004615200565b6001600160a01b031660009081526023602052604090205460ff1690565b34801561099857600080fd5b5061082b611cca565b3480156109ad57600080fd5b5061082b60115481565b3480156109c357600080fd5b5061087b6109d2366004615676565b611cda565b3480156109e357600080fd5b506108b36109f23660046152cf565b611d04565b348015610a0357600080fd5b5061087b610a12366004615676565b604a602052600090815260409020546001600160a01b031681565b348015610a3957600080fd5b5061082b602f5481565b348015610a4f57600080fd5b5061082b610a5e36600461568f565b611ff0565b348015610a6f57600080fd5b5061082b60155481565b348015610a8557600080fd5b5061082b610a94366004615676565b60476020526000908152604090205481565b348015610ab257600080fd5b50610805610ac1366004615676565b612126565b348015610ad257600080fd5b506045546108059060ff1681565b348015610aec57600080fd5b5061082b60375481565b348015610b0257600080fd5b506108b3610b11366004615676565b61214d565b348015610b2257600080fd5b5060095461087b906001600160a01b031681565b348015610b4257600080fd5b5061082b610b51366004615676565b61217c565b348015610b6257600080fd5b5061082b610b71366004615676565b61219d565b348015610b8257600080fd5b506108b3610b913660046152cf565b6121ad565b348015610ba257600080fd5b5061082b611b5881565b348015610bb857600080fd5b5061082b60fa81565b348015610bcd57600080fd5b506108b3610bdc366004615273565b6121c8565b348015610bed57600080fd5b5061082b601b5481565b348015610c0357600080fd5b5061082b60135481565b348015610c1957600080fd5b506108b3610c283660046156eb565b612242565b348015610c3957600080fd5b5061082b60335481565b348015610c4f57600080fd5b506107ce610c5e366004615676565b60466020526000908152604090205460ff1681565b348015610c7f57600080fd5b506108b3610c8e36600461568f565b61227f565b348015610c9f57600080fd5b5061082b60225481565b348015610cb557600080fd5b5061082b6122b4565b348015610cca57600080fd5b5061082b601f5481565b348015610ce057600080fd5b5061087b610cef366004615676565b612300565b348015610d0057600080fd5b5061082b60325481565b348015610d1657600080fd5b5061082b60355481565b348015610d2c57600080fd5b506108b3610d3b36600461568f565b612377565b348015610d4c57600080fd5b5061082b610d5b366004615676565b6123b3565b348015610d6c57600080fd5b506108b3610d7b366004615799565b6123c3565b348015610d8c57600080fd5b5061082b610d9b366004615200565b6123fb565b348015610dac57600080fd5b5061082b610dbb366004615200565b603f6020526000908152604090205481565b348015610dd957600080fd5b506108b3612482565b348015610dee57600080fd5b5061082b60395481565b348015610e0457600080fd5b50600b5461087b906001600160a01b031681565b348015610e2457600080fd5b506108b3610e333660046153f0565b6124b8565b348015610e4457600080fd5b5060455461080590610100900460ff1681565b348015610e6357600080fd5b506108b3610e7236600461565a565b612567565b348015610e8357600080fd5b506108b3610e923660046153f0565b6125b1565b348015610ea357600080fd5b50604e5461087b906001600160a01b031681565b6108b3610ec5366004615495565b612643565b348015610ed657600080fd5b5061082b610ee5366004615200565b6001600160a01b03166000908152603b602052604090205490565b348015610f0c57600080fd5b5061082b602d5481565b348015610f2257600080fd5b5061082b60215481565b348015610f3857600080fd5b5061082b60175481565b348015610f4e57600080fd5b506006546001600160a01b031661087b565b348015610f6c57600080fd5b50600a5461087b906001600160a01b031681565b348015610f8c57600080fd5b5061082b601e5481565b348015610fa257600080fd5b5061084e6129d3565b348015610fb757600080fd5b5061087b610fc6366004615676565b6129e2565b6108b3610fd9366004615676565b6129f2565b348015610fea57600080fd5b506027546108059060ff1681565b6108b3611006366004615676565b612d52565b34801561101757600080fd5b5061102b611026366004615495565b612ea7565b6040516107dc9190615928565b34801561104457600080fd5b506108b361105336600461538f565b612f73565b34801561106457600080fd5b50610805611073366004615676565b60426020526000908152604090205460ff1681565b34801561109457600080fd5b50602e546108059060ff1681565b3480156110ae57600080fd5b506108b36110bd366004615799565b613038565b3480156110ce57600080fd5b5061082b60345481565b3480156110e457600080fd5b5061082b6110f3366004615200565b603e6020526000908152604090205481565b34801561111157600080fd5b5061082b619c4081565b34801561112757600080fd5b5061082b611136366004615676565b60436020526000908152604090205481565b34801561115457600080fd5b506108b3611163366004615310565b613070565b34801561117457600080fd5b50611188611183366004615200565b613363565b6040516107dc91906158f0565b3480156111a157600080fd5b506108b36111b036600461568f565b61343b565b3480156111c157600080fd5b5061082b60195481565b3480156111d757600080fd5b506111e0613470565b6040516107dc91906158a3565b3480156111f957600080fd5b5061082b611208366004615676565b60486020526000908152604090205481565b34801561122657600080fd5b5061082b60205481565b34801561123c57600080fd5b5061082b60145481565b34801561125257600080fd5b5061082b6122b881565b34801561126857600080fd5b506108b361127736600461574c565b6134d1565b34801561128857600080fd5b50610805611297366004615200565b6001600160a01b031660009081526025602052604090205460ff1690565b3480156112c157600080fd5b506108b36112d03660046157c5565b613540565b3480156112e157600080fd5b5061084e6112f0366004615676565b61373c565b34801561130157600080fd5b5061082b611310366004615200565b60406020819052600091825290205481565b34801561132e57600080fd5b506111e0613826565b34801561134357600080fd5b506108b3611352366004615799565b613934565b34801561136357600080fd5b50604b546108059060ff1681565b34801561137d57600080fd5b5061080561138c366004615676565b60496020526000908152604090205460ff1681565b6108b36113af366004615676565b61396c565b3480156113c057600080fd5b5061082b60315481565b3480156113d657600080fd5b506108b3613b10565b3480156113eb57600080fd5b5061082b6113fa366004615676565b613ba4565b34801561140b57600080fd5b5061082b60125481565b34801561142157600080fd5b5061082b60305481565b34801561143757600080fd5b5061082b611446366004615676565b60366020526000908152604090205481565b34801561146457600080fd5b5061082b611d2981565b34801561147a57600080fd5b506108b3611489366004615676565b613bb4565b34801561149a57600080fd5b506108056114a9366004615676565b6000908152602b602052604090205460ff1690565b6108b3613be3565b3480156114d257600080fd5b506108056114e1366004615676565b6000908152602a602052604090205460ff1690565b34801561150257600080fd5b5061080561151136600461523a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561154b57600080fd5b5061082b60165481565b34801561156157600080fd5b506108b361157036600461568f565b613e9a565b34801561158157600080fd5b5061082b60385481565b34801561159757600080fd5b5061082b6115a6366004615676565b613ecf565b3480156115b757600080fd5b5061082b601d5481565b3480156115cd57600080fd5b5061082b60185481565b3480156115e357600080fd5b5061082b6115f2366004615200565b603d6020526000908152604090205481565b34801561161057600080fd5b5061082b602c5481565b34801561162657600080fd5b506108b3611635366004615200565b613edf565b34801561164657600080fd5b5061082b603a5481565b34801561165c57600080fd5b5061082b61166b366004615200565b60416020526000908152604090205481565b34801561168957600080fd5b506108b361169836600461568f565b613f77565b3480156116a957600080fd5b5060085461087b906001600160a01b031681565b3480156116c957600080fd5b5061082b6116d8366004615200565b603b6020526000908152604090205481565b3480156116f657600080fd5b506108b36117053660046153f0565b614149565b60006001600160e01b031982166380ac58cd60e01b148061173b57506001600160e01b03198216635b5e139f60e01b145b8061175657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461176b90615bc8565b80601f016020809104026020016040519081016040528092919081815260200182805461179790615bc8565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661186c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061189382612300565b9050806001600160a01b0316836001600160a01b031614156119015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401611863565b336001600160a01b038216148061191d575061191d8133611511565b61198f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401611863565b61199983836141db565b505050565b602c5442101580156119b257506000602c54115b6119f95760405162461bcd60e51b8152602060048201526018602482015277141a185cd94813db99481a185cdb89dd081cdd185c9d195960421b6044820152606401611863565b6000611a0460075490565b90506122b8601f546001611a189190615afe565b1115611a665760405162461bcd60e51b815260206004820152601e60248201527f57652072616e206f7574206f66206576696c206e6f756e646c6573203a2800006044820152606401611863565b3360009081526023602052604090205460ff16611ac05760405162461bcd60e51b8152602060048201526018602482015277165bdd48185c99481b9bdd081bdb881dda1a5d195b1a5cdd60421b6044820152606401611863565b3360009081526024602052604090205460ff1615611b2e5760405162461bcd60e51b815260206004820152602560248201527f596f7520616c7265616479206d696e74656420796f75722066726565206e6f75604482015264373236329760d91b6064820152608401611863565b600854601c54604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611b7e57600080fd5b505af1158015611b92573d6000803e3d6000fd5b5050336000908152602460205260408120805460ff19166001908117909155601f80549194509250611bc5908490615afe565b90915550611bd890503382600180614249565b50565b6006546001600160a01b03163314611c055760405162461bcd60e51b815260040161186390615a25565b6027805460ff1916911515919091179055565b6006546001600160a01b03163314611c425760405162461bcd60e51b815260040161186390615a25565b6000611c4f606483615b3b565b604d549091506001600160a01b03166108fc611c6c836032615b4f565b6040518115909202916000818181858888f19350505050611c8c57600080fd5b604e546001600160a01b03166108fc611ca6836032615b4f565b6040518115909202916000818181858888f19350505050611cc657600080fd5b5050565b6000611cd560075490565b905090565b603c8181548110611cea57600080fd5b6000918252602090912001546001600160a01b0316905081565b604b5460ff1680611d24575060008181526049602052604090205460ff16155b611d6c5760405162461bcd60e51b8152602060048201526019602482015278546f6b656e206973207374696c6c2070726f63657373696e6760381b6044820152606401611863565b600854604051636a092e7960e01b81526001600160a01b038581166004830152848116602483015290911690636a092e7990604401600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b50505060008281526046602052604090205460ff1615159050611e43576001600160a01b0383166000908152603d60205260408120805491611e1083615bb1565b90915550506001600160a01b0382166000908152603d60205260408120805491611e3983615bfd565b9190505550611fe5565b60008181526046602052604090205460ff1660011415611eaa576001600160a01b0383166000908152603e60205260408120805491611e8183615bb1565b90915550506001600160a01b0382166000908152603e60205260408120805491611e3983615bfd565b60008181526046602052604090205460ff1660021415611f11576001600160a01b0383166000908152603f60205260408120805491611ee883615bb1565b90915550506001600160a01b0382166000908152603f60205260408120805491611e3983615bfd565b60008181526046602052604090205460ff1660031415611f78576001600160a01b0383166000908152604060208190528120805491611f4f83615bb1565b90915550506001600160a01b0382166000908152604060208190528120805491611e3983615bfd565b60008181526046602052604090205460ff1660041415611fe5576001600160a01b0383166000908152604160205260408120805491611fb683615bb1565b90915550506001600160a01b0382166000908152604160205260408120805491611fdf83615bfd565b91905055505b611999838383614543565b600d5460009061200257506000611756565b600d54600a54604051632cdc85e960e21b815260048101869052600092916001600160a01b03169063b37217a490602401602060405180830381600087803b15801561204d57600080fd5b505af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120859190615733565b61208f9190615c18565b90504260345460366000600d85815481106120ac576120ac615c58565b90600052602060002001548152602001908152602001600020546120d09190615afe565b10156120fc57600d81815481106120e9576120e9615c58565b9060005260206000200154915050611756565b606383111561210f576000915050611756565b61211e84610a5e856001615afe565b949350505050565b603454600082815260366020526040812054909142916121469190615afe565b1192915050565b6006546001600160a01b031633146121775760405162461bcd60e51b815260040161186390615a25565b603455565b600f818154811061218c57600080fd5b600091825260209091200154905081565b600c818154811061218c57600080fd5b61199983838360405180602001604052806000815250613070565b6006546001600160a01b031633146121f25760405162461bcd60e51b815260040161186390615a25565b600980546001600160a01b039586166001600160a01b031991821617909155600b805494861694821694909417909355600a80549285169284169290921790915560088054919093169116179055565b6006546001600160a01b0316331461226c5760405162461bcd60e51b815260040161186390615a25565b8051611cc690604c9060208401906150e1565b6006546001600160a01b031633146122a95760405162461bcd60e51b815260040161186390615a25565b601c91909155601d55565b600080611d296018546017546122ca9190615afe565b6122d49190615afe565b905060325481106122e757505060305490565b60335481106122f857505060315490565b5050602f5490565b6000818152600260205260408120546001600160a01b0316806117565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401611863565b6006546001600160a01b031633146123a15760405162461bcd60e51b815260040161186390615a25565b60009182526036602052604090912055565b6010818154811061218c57600080fd5b6006546001600160a01b031633146123ed5760405162461bcd60e51b815260040161186390615a25565b602f92909255603055603155565b60006001600160a01b0382166124665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401611863565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146124ac5760405162461bcd60e51b815260040161186390615a25565b6124b66000614574565b565b6006546001600160a01b031633146124e25760405162461bcd60e51b815260040161186390615a25565b806000815181106124f5576124f5615c58565b6020026020010151604d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060018151811061253657612536615c58565b6020026020010151604e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b6006546001600160a01b031633146125915760405162461bcd60e51b815260040161186390615a25565b6045805492151560ff19938416179055602e805491151591909216179055565b6006546001600160a01b031633146125db5760405162461bcd60e51b815260040161186390615a25565b60005b8151811015611cc6576001602360008484815181106125ff576125ff615c58565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061263b81615bfd565b9150506125de565b60455460ff166126955760405162461bcd60e51b815260206004820152601860248201527f4d6967726174696f6e206973206e6f7420656e61626c656400000000000000006044820152606401611863565b60006126a060075490565b600b5460405163a12ea78760e01b81529192506000916001600160a01b039091169063a12ea787906126d69086906004016158f0565b60006040518083038186803b1580156126ee57600080fd5b505afa158015612702573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261272a91908101906155ab565b90506000805b84518110156129cc576042600086838151811061274f5761274f615c58565b60209081029190910181015182528101919091526040016000205460ff1615612777576129ba565b600b54855133916001600160a01b031690636352211e908890859081106127a0576127a0615c58565b60200260200101516040518263ffffffff1660e01b81526004016127c691815260200190565b60206040518083038186803b1580156127de57600080fd5b505afa1580156127f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612816919061521d565b6001600160a01b031614612829576129ba565b60016042600087848151811061284157612841615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555061289f33838661287e9190615afe565b85848151811061289057612890615c58565b60200260200101516001614249565b8281815181106128b1576128b1615c58565b602002602001015160ff16600114156129ac578481815181106128d6576128d6615c58565b60200260200101516043600084876128ee9190615afe565b815260208101919091526040016000205561291561290c8386615afe565b6064600f6145c6565b156129655760066044600087848151811061293257612932615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506129ac565b60036044600087848151811061297d5761297d615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b816129b681615bfd565b9250505b6129c5600182615afe565b9050612730565b5050505050565b60606001805461176b90615bc8565b6000611756610cef836000611ff0565b602d544210158015612a0657506000602d54115b612a525760405162461bcd60e51b815260206004820152601860248201527f50686173652054776f206861736e2774207374617274656400000000000000006044820152606401611863565b6000612a5d60075490565b9050600082118015612a705750600a8211155b612a8c5760405162461bcd60e51b8152600401611863906159c8565b6122b881601b54601a54601954612aa39190615afe565b612aad9190615afe565b612ab79190615afe565b1115612b185760405162461bcd60e51b815260206004820152602a60248201527f57652072616e206f7574206f66206c616e642120547279206d696e74696e672060448201526977697468206c6573732160b01b6064820152608401611863565b60095460405163171ee88760e31b81523360048201526000916001600160a01b03169063b8f744389060240160006040518083038186803b158015612b5c57600080fd5b505afa158015612b70573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b989190810190615520565b90506000805b825181108015612bad57508482105b156129cc57602b6000848381518110612bc857612bc8615c58565b60209081029190910181015182528101919091526040016000205460ff1615612bf057612d40565b6002612c24612bff8487615afe565b601654601554601454612c129190615afe565b612c1c9190615afe565b6016546145c6565b15612c3157506004612c6c565b612c63612c3e8487615afe565b601654601554601454612c519190615afe565b612c5b9190615afe565b6015546145c6565b15612c6c575060035b600854601d54604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015612cbc57600080fd5b505af1158015612cd0573d6000803e3d6000fd5b505050506001602b6000868581518110612cec57612cec615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550612d31338487612d299190615afe565b836001614249565b612d3c600184615afe565b9250505b612d4b600182615afe565b9050612b9e565b602e5460ff16612da45760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74207769746820245241494e424f5753207965742e006044820152606401611863565b60008181526046602052604090205460ff16600114612e105760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206576696c206e6f756e646c65732063616e20676f20746f206a6169604482015261361760f11b6064820152608401611863565b600854603554604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015612e6057600080fd5b505af1158015612e74573d6000803e3d6000fd5b5050506000828152603660205260408120600190819055603980549193509190612e9f908490615afe565b909155505050565b6060600082516001600160401b03811115612ec457612ec4615c6e565b604051908082528060200260200182016040528015612eed578160200160208202803683370190505b50905060005b8351811015612f6c5760466000858381518110612f1257612f12615c58565b6020026020010151815260200190815260200160002060009054906101000a900460ff16828281518110612f4857612f48615c58565b60ff90921660209283029190910190910152612f65600182615afe565b9050612ef3565b5092915050565b6001600160a01b038216331415612fcc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401611863565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146130625760405162461bcd60e51b815260040161186390615a25565b601192909255601355601255565b604b5460ff1680613090575060008281526049602052604090205460ff16155b6130d85760405162461bcd60e51b8152602060048201526019602482015278546f6b656e206973207374696c6c2070726f63657373696e6760381b6044820152606401611863565b600854604051636a092e7960e01b81526001600160a01b038681166004830152858116602483015290911690636a092e7990604401600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505060008381526046602052604090205460ff16151590506131af576001600160a01b0384166000908152603d6020526040812080549161317c83615bb1565b90915550506001600160a01b0383166000908152603d602052604081208054916131a583615bfd565b9190505550613351565b60008281526046602052604090205460ff1660011415613216576001600160a01b0384166000908152603e602052604081208054916131ed83615bb1565b90915550506001600160a01b0383166000908152603e602052604081208054916131a583615bfd565b60008281526046602052604090205460ff166002141561327d576001600160a01b0384166000908152603f6020526040812080549161325483615bb1565b90915550506001600160a01b0383166000908152603f602052604081208054916131a583615bfd565b60008281526046602052604090205460ff16600314156132e4576001600160a01b03841660009081526040602081905281208054916132bb83615bb1565b90915550506001600160a01b03831660009081526040602081905281208054916131a583615bfd565b60008281526046602052604090205460ff1660041415613351576001600160a01b038416600090815260416020526040812080549161332283615bb1565b90915550506001600160a01b038316600090815260416020526040812080549161334b83615bfd565b91905055505b61335d8484848461466c565b50505050565b60606000613370836123fb565b90506000816001600160401b0381111561338c5761338c615c6e565b6040519080825280602002602001820160405280156133b5578160200160208202803683370190505b5090506000805b83821080156133cc575060075481105b1561343157856001600160a01b03166133e482612300565b6001600160a01b0316141561341f578083838151811061340657613406615c58565b602090810291909101015261341c600183615afe565b91505b8061342981615bfd565b9150506133bc565b5090949350505050565b6006546001600160a01b031633146134655760405162461bcd60e51b815260040161186390615a25565b602c91909155602d55565b6060603c8054806020026020016040519081016040528092919081815260200182805480156117e457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116134aa575050505050905090565b6006546001600160a01b031633146134fb5760405162461bcd60e51b815260040161186390615a25565b600093845260496020526040909320805492151560ff19938416179055604b805491151591909216179055604580549115156101000261ff0019909216919091179055565b6006546001600160a01b0316331461356a5760405162461bcd60e51b815260040161186390615a25565b60ff81166135d55760fa826022546135829190615afe565b11156135d05760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742072657365727665206d6f726520636f6d70616e696f6e7321006044820152606401611863565b6136a8565b8060ff166001141561364a5760fa826020546135f19190615afe565b11156135d05760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f742072657365727665206d6f7265206576696c206e6f756e646c65604482015261732160f01b6064820152608401611863565b60fa8260215461365a9190615afe565b11156136a85760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742072657365727665206d6f7265206c616e6421000000000000006044820152606401611863565b60006136b360075490565b905060005b8381101561335d576136d6336136ce8385615afe565b856001614249565b60ff83166136f857602280549060006136ee83615bfd565b919050555061372a565b8260ff166001141561371457602080549060006136ee83615bfd565b6021805490600061372483615bfd565b91905055505b8061373481615bfd565b9150506136b8565b6000818152600260205260409020546060906001600160a01b03166137bb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611863565b60006137c561469e565b60008481526046602052604090205490915081906137e59060ff166146ad565b6000858152604760205260409020546137fd906146ad565b60405160200161380f93929190615816565b604051602081830303815290604052915050919050565b600d546060906000906001600160401b0381111561384657613846615c6e565b60405190808252806020026020018201604052801561386f578160200160208202803683370190505b50905060005b600d5481101561392e574260345460366000600d858154811061389a5761389a615c58565b90600052602060002001548152602001908152602001600020546138be9190615afe565b1161391c576138e9600d82815481106138d9576138d9615c58565b9060005260206000200154612300565b8282815181106138fb576138fb615c58565b60200260200101906001600160a01b031690816001600160a01b0316815250505b613927600182615afe565b9050613875565b50919050565b6006546001600160a01b0316331461395e5760405162461bcd60e51b815260040161186390615a25565b601492909255601555601655565b602e5460ff166139be5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74207769746820245241494e424f5753207965742e006044820152606401611863565b60275460ff16613a1757333214613a175760405162461bcd60e51b815260206004820152601c60248201527f4e6f20636f6e7472616374206d696e74696e6720616c6c6f77656421000000006044820152606401611863565b6000613a2260075490565b9050600082118015613a355750600a8211155b613a515760405162461bcd60e51b8152600401611863906159c8565b619c40611d29601854601754613a679190615afe565b613a719190615afe565b613a7b9084615afe565b1115613ae05760405162461bcd60e51b815260206004820152602e60248201527f57652072616e206f7574206f66206e6f756e646c65732120547279206d696e7460448201526d696e672077697468206c6573732160901b6064820152608401611863565b60005b8281101561199957613afe33613af98385615afe565b6147d5565b80613b0881615bfd565b915050613ae3565b6006546001600160a01b03163314613b3a5760405162461bcd60e51b815260040161186390615a25565b60005b603c54811015613b97576000603b6000603c8481548110613b6057613b60615c58565b60009182526020808320909101546001600160a01b03168352820192909252604001902055613b90600182615afe565b9050613b3d565b506124b6603c6000615165565b600e818154811061218c57600080fd5b6006546001600160a01b03163314613bde5760405162461bcd60e51b815260040161186390615a25565b603555565b602c544210158015613bf757506000602c54115b613c3e5760405162461bcd60e51b8152602060048201526018602482015277141a185cd94813db99481a185cdb89dd081cdd185c9d195960421b6044820152606401611863565b6000613c4960075490565b90506122b8601e546001613c5d9190615afe565b1115613cab5760405162461bcd60e51b815260206004820152601e60248201527f57652072616e206f7574206f66206576696c206e6f756e646c6573203a2800006044820152606401611863565b3360009081526025602052604090205460ff16613d055760405162461bcd60e51b8152602060048201526018602482015277165bdd48185c99481b9bdd081bdb881dda1a5d195b1a5cdd60421b6044820152606401611863565b3360009081526026602052604090205460ff1615613d755760405162461bcd60e51b815260206004820152602760248201527f596f7520616c7265616479206d696e74656420796f7572206672656520636f6d6044820152663830b734b7b71760c91b6064820152608401611863565b60095460405163171ee88760e31b81523360048201526000916001600160a01b03169063b8f744389060240160006040518083038186803b158015613db957600080fd5b505afa158015613dcd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613df59190810190615520565b5111613e565760405162461bcd60e51b815260206004820152602a60248201527f596f75206d75737420686f6c64206174206c65617374206f6e65204e6f756e646044820152691b19481d1bc81b5a5b9d60b21b6064820152608401611863565b336000908152602660205260408120805460ff19166001908117909155601e805491929091613e86908490615afe565b90915550611bd89050338260006001614249565b6006546001600160a01b03163314613ec45760405162461bcd60e51b815260040161186390615a25565b603291909155603355565b600d818154811061218c57600080fd5b6006546001600160a01b03163314613f095760405162461bcd60e51b815260040161186390615a25565b6001600160a01b038116613f6e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611863565b611bd881614574565b600a546001600160a01b03163314613fbd5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401611863565b60008281526048602052604090205480613fd45750815b601154600090613fe5606485615c18565b1015613fef575060015b6000828152604a60209081526040808320546046909252909120805460ff191660ff84169081179091556001600160a01b03909116906140ad576001600160a01b0381166000908152603d6020526040812080549161404d83615bfd565b9091555050600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018390556017805460008581526047602052604081208290559091906140a383615bfd565b919050555061412d565b6001600160a01b0381166000908152603e602052604081208054916140d183615bfd565b9091555050600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50183905560188054600085815260476020526040812082905590919061412783615bfd565b91905055505b50506000908152604960205260409020805460ff191690555050565b6006546001600160a01b031633146141735760405162461bcd60e51b815260040161186390615a25565b60005b8151811015611cc65760016025600084848151811061419757614197615c58565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806141d381615bfd565b915050614176565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061421082612300565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6142538484614b7f565b614261600780546001019055565b80801561426f575060ff8216155b156142f8576001600160a01b0384166000908152603d6020526040812080549161429883615bfd565b9091555050600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018390556017805460008581526047602052604081208290559091906142ee83615bfd565b919050555061451f565b80801561430857508160ff166001145b15614387576001600160a01b0384166000908152603e6020526040812080549161433183615bfd565b9091555050600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5018390556018805460008581526047602052604081208290559091906142ee83615bfd565b8160ff166002141561440d576001600160a01b0384166000908152603f602052604081208054916143b783615bfd565b9091555050600e8054600181019091557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd018390556019805460008581526047602052604081208290559091906142ee83615bfd565b8160ff1660031415614493576001600160a01b038416600090815260406020819052812080549161443d83615bfd565b9091555050600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201839055601a805460008581526047602052604081208290559091906142ee83615bfd565b8160ff166004141561451f576001600160a01b03841660009081526041602052604081208054916144c383615bfd565b909155505060108054600181019091557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201839055601b8054600085815260476020526040812082905590919061451983615bfd565b91905055505b50600091825260466020526040909120805460ff191660ff90921691909117905550565b61454d3382614b99565b6145695760405162461bcd60e51b815260040161186390615a5a565b611999838383614c8c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54604051632cdc85e960e21b815260048101859052600091839185916001600160a01b03169063b37217a490602401602060405180830381600087803b15801561461157600080fd5b505af1158015614625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146499190615733565b6146539190615c18565b101561466157506001614665565b5060005b9392505050565b6146763383614b99565b6146925760405162461bcd60e51b815260040161186390615a5a565b61335d84848484614e2c565b6060604c805461176b90615bc8565b6060816146d15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156146fb57806146e581615bfd565b91506146f49050600a83615b3b565b91506146d5565b6000816001600160401b0381111561471557614715615c6e565b6040519080825280601f01601f19166020018201604052801561473f576020820181803683370190505b509050815b85156147cc57614755600182615b6e565b90506000614764600a88615b3b565b61476f90600a615b4f565b6147799088615b6e565b614784906030615b16565b905060008160f81b9050808484815181106147a1576147a1615c58565b60200101906001600160f81b031916908160001a9053506147c3600a89615b3b565b97505050614744565b50949350505050565b816000806147e38482611ff0565b60125460455491925090610100900460ff16801561480057508115155b8015614819575060008281526043602052604090205415155b80156148c5575061482982612300565b600b54600084815260436020526040908190205490516331a9108f60e11b815260048101919091526001600160a01b039283169290911690636352211e9060240160206040518083038186803b15801561488257600080fd5b505afa158015614896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148ba919061521d565b6001600160a01b0316145b156148f657600082815260436020908152604080832054835260449091529020546148f39060ff1682615afe565b90505b614902856064836145c6565b15614a24578115614a24576001603760008282546149209190615afe565b925050819055506149358560646013546145c6565b15614969576000828152603660205260408120429055603a80546001929061495e908490615afe565b90915550614a249050565b61497282612300565b93506001603860008282546149879190615afe565b90915550506001600160a01b0384166000908152603b60205260409020546149f557603c80546001810182556000919091527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e0180546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0384166000908152603b60205260408120805460019290614a1e908490615afe565b90915550505b6008546001600160a01b0316639dc29fac33614a3e6122b4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015614a8457600080fd5b505af1158015614a98573d6000803e3d6000fd5b5050506000868152604960205260408120805460ff19166001179055614ac49150859087908690614249565b6000858152604a602052604080822080546001600160a01b0319166001600160a01b0388811691909117909155600a549151631c72af8b60e21b8152600481018990529116906371cabe2c90602401602060405180830381600087803b158015614b2d57600080fd5b505af1158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615733565b600090815260486020526040902095909555505050505050565b611cc6828260405180602001604052806000815250614e5f565b6000818152600260205260408120546001600160a01b0316614c125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611863565b6000614c1d83612300565b9050806001600160a01b0316846001600160a01b03161480614c585750836001600160a01b0316614c4d846117ee565b6001600160a01b0316145b8061211e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661211e565b826001600160a01b0316614c9f82612300565b6001600160a01b031614614d075760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401611863565b6001600160a01b038216614d695760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611863565b614d746000826141db565b6001600160a01b0383166000908152600360205260408120805460019290614d9d908490615b6e565b90915550506001600160a01b0382166000908152600360205260408120805460019290614dcb908490615afe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b614e37848484614c8c565b614e4384848484614e92565b61335d5760405162461bcd60e51b815260040161186390615976565b614e698383614f9f565b614e766000848484614e92565b6119995760405162461bcd60e51b815260040161186390615976565b60006001600160a01b0384163b15614f9457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614ed6903390899088908890600401615866565b602060405180830381600087803b158015614ef057600080fd5b505af1925050508015614f20575060408051601f3d908101601f19168201909252614f1d918101906156ce565b60015b614f7a573d808015614f4e576040519150601f19603f3d011682016040523d82523d6000602084013e614f53565b606091505b508051614f725760405162461bcd60e51b815260040161186390615976565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061211e565b506001949350505050565b6001600160a01b038216614ff55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611863565b6000818152600260205260409020546001600160a01b03161561505a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611863565b6001600160a01b0382166000908152600360205260408120805460019290615083908490615afe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546150ed90615bc8565b90600052602060002090601f01602090048101928261510f5760008555615155565b82601f1061512857805160ff1916838001178555615155565b82800160010185558215615155579182015b8281111561515557825182559160200191906001019061513a565b5061516192915061517f565b5090565b5080546000825590600052602060002090810190611bd891905b5b808211156151615760008155600101615180565b60006001600160401b038311156151ad576151ad615c6e565b6151c0601f8401601f1916602001615aab565b90508281528383830111156151d457600080fd5b828260208301376000602084830101529392505050565b803580151581146151fb57600080fd5b919050565b60006020828403121561521257600080fd5b813561466581615c84565b60006020828403121561522f57600080fd5b815161466581615c84565b6000806040838503121561524d57600080fd5b823561525881615c84565b9150602083013561526881615c84565b809150509250929050565b6000806000806080858703121561528957600080fd5b843561529481615c84565b935060208501356152a481615c84565b925060408501356152b481615c84565b915060608501356152c481615c84565b939692955090935050565b6000806000606084860312156152e457600080fd5b83356152ef81615c84565b925060208401356152ff81615c84565b929592945050506040919091013590565b6000806000806080858703121561532657600080fd5b843561533181615c84565b9350602085013561534181615c84565b92506040850135915060608501356001600160401b0381111561536357600080fd5b8501601f8101871361537457600080fd5b61538387823560208401615194565b91505092959194509250565b600080604083850312156153a257600080fd5b82356153ad81615c84565b91506153bb602084016151eb565b90509250929050565b600080604083850312156153d757600080fd5b82356153e281615c84565b946020939093013593505050565b6000602080838503121561540357600080fd5b82356001600160401b0381111561541957600080fd5b8301601f8101851361542a57600080fd5b803561543d61543882615adb565b615aab565b80828252848201915084840188868560051b870101111561545d57600080fd5b600094505b8385101561548957803561547581615c84565b835260019490940193918501918501615462565b50979650505050505050565b600060208083850312156154a857600080fd5b82356001600160401b038111156154be57600080fd5b8301601f810185136154cf57600080fd5b80356154dd61543882615adb565b80828252848201915084840188868560051b87010111156154fd57600080fd5b600094505b83851015615489578035835260019490940193918501918501615502565b6000602080838503121561553357600080fd5b82516001600160401b0381111561554957600080fd5b8301601f8101851361555a57600080fd5b805161556861543882615adb565b80828252848201915084840188868560051b870101111561558857600080fd5b600094505b8385101561548957805183526001949094019391850191850161558d565b600060208083850312156155be57600080fd5b82516001600160401b038111156155d457600080fd5b8301601f810185136155e557600080fd5b80516155f361543882615adb565b80828252848201915084840188868560051b870101111561561357600080fd5b600094505b8385101561548957805161562b81615caf565b835260019490940193918501918501615618565b60006020828403121561565157600080fd5b614665826151eb565b6000806040838503121561566d57600080fd5b6153ad836151eb565b60006020828403121561568857600080fd5b5035919050565b600080604083850312156156a257600080fd5b50508035926020909101359150565b6000602082840312156156c357600080fd5b813561466581615c99565b6000602082840312156156e057600080fd5b815161466581615c99565b6000602082840312156156fd57600080fd5b81356001600160401b0381111561571357600080fd5b8201601f8101841361572457600080fd5b61211e84823560208401615194565b60006020828403121561574557600080fd5b5051919050565b6000806000806080858703121561576257600080fd5b84359350615772602086016151eb565b9250615780604086016151eb565b915061578e606086016151eb565b905092959194509250565b6000806000606084860312156157ae57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156157d857600080fd5b82359150602083013561526881615caf565b60008151808452615802816020860160208601615b85565b601f01601f19169290920160200192915050565b60008451615828818460208901615b85565b84519083019061583c818360208901615b85565b602f60f81b91019081528351615859816001840160208801615b85565b0160010195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615899908301846157ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156158e45783516001600160a01b0316835292840192918401916001016158bf565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156158e45783518352928401929184019160010161590c565b6020808252825182820181905260009190848201906040850190845b818110156158e457835160ff1683529284019291840191600101615944565b60208152600061466560208301846157ea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252603a908201527f596f757220616d6f756e74206e6565647320746f20626520677265617465722060408201527f7468656e203020616e642063616e277420657863656564203130000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715615ad357615ad3615c6e565b604052919050565b60006001600160401b03821115615af457615af4615c6e565b5060051b60200190565b60008219821115615b1157615b11615c2c565b500190565b600060ff821660ff84168060ff03821115615b3357615b33615c2c565b019392505050565b600082615b4a57615b4a615c42565b500490565b6000816000190483118215151615615b6957615b69615c2c565b500290565b600082821015615b8057615b80615c2c565b500390565b60005b83811015615ba0578181015183820152602001615b88565b8381111561335d5750506000910152565b600081615bc057615bc0615c2c565b506000190190565b600181811c90821680615bdc57607f821691505b6020821081141561392e57634e487b7160e01b600052602260045260246000fd5b6000600019821415615c1157615c11615c2c565b5060010190565b600082615c2757615c27615c42565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611bd857600080fd5b6001600160e01b031981168114611bd857600080fd5b60ff81168114611bd857600080fdfea2646970667358221220052a64755c3e3a7ebce240b9e0e5eedbe48fde761d683820ae6fb51f37add75864736f6c634300080700330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f63646e2e6e6f756e646c65732e696f2f6d657461646174615f325f702f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106107995760003560e01c80638e3957d9116103dd578063cac05ca911610208578063e985e9c511610123578063f1f01b28116100b6578063f6697c8b11610085578063f6697c8b14611650578063f8dc972a1461167d578063fa429ae11461169d578063fbde6292146116bd578063fd1cb0f7146116ea57600080fd5b8063f1f01b2814611246578063f243f31a14611604578063f2fde38b1461161a578063f4b91f991461163a57600080fd5b8063ed84cd3c116100f2578063ed84cd3c1461158b578063eddce3ae146115ab578063eed0eb4b146115c1578063f1d770c5146115d757600080fd5b8063e985e9c5146114f6578063ead24c891461153f578063eb1b45dd14611555578063ec57bd371461157557600080fd5b8063d0ae0b471161019b578063de0c5e8c1161016a578063de0c5e8c1461146e578063df822b251461148e578063e13222f4146114be578063e711eba4146114c657600080fd5b8063d0ae0b47146113ff578063d26b2e5f14611415578063d43a96481461142b578063d92a16a31461145857600080fd5b8063cafa8988116101d7578063cafa8988146113a1578063cb1f08e6146113b4578063ce673d98146113ca578063cf38f85e146113df57600080fd5b8063cac05ca914611322578063cac1ad0d14611337578063cac3932914611357578063cae4b8f61461137157600080fd5b8063b88d4fde116102f8578063c1594ffc1161028b578063c761ee141161025a578063c761ee141461127c578063c7c33ccb146112b5578063c87b56dd146112d5578063c8f4b0d0146112f557600080fd5b8063c1594ffc14611230578063c26dc08414611246578063c69f16d51461125c578063c6faea401461124657600080fd5b8063bdf58fc9116102c7578063bdf58fc914610bac578063be6522f6146111cb578063c091bd03146111ed578063c0d63a991461121a57600080fd5b8063b88d4fde14611148578063b8f7443814611168578063bba55e4714611195578063bbeb2952146111b557600080fd5b8063a22cb46511610370578063af9a8df61161033f578063af9a8df6146110c2578063b3bfe6b6146110d8578063b496a6b814611105578063b6c37c1b1461111b57600080fd5b8063a22cb46514611038578063a676d15114611058578063aa35d67f14611088578063aca19e68146110a257600080fd5b806398ac19d5116103ac57806398ac19d514610fcb5780639b97eed314610fde5780639dbb2bfe14610ff8578063a12ea7871461100b57600080fd5b80638e3957d914610f605780638e3acac514610f8057806395d89b4114610f96578063981fc62714610fab57600080fd5b80634a945f8d116105c857806370a08231116104e35780637c877b4811610476578063831ee80211610445578063831ee80214610f0057806384c518d714610bac578063890e858414610f165780638d04cf3414610f2c5780638da5cb5b14610f4257600080fd5b80637c877b4814610e77578063806ba6d614610e975780638149608814610eb75780638230d1da14610eca57600080fd5b8063749e9be9116104b2578063749e9be914610df857806375fd0bb114610e1857806379d25f3814610e385780637a19dfc914610e5757600080fd5b806370a0823114610d80578063714e89ec14610da0578063715018a614610dcd578063721bdbcc14610de257600080fd5b80635e8ea4251161055b578063668035e31161052a578063668035e314610d0a5780636b477d2014610d205780636d252c8514610d405780636f0b398714610d6057600080fd5b80635e8ea42514610ca9578063600068c114610cbe5780636352211e14610cd457806365baf5db14610cf457600080fd5b806358de458e1161059757806358de458e14610c2d5780635a32d02614610c435780635b701c9714610c735780635beb0f9b14610c9357600080fd5b80634a945f8d14610bc15780634e976bf814610be157806353dd51ef14610bf757806355f804b314610c0d57600080fd5b806323b872dd116106b85780633702ff081161064b57806341f2bd771161061a57806341f2bd7714610b5657806342842e0e14610b7657806344a68d2314610b9657806345d9806b14610bac57600080fd5b80633702ff0814610ae0578063389bf05014610af6578063389c715c14610b165780633f59be1d14610b3657600080fd5b80632ffa6582116106875780632ffa658214610a63578063316d6bba14610a79578063322c012414610aa657806335b944bf14610ac657600080fd5b806323b872dd146109d7578063290d2126146109f75780632acc062b14610a2d5780632e35d97c14610a4357600080fd5b806310b34c6711610730578063166098b9116106ff578063166098b91461095357806318160ddd1461098c57806320bc87d2146109a157806321c24409146109b757600080fd5b806310b34c67146108d357806310fab524146108f3578063116b556b14610920578063155dd5ee1461094057600080fd5b8063081812fc1161076c578063081812fc1461085b578063095ea7b3146108935780630cc1f5b6146108b5578063105f9174146108cb57600080fd5b806301f9e3111461079e57806301ffc9a7146107e557806304ac9f111461081557806306fdde0314610839575b600080fd5b3480156107aa57600080fd5b506107ce6107b9366004615676565b60446020526000908152604090205460ff1681565b60405160ff90911681526020015b60405180910390f35b3480156107f157600080fd5b506108056108003660046156b1565b61170a565b60405190151581526020016107dc565b34801561082157600080fd5b5061082b601c5481565b6040519081526020016107dc565b34801561084557600080fd5b5061084e61175c565b6040516107dc9190615963565b34801561086757600080fd5b5061087b610876366004615676565b6117ee565b6040516001600160a01b0390911681526020016107dc565b34801561089f57600080fd5b506108b36108ae3660046153c4565b611888565b005b3480156108c157600080fd5b5061082b601a5481565b6108b361199e565b3480156108df57600080fd5b506108b36108ee36600461563f565b611bdb565b3480156108ff57600080fd5b5061082b61090e366004615676565b60009081526036602052604090205490565b34801561092c57600080fd5b50604d5461087b906001600160a01b031681565b6108b361094e366004615676565b611c18565b34801561095f57600080fd5b5061080561096e366004615200565b6001600160a01b031660009081526023602052604090205460ff1690565b34801561099857600080fd5b5061082b611cca565b3480156109ad57600080fd5b5061082b60115481565b3480156109c357600080fd5b5061087b6109d2366004615676565b611cda565b3480156109e357600080fd5b506108b36109f23660046152cf565b611d04565b348015610a0357600080fd5b5061087b610a12366004615676565b604a602052600090815260409020546001600160a01b031681565b348015610a3957600080fd5b5061082b602f5481565b348015610a4f57600080fd5b5061082b610a5e36600461568f565b611ff0565b348015610a6f57600080fd5b5061082b60155481565b348015610a8557600080fd5b5061082b610a94366004615676565b60476020526000908152604090205481565b348015610ab257600080fd5b50610805610ac1366004615676565b612126565b348015610ad257600080fd5b506045546108059060ff1681565b348015610aec57600080fd5b5061082b60375481565b348015610b0257600080fd5b506108b3610b11366004615676565b61214d565b348015610b2257600080fd5b5060095461087b906001600160a01b031681565b348015610b4257600080fd5b5061082b610b51366004615676565b61217c565b348015610b6257600080fd5b5061082b610b71366004615676565b61219d565b348015610b8257600080fd5b506108b3610b913660046152cf565b6121ad565b348015610ba257600080fd5b5061082b611b5881565b348015610bb857600080fd5b5061082b60fa81565b348015610bcd57600080fd5b506108b3610bdc366004615273565b6121c8565b348015610bed57600080fd5b5061082b601b5481565b348015610c0357600080fd5b5061082b60135481565b348015610c1957600080fd5b506108b3610c283660046156eb565b612242565b348015610c3957600080fd5b5061082b60335481565b348015610c4f57600080fd5b506107ce610c5e366004615676565b60466020526000908152604090205460ff1681565b348015610c7f57600080fd5b506108b3610c8e36600461568f565b61227f565b348015610c9f57600080fd5b5061082b60225481565b348015610cb557600080fd5b5061082b6122b4565b348015610cca57600080fd5b5061082b601f5481565b348015610ce057600080fd5b5061087b610cef366004615676565b612300565b348015610d0057600080fd5b5061082b60325481565b348015610d1657600080fd5b5061082b60355481565b348015610d2c57600080fd5b506108b3610d3b36600461568f565b612377565b348015610d4c57600080fd5b5061082b610d5b366004615676565b6123b3565b348015610d6c57600080fd5b506108b3610d7b366004615799565b6123c3565b348015610d8c57600080fd5b5061082b610d9b366004615200565b6123fb565b348015610dac57600080fd5b5061082b610dbb366004615200565b603f6020526000908152604090205481565b348015610dd957600080fd5b506108b3612482565b348015610dee57600080fd5b5061082b60395481565b348015610e0457600080fd5b50600b5461087b906001600160a01b031681565b348015610e2457600080fd5b506108b3610e333660046153f0565b6124b8565b348015610e4457600080fd5b5060455461080590610100900460ff1681565b348015610e6357600080fd5b506108b3610e7236600461565a565b612567565b348015610e8357600080fd5b506108b3610e923660046153f0565b6125b1565b348015610ea357600080fd5b50604e5461087b906001600160a01b031681565b6108b3610ec5366004615495565b612643565b348015610ed657600080fd5b5061082b610ee5366004615200565b6001600160a01b03166000908152603b602052604090205490565b348015610f0c57600080fd5b5061082b602d5481565b348015610f2257600080fd5b5061082b60215481565b348015610f3857600080fd5b5061082b60175481565b348015610f4e57600080fd5b506006546001600160a01b031661087b565b348015610f6c57600080fd5b50600a5461087b906001600160a01b031681565b348015610f8c57600080fd5b5061082b601e5481565b348015610fa257600080fd5b5061084e6129d3565b348015610fb757600080fd5b5061087b610fc6366004615676565b6129e2565b6108b3610fd9366004615676565b6129f2565b348015610fea57600080fd5b506027546108059060ff1681565b6108b3611006366004615676565b612d52565b34801561101757600080fd5b5061102b611026366004615495565b612ea7565b6040516107dc9190615928565b34801561104457600080fd5b506108b361105336600461538f565b612f73565b34801561106457600080fd5b50610805611073366004615676565b60426020526000908152604090205460ff1681565b34801561109457600080fd5b50602e546108059060ff1681565b3480156110ae57600080fd5b506108b36110bd366004615799565b613038565b3480156110ce57600080fd5b5061082b60345481565b3480156110e457600080fd5b5061082b6110f3366004615200565b603e6020526000908152604090205481565b34801561111157600080fd5b5061082b619c4081565b34801561112757600080fd5b5061082b611136366004615676565b60436020526000908152604090205481565b34801561115457600080fd5b506108b3611163366004615310565b613070565b34801561117457600080fd5b50611188611183366004615200565b613363565b6040516107dc91906158f0565b3480156111a157600080fd5b506108b36111b036600461568f565b61343b565b3480156111c157600080fd5b5061082b60195481565b3480156111d757600080fd5b506111e0613470565b6040516107dc91906158a3565b3480156111f957600080fd5b5061082b611208366004615676565b60486020526000908152604090205481565b34801561122657600080fd5b5061082b60205481565b34801561123c57600080fd5b5061082b60145481565b34801561125257600080fd5b5061082b6122b881565b34801561126857600080fd5b506108b361127736600461574c565b6134d1565b34801561128857600080fd5b50610805611297366004615200565b6001600160a01b031660009081526025602052604090205460ff1690565b3480156112c157600080fd5b506108b36112d03660046157c5565b613540565b3480156112e157600080fd5b5061084e6112f0366004615676565b61373c565b34801561130157600080fd5b5061082b611310366004615200565b60406020819052600091825290205481565b34801561132e57600080fd5b506111e0613826565b34801561134357600080fd5b506108b3611352366004615799565b613934565b34801561136357600080fd5b50604b546108059060ff1681565b34801561137d57600080fd5b5061080561138c366004615676565b60496020526000908152604090205460ff1681565b6108b36113af366004615676565b61396c565b3480156113c057600080fd5b5061082b60315481565b3480156113d657600080fd5b506108b3613b10565b3480156113eb57600080fd5b5061082b6113fa366004615676565b613ba4565b34801561140b57600080fd5b5061082b60125481565b34801561142157600080fd5b5061082b60305481565b34801561143757600080fd5b5061082b611446366004615676565b60366020526000908152604090205481565b34801561146457600080fd5b5061082b611d2981565b34801561147a57600080fd5b506108b3611489366004615676565b613bb4565b34801561149a57600080fd5b506108056114a9366004615676565b6000908152602b602052604090205460ff1690565b6108b3613be3565b3480156114d257600080fd5b506108056114e1366004615676565b6000908152602a602052604090205460ff1690565b34801561150257600080fd5b5061080561151136600461523a565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561154b57600080fd5b5061082b60165481565b34801561156157600080fd5b506108b361157036600461568f565b613e9a565b34801561158157600080fd5b5061082b60385481565b34801561159757600080fd5b5061082b6115a6366004615676565b613ecf565b3480156115b757600080fd5b5061082b601d5481565b3480156115cd57600080fd5b5061082b60185481565b3480156115e357600080fd5b5061082b6115f2366004615200565b603d6020526000908152604090205481565b34801561161057600080fd5b5061082b602c5481565b34801561162657600080fd5b506108b3611635366004615200565b613edf565b34801561164657600080fd5b5061082b603a5481565b34801561165c57600080fd5b5061082b61166b366004615200565b60416020526000908152604090205481565b34801561168957600080fd5b506108b361169836600461568f565b613f77565b3480156116a957600080fd5b5060085461087b906001600160a01b031681565b3480156116c957600080fd5b5061082b6116d8366004615200565b603b6020526000908152604090205481565b3480156116f657600080fd5b506108b36117053660046153f0565b614149565b60006001600160e01b031982166380ac58cd60e01b148061173b57506001600160e01b03198216635b5e139f60e01b145b8061175657506301ffc9a760e01b6001600160e01b03198316145b92915050565b60606000805461176b90615bc8565b80601f016020809104026020016040519081016040528092919081815260200182805461179790615bc8565b80156117e45780601f106117b9576101008083540402835291602001916117e4565b820191906000526020600020905b8154815290600101906020018083116117c757829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661186c5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061189382612300565b9050806001600160a01b0316836001600160a01b031614156119015760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401611863565b336001600160a01b038216148061191d575061191d8133611511565b61198f5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401611863565b61199983836141db565b505050565b602c5442101580156119b257506000602c54115b6119f95760405162461bcd60e51b8152602060048201526018602482015277141a185cd94813db99481a185cdb89dd081cdd185c9d195960421b6044820152606401611863565b6000611a0460075490565b90506122b8601f546001611a189190615afe565b1115611a665760405162461bcd60e51b815260206004820152601e60248201527f57652072616e206f7574206f66206576696c206e6f756e646c6573203a2800006044820152606401611863565b3360009081526023602052604090205460ff16611ac05760405162461bcd60e51b8152602060048201526018602482015277165bdd48185c99481b9bdd081bdb881dda1a5d195b1a5cdd60421b6044820152606401611863565b3360009081526024602052604090205460ff1615611b2e5760405162461bcd60e51b815260206004820152602560248201527f596f7520616c7265616479206d696e74656420796f75722066726565206e6f75604482015264373236329760d91b6064820152608401611863565b600854601c54604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015611b7e57600080fd5b505af1158015611b92573d6000803e3d6000fd5b5050336000908152602460205260408120805460ff19166001908117909155601f80549194509250611bc5908490615afe565b90915550611bd890503382600180614249565b50565b6006546001600160a01b03163314611c055760405162461bcd60e51b815260040161186390615a25565b6027805460ff1916911515919091179055565b6006546001600160a01b03163314611c425760405162461bcd60e51b815260040161186390615a25565b6000611c4f606483615b3b565b604d549091506001600160a01b03166108fc611c6c836032615b4f565b6040518115909202916000818181858888f19350505050611c8c57600080fd5b604e546001600160a01b03166108fc611ca6836032615b4f565b6040518115909202916000818181858888f19350505050611cc657600080fd5b5050565b6000611cd560075490565b905090565b603c8181548110611cea57600080fd5b6000918252602090912001546001600160a01b0316905081565b604b5460ff1680611d24575060008181526049602052604090205460ff16155b611d6c5760405162461bcd60e51b8152602060048201526019602482015278546f6b656e206973207374696c6c2070726f63657373696e6760381b6044820152606401611863565b600854604051636a092e7960e01b81526001600160a01b038581166004830152848116602483015290911690636a092e7990604401600060405180830381600087803b158015611dbb57600080fd5b505af1158015611dcf573d6000803e3d6000fd5b50505060008281526046602052604090205460ff1615159050611e43576001600160a01b0383166000908152603d60205260408120805491611e1083615bb1565b90915550506001600160a01b0382166000908152603d60205260408120805491611e3983615bfd565b9190505550611fe5565b60008181526046602052604090205460ff1660011415611eaa576001600160a01b0383166000908152603e60205260408120805491611e8183615bb1565b90915550506001600160a01b0382166000908152603e60205260408120805491611e3983615bfd565b60008181526046602052604090205460ff1660021415611f11576001600160a01b0383166000908152603f60205260408120805491611ee883615bb1565b90915550506001600160a01b0382166000908152603f60205260408120805491611e3983615bfd565b60008181526046602052604090205460ff1660031415611f78576001600160a01b0383166000908152604060208190528120805491611f4f83615bb1565b90915550506001600160a01b0382166000908152604060208190528120805491611e3983615bfd565b60008181526046602052604090205460ff1660041415611fe5576001600160a01b0383166000908152604160205260408120805491611fb683615bb1565b90915550506001600160a01b0382166000908152604160205260408120805491611fdf83615bfd565b91905055505b611999838383614543565b600d5460009061200257506000611756565b600d54600a54604051632cdc85e960e21b815260048101869052600092916001600160a01b03169063b37217a490602401602060405180830381600087803b15801561204d57600080fd5b505af1158015612061573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120859190615733565b61208f9190615c18565b90504260345460366000600d85815481106120ac576120ac615c58565b90600052602060002001548152602001908152602001600020546120d09190615afe565b10156120fc57600d81815481106120e9576120e9615c58565b9060005260206000200154915050611756565b606383111561210f576000915050611756565b61211e84610a5e856001615afe565b949350505050565b603454600082815260366020526040812054909142916121469190615afe565b1192915050565b6006546001600160a01b031633146121775760405162461bcd60e51b815260040161186390615a25565b603455565b600f818154811061218c57600080fd5b600091825260209091200154905081565b600c818154811061218c57600080fd5b61199983838360405180602001604052806000815250613070565b6006546001600160a01b031633146121f25760405162461bcd60e51b815260040161186390615a25565b600980546001600160a01b039586166001600160a01b031991821617909155600b805494861694821694909417909355600a80549285169284169290921790915560088054919093169116179055565b6006546001600160a01b0316331461226c5760405162461bcd60e51b815260040161186390615a25565b8051611cc690604c9060208401906150e1565b6006546001600160a01b031633146122a95760405162461bcd60e51b815260040161186390615a25565b601c91909155601d55565b600080611d296018546017546122ca9190615afe565b6122d49190615afe565b905060325481106122e757505060305490565b60335481106122f857505060315490565b5050602f5490565b6000818152600260205260408120546001600160a01b0316806117565760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401611863565b6006546001600160a01b031633146123a15760405162461bcd60e51b815260040161186390615a25565b60009182526036602052604090912055565b6010818154811061218c57600080fd5b6006546001600160a01b031633146123ed5760405162461bcd60e51b815260040161186390615a25565b602f92909255603055603155565b60006001600160a01b0382166124665760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401611863565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146124ac5760405162461bcd60e51b815260040161186390615a25565b6124b66000614574565b565b6006546001600160a01b031633146124e25760405162461bcd60e51b815260040161186390615a25565b806000815181106124f5576124f5615c58565b6020026020010151604d60006101000a8154816001600160a01b0302191690836001600160a01b031602179055508060018151811061253657612536615c58565b6020026020010151604e60006101000a8154816001600160a01b0302191690836001600160a01b0316021790555050565b6006546001600160a01b031633146125915760405162461bcd60e51b815260040161186390615a25565b6045805492151560ff19938416179055602e805491151591909216179055565b6006546001600160a01b031633146125db5760405162461bcd60e51b815260040161186390615a25565b60005b8151811015611cc6576001602360008484815181106125ff576125ff615c58565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff19169115159190911790558061263b81615bfd565b9150506125de565b60455460ff166126955760405162461bcd60e51b815260206004820152601860248201527f4d6967726174696f6e206973206e6f7420656e61626c656400000000000000006044820152606401611863565b60006126a060075490565b600b5460405163a12ea78760e01b81529192506000916001600160a01b039091169063a12ea787906126d69086906004016158f0565b60006040518083038186803b1580156126ee57600080fd5b505afa158015612702573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261272a91908101906155ab565b90506000805b84518110156129cc576042600086838151811061274f5761274f615c58565b60209081029190910181015182528101919091526040016000205460ff1615612777576129ba565b600b54855133916001600160a01b031690636352211e908890859081106127a0576127a0615c58565b60200260200101516040518263ffffffff1660e01b81526004016127c691815260200190565b60206040518083038186803b1580156127de57600080fd5b505afa1580156127f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612816919061521d565b6001600160a01b031614612829576129ba565b60016042600087848151811061284157612841615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff02191690831515021790555061289f33838661287e9190615afe565b85848151811061289057612890615c58565b60200260200101516001614249565b8281815181106128b1576128b1615c58565b602002602001015160ff16600114156129ac578481815181106128d6576128d6615c58565b60200260200101516043600084876128ee9190615afe565b815260208101919091526040016000205561291561290c8386615afe565b6064600f6145c6565b156129655760066044600087848151811061293257612932615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360ff1602179055506129ac565b60036044600087848151811061297d5761297d615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908360ff1602179055505b816129b681615bfd565b9250505b6129c5600182615afe565b9050612730565b5050505050565b60606001805461176b90615bc8565b6000611756610cef836000611ff0565b602d544210158015612a0657506000602d54115b612a525760405162461bcd60e51b815260206004820152601860248201527f50686173652054776f206861736e2774207374617274656400000000000000006044820152606401611863565b6000612a5d60075490565b9050600082118015612a705750600a8211155b612a8c5760405162461bcd60e51b8152600401611863906159c8565b6122b881601b54601a54601954612aa39190615afe565b612aad9190615afe565b612ab79190615afe565b1115612b185760405162461bcd60e51b815260206004820152602a60248201527f57652072616e206f7574206f66206c616e642120547279206d696e74696e672060448201526977697468206c6573732160b01b6064820152608401611863565b60095460405163171ee88760e31b81523360048201526000916001600160a01b03169063b8f744389060240160006040518083038186803b158015612b5c57600080fd5b505afa158015612b70573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052612b989190810190615520565b90506000805b825181108015612bad57508482105b156129cc57602b6000848381518110612bc857612bc8615c58565b60209081029190910181015182528101919091526040016000205460ff1615612bf057612d40565b6002612c24612bff8487615afe565b601654601554601454612c129190615afe565b612c1c9190615afe565b6016546145c6565b15612c3157506004612c6c565b612c63612c3e8487615afe565b601654601554601454612c519190615afe565b612c5b9190615afe565b6015546145c6565b15612c6c575060035b600854601d54604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015612cbc57600080fd5b505af1158015612cd0573d6000803e3d6000fd5b505050506001602b6000868581518110612cec57612cec615c58565b6020026020010151815260200190815260200160002060006101000a81548160ff021916908315150217905550612d31338487612d299190615afe565b836001614249565b612d3c600184615afe565b9250505b612d4b600182615afe565b9050612b9e565b602e5460ff16612da45760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74207769746820245241494e424f5753207965742e006044820152606401611863565b60008181526046602052604090205460ff16600114612e105760405162461bcd60e51b815260206004820152602260248201527f4f6e6c79206576696c206e6f756e646c65732063616e20676f20746f206a6169604482015261361760f11b6064820152608401611863565b600854603554604051632770a7eb60e21b815233600482015260248101919091526001600160a01b0390911690639dc29fac90604401600060405180830381600087803b158015612e6057600080fd5b505af1158015612e74573d6000803e3d6000fd5b5050506000828152603660205260408120600190819055603980549193509190612e9f908490615afe565b909155505050565b6060600082516001600160401b03811115612ec457612ec4615c6e565b604051908082528060200260200182016040528015612eed578160200160208202803683370190505b50905060005b8351811015612f6c5760466000858381518110612f1257612f12615c58565b6020026020010151815260200190815260200160002060009054906101000a900460ff16828281518110612f4857612f48615c58565b60ff90921660209283029190910190910152612f65600182615afe565b9050612ef3565b5092915050565b6001600160a01b038216331415612fcc5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401611863565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6006546001600160a01b031633146130625760405162461bcd60e51b815260040161186390615a25565b601192909255601355601255565b604b5460ff1680613090575060008281526049602052604090205460ff16155b6130d85760405162461bcd60e51b8152602060048201526019602482015278546f6b656e206973207374696c6c2070726f63657373696e6760381b6044820152606401611863565b600854604051636a092e7960e01b81526001600160a01b038681166004830152858116602483015290911690636a092e7990604401600060405180830381600087803b15801561312757600080fd5b505af115801561313b573d6000803e3d6000fd5b50505060008381526046602052604090205460ff16151590506131af576001600160a01b0384166000908152603d6020526040812080549161317c83615bb1565b90915550506001600160a01b0383166000908152603d602052604081208054916131a583615bfd565b9190505550613351565b60008281526046602052604090205460ff1660011415613216576001600160a01b0384166000908152603e602052604081208054916131ed83615bb1565b90915550506001600160a01b0383166000908152603e602052604081208054916131a583615bfd565b60008281526046602052604090205460ff166002141561327d576001600160a01b0384166000908152603f6020526040812080549161325483615bb1565b90915550506001600160a01b0383166000908152603f602052604081208054916131a583615bfd565b60008281526046602052604090205460ff16600314156132e4576001600160a01b03841660009081526040602081905281208054916132bb83615bb1565b90915550506001600160a01b03831660009081526040602081905281208054916131a583615bfd565b60008281526046602052604090205460ff1660041415613351576001600160a01b038416600090815260416020526040812080549161332283615bb1565b90915550506001600160a01b038316600090815260416020526040812080549161334b83615bfd565b91905055505b61335d8484848461466c565b50505050565b60606000613370836123fb565b90506000816001600160401b0381111561338c5761338c615c6e565b6040519080825280602002602001820160405280156133b5578160200160208202803683370190505b5090506000805b83821080156133cc575060075481105b1561343157856001600160a01b03166133e482612300565b6001600160a01b0316141561341f578083838151811061340657613406615c58565b602090810291909101015261341c600183615afe565b91505b8061342981615bfd565b9150506133bc565b5090949350505050565b6006546001600160a01b031633146134655760405162461bcd60e51b815260040161186390615a25565b602c91909155602d55565b6060603c8054806020026020016040519081016040528092919081815260200182805480156117e457602002820191906000526020600020905b81546001600160a01b031681526001909101906020018083116134aa575050505050905090565b6006546001600160a01b031633146134fb5760405162461bcd60e51b815260040161186390615a25565b600093845260496020526040909320805492151560ff19938416179055604b805491151591909216179055604580549115156101000261ff0019909216919091179055565b6006546001600160a01b0316331461356a5760405162461bcd60e51b815260040161186390615a25565b60ff81166135d55760fa826022546135829190615afe565b11156135d05760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f742072657365727665206d6f726520636f6d70616e696f6e7321006044820152606401611863565b6136a8565b8060ff166001141561364a5760fa826020546135f19190615afe565b11156135d05760405162461bcd60e51b815260206004820152602260248201527f43616e6e6f742072657365727665206d6f7265206576696c206e6f756e646c65604482015261732160f01b6064820152608401611863565b60fa8260215461365a9190615afe565b11156136a85760405162461bcd60e51b815260206004820152601960248201527f43616e6e6f742072657365727665206d6f7265206c616e6421000000000000006044820152606401611863565b60006136b360075490565b905060005b8381101561335d576136d6336136ce8385615afe565b856001614249565b60ff83166136f857602280549060006136ee83615bfd565b919050555061372a565b8260ff166001141561371457602080549060006136ee83615bfd565b6021805490600061372483615bfd565b91905055505b8061373481615bfd565b9150506136b8565b6000818152600260205260409020546060906001600160a01b03166137bb5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401611863565b60006137c561469e565b60008481526046602052604090205490915081906137e59060ff166146ad565b6000858152604760205260409020546137fd906146ad565b60405160200161380f93929190615816565b604051602081830303815290604052915050919050565b600d546060906000906001600160401b0381111561384657613846615c6e565b60405190808252806020026020018201604052801561386f578160200160208202803683370190505b50905060005b600d5481101561392e574260345460366000600d858154811061389a5761389a615c58565b90600052602060002001548152602001908152602001600020546138be9190615afe565b1161391c576138e9600d82815481106138d9576138d9615c58565b9060005260206000200154612300565b8282815181106138fb576138fb615c58565b60200260200101906001600160a01b031690816001600160a01b0316815250505b613927600182615afe565b9050613875565b50919050565b6006546001600160a01b0316331461395e5760405162461bcd60e51b815260040161186390615a25565b601492909255601555601655565b602e5460ff166139be5760405162461bcd60e51b815260206004820152601f60248201527f43616e6e6f74206d696e74207769746820245241494e424f5753207965742e006044820152606401611863565b60275460ff16613a1757333214613a175760405162461bcd60e51b815260206004820152601c60248201527f4e6f20636f6e7472616374206d696e74696e6720616c6c6f77656421000000006044820152606401611863565b6000613a2260075490565b9050600082118015613a355750600a8211155b613a515760405162461bcd60e51b8152600401611863906159c8565b619c40611d29601854601754613a679190615afe565b613a719190615afe565b613a7b9084615afe565b1115613ae05760405162461bcd60e51b815260206004820152602e60248201527f57652072616e206f7574206f66206e6f756e646c65732120547279206d696e7460448201526d696e672077697468206c6573732160901b6064820152608401611863565b60005b8281101561199957613afe33613af98385615afe565b6147d5565b80613b0881615bfd565b915050613ae3565b6006546001600160a01b03163314613b3a5760405162461bcd60e51b815260040161186390615a25565b60005b603c54811015613b97576000603b6000603c8481548110613b6057613b60615c58565b60009182526020808320909101546001600160a01b03168352820192909252604001902055613b90600182615afe565b9050613b3d565b506124b6603c6000615165565b600e818154811061218c57600080fd5b6006546001600160a01b03163314613bde5760405162461bcd60e51b815260040161186390615a25565b603555565b602c544210158015613bf757506000602c54115b613c3e5760405162461bcd60e51b8152602060048201526018602482015277141a185cd94813db99481a185cdb89dd081cdd185c9d195960421b6044820152606401611863565b6000613c4960075490565b90506122b8601e546001613c5d9190615afe565b1115613cab5760405162461bcd60e51b815260206004820152601e60248201527f57652072616e206f7574206f66206576696c206e6f756e646c6573203a2800006044820152606401611863565b3360009081526025602052604090205460ff16613d055760405162461bcd60e51b8152602060048201526018602482015277165bdd48185c99481b9bdd081bdb881dda1a5d195b1a5cdd60421b6044820152606401611863565b3360009081526026602052604090205460ff1615613d755760405162461bcd60e51b815260206004820152602760248201527f596f7520616c7265616479206d696e74656420796f7572206672656520636f6d6044820152663830b734b7b71760c91b6064820152608401611863565b60095460405163171ee88760e31b81523360048201526000916001600160a01b03169063b8f744389060240160006040518083038186803b158015613db957600080fd5b505afa158015613dcd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052613df59190810190615520565b5111613e565760405162461bcd60e51b815260206004820152602a60248201527f596f75206d75737420686f6c64206174206c65617374206f6e65204e6f756e646044820152691b19481d1bc81b5a5b9d60b21b6064820152608401611863565b336000908152602660205260408120805460ff19166001908117909155601e805491929091613e86908490615afe565b90915550611bd89050338260006001614249565b6006546001600160a01b03163314613ec45760405162461bcd60e51b815260040161186390615a25565b603291909155603355565b600d818154811061218c57600080fd5b6006546001600160a01b03163314613f095760405162461bcd60e51b815260040161186390615a25565b6001600160a01b038116613f6e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401611863565b611bd881614574565b600a546001600160a01b03163314613fbd5760405162461bcd60e51b81526020600482015260096024820152684e6f2061636365737360b81b6044820152606401611863565b60008281526048602052604090205480613fd45750815b601154600090613fe5606485615c18565b1015613fef575060015b6000828152604a60209081526040808320546046909252909120805460ff191660ff84169081179091556001600160a01b03909116906140ad576001600160a01b0381166000908152603d6020526040812080549161404d83615bfd565b9091555050600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018390556017805460008581526047602052604081208290559091906140a383615bfd565b919050555061412d565b6001600160a01b0381166000908152603e602052604081208054916140d183615bfd565b9091555050600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb50183905560188054600085815260476020526040812082905590919061412783615bfd565b91905055505b50506000908152604960205260409020805460ff191690555050565b6006546001600160a01b031633146141735760405162461bcd60e51b815260040161186390615a25565b60005b8151811015611cc65760016025600084848151811061419757614197615c58565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806141d381615bfd565b915050614176565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061421082612300565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6142538484614b7f565b614261600780546001019055565b80801561426f575060ff8216155b156142f8576001600160a01b0384166000908152603d6020526040812080549161429883615bfd565b9091555050600c8054600181019091557fdf6966c971051c3d54ec59162606531493a51404a002842f56009d7e5cf4a8c7018390556017805460008581526047602052604081208290559091906142ee83615bfd565b919050555061451f565b80801561430857508160ff166001145b15614387576001600160a01b0384166000908152603e6020526040812080549161433183615bfd565b9091555050600d8054600181019091557fd7b6990105719101dabeb77144f2a3385c8033acd3af97e9423a695e81ad1eb5018390556018805460008581526047602052604081208290559091906142ee83615bfd565b8160ff166002141561440d576001600160a01b0384166000908152603f602052604081208054916143b783615bfd565b9091555050600e8054600181019091557fbb7b4a454dc3493923482f07822329ed19e8244eff582cc204f8554c3620c3fd018390556019805460008581526047602052604081208290559091906142ee83615bfd565b8160ff1660031415614493576001600160a01b038416600090815260406020819052812080549161443d83615bfd565b9091555050600f8054600181019091557f8d1108e10bcb7c27dddfc02ed9d693a074039d026cf4ea4240b40f7d581ac80201839055601a805460008581526047602052604081208290559091906142ee83615bfd565b8160ff166004141561451f576001600160a01b03841660009081526041602052604081208054916144c383615bfd565b909155505060108054600181019091557f1b6847dc741a1b0cd08d278845f9d819d87b734759afb55fe2de5cb82a9ae67201839055601b8054600085815260476020526040812082905590919061451983615bfd565b91905055505b50600091825260466020526040909120805460ff191660ff90921691909117905550565b61454d3382614b99565b6145695760405162461bcd60e51b815260040161186390615a5a565b611999838383614c8c565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a54604051632cdc85e960e21b815260048101859052600091839185916001600160a01b03169063b37217a490602401602060405180830381600087803b15801561461157600080fd5b505af1158015614625573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906146499190615733565b6146539190615c18565b101561466157506001614665565b5060005b9392505050565b6146763383614b99565b6146925760405162461bcd60e51b815260040161186390615a5a565b61335d84848484614e2c565b6060604c805461176b90615bc8565b6060816146d15750506040805180820190915260018152600360fc1b602082015290565b8160005b81156146fb57806146e581615bfd565b91506146f49050600a83615b3b565b91506146d5565b6000816001600160401b0381111561471557614715615c6e565b6040519080825280601f01601f19166020018201604052801561473f576020820181803683370190505b509050815b85156147cc57614755600182615b6e565b90506000614764600a88615b3b565b61476f90600a615b4f565b6147799088615b6e565b614784906030615b16565b905060008160f81b9050808484815181106147a1576147a1615c58565b60200101906001600160f81b031916908160001a9053506147c3600a89615b3b565b97505050614744565b50949350505050565b816000806147e38482611ff0565b60125460455491925090610100900460ff16801561480057508115155b8015614819575060008281526043602052604090205415155b80156148c5575061482982612300565b600b54600084815260436020526040908190205490516331a9108f60e11b815260048101919091526001600160a01b039283169290911690636352211e9060240160206040518083038186803b15801561488257600080fd5b505afa158015614896573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906148ba919061521d565b6001600160a01b0316145b156148f657600082815260436020908152604080832054835260449091529020546148f39060ff1682615afe565b90505b614902856064836145c6565b15614a24578115614a24576001603760008282546149209190615afe565b925050819055506149358560646013546145c6565b15614969576000828152603660205260408120429055603a80546001929061495e908490615afe565b90915550614a249050565b61497282612300565b93506001603860008282546149879190615afe565b90915550506001600160a01b0384166000908152603b60205260409020546149f557603c80546001810182556000919091527fc6bb06cb7f92603de181bf256cd16846b93b752a170ff24824098b31aa008a7e0180546001600160a01b0319166001600160a01b0386161790555b6001600160a01b0384166000908152603b60205260408120805460019290614a1e908490615afe565b90915550505b6008546001600160a01b0316639dc29fac33614a3e6122b4565b6040516001600160e01b031960e085901b1681526001600160a01b0390921660048301526024820152604401600060405180830381600087803b158015614a8457600080fd5b505af1158015614a98573d6000803e3d6000fd5b5050506000868152604960205260408120805460ff19166001179055614ac49150859087908690614249565b6000858152604a602052604080822080546001600160a01b0319166001600160a01b0388811691909117909155600a549151631c72af8b60e21b8152600481018990529116906371cabe2c90602401602060405180830381600087803b158015614b2d57600080fd5b505af1158015614b41573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190614b659190615733565b600090815260486020526040902095909555505050505050565b611cc6828260405180602001604052806000815250614e5f565b6000818152600260205260408120546001600160a01b0316614c125760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401611863565b6000614c1d83612300565b9050806001600160a01b0316846001600160a01b03161480614c585750836001600160a01b0316614c4d846117ee565b6001600160a01b0316145b8061211e57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff1661211e565b826001600160a01b0316614c9f82612300565b6001600160a01b031614614d075760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401611863565b6001600160a01b038216614d695760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401611863565b614d746000826141db565b6001600160a01b0383166000908152600360205260408120805460019290614d9d908490615b6e565b90915550506001600160a01b0382166000908152600360205260408120805460019290614dcb908490615afe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b614e37848484614c8c565b614e4384848484614e92565b61335d5760405162461bcd60e51b815260040161186390615976565b614e698383614f9f565b614e766000848484614e92565b6119995760405162461bcd60e51b815260040161186390615976565b60006001600160a01b0384163b15614f9457604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290614ed6903390899088908890600401615866565b602060405180830381600087803b158015614ef057600080fd5b505af1925050508015614f20575060408051601f3d908101601f19168201909252614f1d918101906156ce565b60015b614f7a573d808015614f4e576040519150601f19603f3d011682016040523d82523d6000602084013e614f53565b606091505b508051614f725760405162461bcd60e51b815260040161186390615976565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061211e565b506001949350505050565b6001600160a01b038216614ff55760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401611863565b6000818152600260205260409020546001600160a01b03161561505a5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401611863565b6001600160a01b0382166000908152600360205260408120805460019290615083908490615afe565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b8280546150ed90615bc8565b90600052602060002090601f01602090048101928261510f5760008555615155565b82601f1061512857805160ff1916838001178555615155565b82800160010185558215615155579182015b8281111561515557825182559160200191906001019061513a565b5061516192915061517f565b5090565b5080546000825590600052602060002090810190611bd891905b5b808211156151615760008155600101615180565b60006001600160401b038311156151ad576151ad615c6e565b6151c0601f8401601f1916602001615aab565b90508281528383830111156151d457600080fd5b828260208301376000602084830101529392505050565b803580151581146151fb57600080fd5b919050565b60006020828403121561521257600080fd5b813561466581615c84565b60006020828403121561522f57600080fd5b815161466581615c84565b6000806040838503121561524d57600080fd5b823561525881615c84565b9150602083013561526881615c84565b809150509250929050565b6000806000806080858703121561528957600080fd5b843561529481615c84565b935060208501356152a481615c84565b925060408501356152b481615c84565b915060608501356152c481615c84565b939692955090935050565b6000806000606084860312156152e457600080fd5b83356152ef81615c84565b925060208401356152ff81615c84565b929592945050506040919091013590565b6000806000806080858703121561532657600080fd5b843561533181615c84565b9350602085013561534181615c84565b92506040850135915060608501356001600160401b0381111561536357600080fd5b8501601f8101871361537457600080fd5b61538387823560208401615194565b91505092959194509250565b600080604083850312156153a257600080fd5b82356153ad81615c84565b91506153bb602084016151eb565b90509250929050565b600080604083850312156153d757600080fd5b82356153e281615c84565b946020939093013593505050565b6000602080838503121561540357600080fd5b82356001600160401b0381111561541957600080fd5b8301601f8101851361542a57600080fd5b803561543d61543882615adb565b615aab565b80828252848201915084840188868560051b870101111561545d57600080fd5b600094505b8385101561548957803561547581615c84565b835260019490940193918501918501615462565b50979650505050505050565b600060208083850312156154a857600080fd5b82356001600160401b038111156154be57600080fd5b8301601f810185136154cf57600080fd5b80356154dd61543882615adb565b80828252848201915084840188868560051b87010111156154fd57600080fd5b600094505b83851015615489578035835260019490940193918501918501615502565b6000602080838503121561553357600080fd5b82516001600160401b0381111561554957600080fd5b8301601f8101851361555a57600080fd5b805161556861543882615adb565b80828252848201915084840188868560051b870101111561558857600080fd5b600094505b8385101561548957805183526001949094019391850191850161558d565b600060208083850312156155be57600080fd5b82516001600160401b038111156155d457600080fd5b8301601f810185136155e557600080fd5b80516155f361543882615adb565b80828252848201915084840188868560051b870101111561561357600080fd5b600094505b8385101561548957805161562b81615caf565b835260019490940193918501918501615618565b60006020828403121561565157600080fd5b614665826151eb565b6000806040838503121561566d57600080fd5b6153ad836151eb565b60006020828403121561568857600080fd5b5035919050565b600080604083850312156156a257600080fd5b50508035926020909101359150565b6000602082840312156156c357600080fd5b813561466581615c99565b6000602082840312156156e057600080fd5b815161466581615c99565b6000602082840312156156fd57600080fd5b81356001600160401b0381111561571357600080fd5b8201601f8101841361572457600080fd5b61211e84823560208401615194565b60006020828403121561574557600080fd5b5051919050565b6000806000806080858703121561576257600080fd5b84359350615772602086016151eb565b9250615780604086016151eb565b915061578e606086016151eb565b905092959194509250565b6000806000606084860312156157ae57600080fd5b505081359360208301359350604090920135919050565b600080604083850312156157d857600080fd5b82359150602083013561526881615caf565b60008151808452615802816020860160208601615b85565b601f01601f19169290920160200192915050565b60008451615828818460208901615b85565b84519083019061583c818360208901615b85565b602f60f81b91019081528351615859816001840160208801615b85565b0160010195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090615899908301846157ea565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156158e45783516001600160a01b0316835292840192918401916001016158bf565b50909695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156158e45783518352928401929184019160010161590c565b6020808252825182820181905260009190848201906040850190845b818110156158e457835160ff1683529284019291840191600101615944565b60208152600061466560208301846157ea565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252603a908201527f596f757220616d6f756e74206e6565647320746f20626520677265617465722060408201527f7468656e203020616e642063616e277420657863656564203130000000000000606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f191681016001600160401b0381118282101715615ad357615ad3615c6e565b604052919050565b60006001600160401b03821115615af457615af4615c6e565b5060051b60200190565b60008219821115615b1157615b11615c2c565b500190565b600060ff821660ff84168060ff03821115615b3357615b33615c2c565b019392505050565b600082615b4a57615b4a615c42565b500490565b6000816000190483118215151615615b6957615b69615c2c565b500290565b600082821015615b8057615b80615c2c565b500390565b60005b83811015615ba0578181015183820152602001615b88565b8381111561335d5750506000910152565b600081615bc057615bc0615c2c565b506000190190565b600181811c90821680615bdc57607f821691505b6020821081141561392e57634e487b7160e01b600052602260045260246000fd5b6000600019821415615c1157615c11615c2c565b5060010190565b600082615c2757615c27615c42565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b0381168114611bd857600080fd5b6001600160e01b031981168114611bd857600080fd5b60ff81168114611bd857600080fdfea2646970667358221220052a64755c3e3a7ebce240b9e0e5eedbe48fde761d683820ae6fb51f37add75864736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002568747470733a2f2f63646e2e6e6f756e646c65732e696f2f6d657461646174615f325f702f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _uri (string): https://cdn.noundles.io/metadata_2_p/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000025
Arg [2] : 68747470733a2f2f63646e2e6e6f756e646c65732e696f2f6d65746164617461
Arg [3] : 5f325f702f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

37594:32016:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42946:50;;;;;;;;;;-1:-1:-1;42946:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;30887:4:1;30875:17;;;30857:36;;30845:2;30830:18;42946:50:0;;;;;;;;24388:305;;;;;;;;;;-1:-1:-1;24388:305:0;;;;;:::i;:::-;;:::i;:::-;;;15783:14:1;;15776:22;15758:41;;15746:2;15731:18;24388:305:0;15618:187:1;40196:46:0;;;;;;;;;;;;;;;;;;;30679:25:1;;;30667:2;30652:18;40196:46:0;30533:177:1;25333:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26892:221::-;;;;;;;;;;-1:-1:-1;26892:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12549:32:1;;;12531:51;;12519:2;12504:18;26892:221:0;12385:203:1;26415:411:0;;;;;;;;;;-1:-1:-1;26415:411:0;;;;;:::i;:::-;;:::i;:::-;;39984:38;;;;;;;;;;;;;;;;47894:1006;;;:::i;66038:95::-;;;;;;;;;;-1:-1:-1;66038:95:0;;;;;:::i;:::-;;:::i;63388:103::-;;;;;;;;;;-1:-1:-1;63388:103:0;;;;;:::i;:::-;63452:7;63469:19;;;:9;:19;;;;;;;63388:103;43823:23;;;;;;;;;;-1:-1:-1;43823:23:0;;;;-1:-1:-1;;;;;43823:23:0;;;58306:239;;;;;;:::i;:::-;;:::i;44793:129::-;;;;;;;;;;-1:-1:-1;44793:129:0;;;;;:::i;:::-;-1:-1:-1;;;;;44885:29:0;44861:4;44885:29;;;:18;:29;;;;;;;;;44793:129;63014:102;;;;;;;;;;;;;:::i;39555:36::-;;;;;;;;;;;;;;;;42331:35;;;;;;;;;;-1:-1:-1;42331:35:0;;;;;:::i;:::-;;:::i;66537:979::-;;;;;;;;;;-1:-1:-1;66537:979:0;;;;;:::i;:::-;;:::i;43645:49::-;;;;;;;;;;-1:-1:-1;43645:49:0;;;;;:::i;:::-;;;;;;;;;;;;-1:-1:-1;;;;;43645:49:0;;;41601;;;;;;;;;;;;;;;;58605:713;;;;;;;;;;-1:-1:-1;58605:713:0;;;;;:::i;:::-;;:::i;39727:36::-;;;;;;;;;;;;;;;;43375:54;;;;;;;;;;-1:-1:-1;43375:54:0;;;;;:::i;:::-;;;;;;;;;;;;;;63497:135;;;;;;;;;;-1:-1:-1;63497:135:0;;;;;:::i;:::-;;:::i;43003:36::-;;;;;;;;;;-1:-1:-1;43003:36:0;;;;;;;;42058:41;;;;;;;;;;;;;;;;64809:82;;;;;;;;;;-1:-1:-1;64809:82:0;;;;;:::i;:::-;;:::i;37834:35::-;;;;;;;;;;-1:-1:-1;37834:35:0;;;;-1:-1:-1;;;;;37834:35:0;;;39446:28;;;;;;;;;;-1:-1:-1;39446:28:0;;;;;:::i;:::-;;:::i;39342:30::-;;;;;;;;;;-1:-1:-1;39342:30:0;;;;;:::i;:::-;;:::i;67524:1063::-;;;;;;;;;;-1:-1:-1;67524:1063:0;;;;;:::i;:::-;;:::i;38804:55::-;;;;;;;;;;;;38855:4;38804:55;;39052:54;;;;;;;;;;;;39103:3;39052:54;;65169:345;;;;;;;;;;-1:-1:-1;65169:345:0;;;;;:::i;:::-;;:::i;40029:38::-;;;;;;;;;;;;;;;;39641:36;;;;;;;;;;;;;;;;63686:74;;;;;;;;;;-1:-1:-1;63686:74:0;;;;;:::i;:::-;;:::i;41821:44::-;;;;;;;;;;;;;;;;43323:45;;;;;;;;;;-1:-1:-1;43323:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;63907:176;;;;;;;;;;-1:-1:-1;63907:176:0;;;;;:::i;:::-;;:::i;40602:31::-;;;;;;;;;;;;;;;;59843:366;;;;;;;;;;;;;:::i;40414:36::-;;;;;;;;;;;;;;;;25027:239;;;;;;;;;;-1:-1:-1;25027:239:0;;;;;:::i;:::-;;:::i;41770:44::-;;;;;;;;;;;;;;;;41939:40;;;;;;;;;;;;;;;;64995:116;;;;;;;;;;-1:-1:-1;64995:116:0;;;;;:::i;:::-;;:::i;39481:29::-;;;;;;;;;;-1:-1:-1;39481:29:0;;;;;:::i;:::-;;:::i;65672:215::-;;;;;;;;;;-1:-1:-1;65672:215:0;;;;;:::i;:::-;;:::i;24757:208::-;;;;;;;;;;-1:-1:-1;24757:208:0;;;;;:::i;:::-;;:::i;42621:50::-;;;;;;;;;;-1:-1:-1;42621:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;6023:94;;;;;;;;;;;;;:::i;42154:41::-;;;;;;;;;;;;;;;;37924:34;;;;;;;;;;-1:-1:-1;37924:34:0;;;;-1:-1:-1;;;;;37924:34:0;;;58149:149;;;;;;;;;;-1:-1:-1;58149:149:0;;;;;:::i;:::-;;:::i;43048:33::-;;;;;;;;;;-1:-1:-1;43048:33:0;;;;;;;;;;;64142:144;;;;;;;;;;-1:-1:-1;64142:144:0;;;;;:::i;:::-;;:::i;44505:232::-;;;;;;;;;;-1:-1:-1;44505:232:0;;;;;:::i;:::-;;:::i;43853:23::-;;;;;;;;;;-1:-1:-1;43853:23:0;;;;-1:-1:-1;;;;;43853:23:0;;;53605:1372;;;;;;:::i;:::-;;:::i;62148:105::-;;;;;;;;;;-1:-1:-1;62148:105:0;;;;;:::i;:::-;-1:-1:-1;;;;;62229:22:0;62212:7;62229:22;;;:16;:22;;;;;;;62148:105;41461:30;;;;;;;;;;;;;;;;40564:31;;;;;;;;;;;;;;;;39849:38;;;;;;;;;;;;;;;;5372:87;;;;;;;;;;-1:-1:-1;5445:6:0;;-1:-1:-1;;;;;5445:6:0;5372:87;;37876:41;;;;;;;;;;-1:-1:-1;37876:41:0;;;;-1:-1:-1;;;;;37876:41:0;;;40371:36;;;;;;;;;;;;;;;;25502:104;;;;;;;;;;;;;:::i;59326:144::-;;;;;;;;;;-1:-1:-1;59326:144:0;;;;;:::i;:::-;;:::i;55859:1716::-;;;;;;:::i;:::-;;:::i;40888:45::-;;;;;;;;;;-1:-1:-1;40888:45:0;;;;;;;;57655:451;;;;;;:::i;:::-;;:::i;62679:329::-;;;;;;;;;;-1:-1:-1;62679:329:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;27185:295::-;;;;;;;;;;-1:-1:-1;27185:295:0;;;;;:::i;:::-;;:::i;42820:59::-;;;;;;;;;;-1:-1:-1;42820:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;41550:44;;;;;;;;;;-1:-1:-1;41550:44:0;;;;;;;;64566:235;;;;;;;;;;-1:-1:-1;64566:235:0;;;;;:::i;:::-;;:::i;41896:36::-;;;;;;;;;;;;;;;;42489:47;;;;;;;;;;-1:-1:-1;42489:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;38741:56;;;;;;;;;;;;38792:5;38741:56;;42886:53;;;;;;;;;;-1:-1:-1;42886:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;68595:1012;;;;;;;;;;-1:-1:-1;68595:1012:0;;;;;:::i;:::-;;:::i;60302:585::-;;;;;;;;;;-1:-1:-1;60302:585:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;63770:129::-;;;;;;;;;;-1:-1:-1;63770:129:0;;;;;:::i;:::-;;:::i;39939:38::-;;;;;;;;;;;;;;;;62050:92;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;43531:47::-;;;;;;;;;;-1:-1:-1;43531:47:0;;;;;:::i;:::-;;;;;;;;;;;;;;40526:31;;;;;;;;;;;;;;;;39684:36;;;;;;;;;;;;;;;;38990:55;;;;;;;;;;;;39041:4;38990:55;;53320:239;;;;;;;;;;-1:-1:-1;53320:239:0;;;;;:::i;:::-;;:::i;45275:131::-;;;;;;;;;;-1:-1:-1;45275:131:0;;;;;:::i;:::-;-1:-1:-1;;;;;45367:31:0;45343:4;45367:31;;;:20;:31;;;;;;;;;45275:131;46894:960;;;;;;;;;;-1:-1:-1;46894:960:0;;;;;:::i;:::-;;:::i;66176:353::-;;;;;;;;;;-1:-1:-1;66176:353:0;;;;;:::i;:::-;;:::i;42678:50::-;;;;;;;;;;-1:-1:-1;42678:50:0;;;;;:::i;:::-;;;;;;;;;;;;;;;60971:404;;;;;;;;;;;;;:::i;64369:189::-;;;;;;;;;;-1:-1:-1;64369:189:0;;;;;:::i;:::-;;:::i;43701:45::-;;;;;;;;;;-1:-1:-1;43701:45:0;;;;;;;;43585:53;;;;;;;;;;-1:-1:-1;43585:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;55056:765;;;;;;:::i;:::-;;:::i;41713:50::-;;;;;;;;;;;;;;;;62259:295;;;;;;;;;;;;;:::i;39411:28::-;;;;;;;;;;-1:-1:-1;39411:28:0;;;;;:::i;:::-;;:::i;39598:36::-;;;;;;;;;;;;;;;;41657:49;;;;;;;;;;;;;;;;41986:45;;;;;;;;;;-1:-1:-1;41986:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;39235:55;;;;;;;;;;;;39286:4;39235:55;;64897:92;;;;;;;;;;-1:-1:-1;64897:92:0;;;;;:::i;:::-;;:::i;63251:131::-;;;;;;;;;;-1:-1:-1;63251:131:0;;;;;:::i;:::-;63330:4;63344:35;;;:25;:35;;;;;;;;;63251:131;48942:941;;;:::i;63122:123::-;;;;;;;;;;-1:-1:-1;63122:123:0;;;;;:::i;:::-;63197:4;63211:31;;;:21;:31;;;;;;;;;63122:123;27551:164;;;;;;;;;;-1:-1:-1;27551:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;27672:25:0;;;27648:4;27672:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27551:164;39770:35;;;;;;;;;;;;;;;;65895:135;;;;;;;;;;-1:-1:-1;65895:135:0;;;;;:::i;:::-;;:::i;42106:41::-;;;;;;;;;;;;;;;;39379:25;;;;;;;;;;-1:-1:-1;39379:25:0;;;;;:::i;:::-;;:::i;40249:46::-;;;;;;;;;;;;;;;;39894:38;;;;;;;;;;;;;;;;42430:52;;;;;;;;;;-1:-1:-1;42430:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;41424:30;;;;;;;;;;;;;;;;6272:192;;;;;;;;;;-1:-1:-1;6272:192:0;;;;;:::i;:::-;;:::i;42202:41::-;;;;;;;;;;;;;;;;42735:51;;;;;;;;;;-1:-1:-1;42735:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;52126:1106;;;;;;;;;;-1:-1:-1;52126:1106:0;;;;;:::i;:::-;;:::i;37794:33::-;;;;;;;;;;-1:-1:-1;37794:33:0;;;;-1:-1:-1;;;;;37794:33:0;;;42272:52;;;;;;;;;;-1:-1:-1;42272:52:0;;;;;:::i;:::-;;;;;;;;;;;;;;44985:234;;;;;;;;;;-1:-1:-1;44985:234:0;;;;;:::i;:::-;;:::i;24388:305::-;24490:4;-1:-1:-1;;;;;;24527:40:0;;-1:-1:-1;;;24527:40:0;;:105;;-1:-1:-1;;;;;;;24584:48:0;;-1:-1:-1;;;24584:48:0;24527:105;:158;;;-1:-1:-1;;;;;;;;;;17467:40:0;;;24649:36;24507:178;24388:305;-1:-1:-1;;24388:305:0:o;25333:100::-;25387:13;25420:5;25413:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25333:100;:::o;26892:221::-;26968:7;30375:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30375:16:0;26988:73;;;;-1:-1:-1;;;26988:73:0;;25720:2:1;26988:73:0;;;25702:21:1;25759:2;25739:18;;;25732:30;25798:34;25778:18;;;25771:62;-1:-1:-1;;;25849:18:1;;;25842:42;25901:19;;26988:73:0;;;;;;;;;-1:-1:-1;27081:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27081:24:0;;26892:221::o;26415:411::-;26496:13;26512:23;26527:7;26512:14;:23::i;:::-;26496:39;;26560:5;-1:-1:-1;;;;;26554:11:0;:2;-1:-1:-1;;;;;26554:11:0;;;26546:57;;;;-1:-1:-1;;;26546:57:0;;27723:2:1;26546:57:0;;;27705:21:1;27762:2;27742:18;;;27735:30;27801:34;27781:18;;;27774:62;-1:-1:-1;;;27852:18:1;;;27845:31;27893:19;;26546:57:0;27521:397:1;26546:57:0;4240:10;-1:-1:-1;;;;;26638:21:0;;;;:62;;-1:-1:-1;26663:37:0;26680:5;4240:10;27551:164;:::i;26663:37::-;26616:168;;;;-1:-1:-1;;;26616:168:0;;23069:2:1;26616:168:0;;;23051:21:1;23108:2;23088:18;;;23081:30;23147:34;23127:18;;;23120:62;23218:26;23198:18;;;23191:54;23262:19;;26616:168:0;22867:420:1;26616:168:0;26797:21;26806:2;26810:7;26797:8;:21::i;:::-;26485:341;26415:411;;:::o;47894:1006::-;43954:11;;43935:15;:30;;:49;;;;;43983:1;43969:11;;:15;43935:49;43927:86;;;;-1:-1:-1;;;43927:86:0;;30382:2:1;43927:86:0;;;30364:21:1;30421:2;30401:18;;;30394:30;-1:-1:-1;;;30440:18:1;;;30433:54;30504:18;;43927:86:0;30180:348:1;43927:86:0;47966:18:::1;47987:26;:16;964:14:::0;;872:114;47987:26:::1;47966:47;;38917:4;48080:15;;48098:1;48080:19;;;;:::i;:::-;:42;;48072:87;;;::::0;-1:-1:-1;;;48072:87:0;;18766:2:1;48072:87:0::1;::::0;::::1;18748:21:1::0;18805:2;18785:18;;;18778:30;18844:32;18824:18;;;18817:60;18894:18;;48072:87:0::1;18564:354:1::0;48072:87:0::1;48197:10;48178:30;::::0;;;:18:::1;:30;::::0;;;;;::::1;;48170:81;;;::::0;-1:-1:-1;;;48170:81:0;;24669:2:1;48170:81:0::1;::::0;::::1;24651:21:1::0;24708:2;24688:18;;;24681:30;-1:-1:-1;;;24727:18:1;;;24720:54;24791:18;;48170:81:0::1;24467:348:1::0;48170:81:0::1;48288:10;48270:29;::::0;;;:17:::1;:29;::::0;;;;;::::1;;:38;48262:94;;;::::0;-1:-1:-1;;;48262:94:0;;19125:2:1;48262:94:0::1;::::0;::::1;19107:21:1::0;19164:2;19144:18;;;19137:30;19203:34;19183:18;;;19176:62;-1:-1:-1;;;19254:18:1;;;19247:35;19299:19;;48262:94:0::1;18923:401:1::0;48262:94:0::1;48594:8;::::0;48620:20:::1;::::0;48594:47:::1;::::0;-1:-1:-1;;;48594:47:0;;48608:10:::1;48594:47;::::0;::::1;13569:51:1::0;13636:18;;;13629:34;;;;-1:-1:-1;;;;;48594:8:0;;::::1;::::0;:13:::1;::::0;13542:18:1;;48594:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;48720:10:0::1;48702:29;::::0;;;:17:::1;:29;::::0;;;;:36;;-1:-1:-1;;48702:36:0::1;48734:4;48702:36:::0;;::::1;::::0;;;48791:15:::1;:20:::0;;48734:4;;-1:-1:-1;48791:15:0;-1:-1:-1;48791:20:0::1;::::0;48734:4;;48791:20:::1;:::i;:::-;::::0;;;-1:-1:-1;48845:47:0::1;::::0;-1:-1:-1;48860:10:0::1;48872::::0;48884:1:::1;::::0;48845:14:::1;:47::i;:::-;47955:945;47894:1006::o:0;66038:95::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;66098:25:::1;:32:::0;;-1:-1:-1;;66098:32:0::1;::::0;::::1;;::::0;;;::::1;::::0;;66038:95::o;58306:239::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;58384:17:::1;58404:15;58416:3;58404:9:::0;:15:::1;:::i;:::-;58448:8;::::0;58384:35;;-1:-1:-1;;;;;;58448:8:0::1;58440:38;58463:14;58384:35:::0;58475:2:::1;58463:14;:::i;:::-;58440:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;58432:47;;;::::0;::::1;;58506:8;::::0;-1:-1:-1;;;;;58506:8:0::1;58498:38;58521:14;:9:::0;58533:2:::1;58521:14;:::i;:::-;58498:38;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;;;;;;::::1;;;;;;58490:47;;;::::0;::::1;;58373:172;58306:239:::0;:::o;63014:102::-;63058:4;63082:26;:16;964:14;;872:114;63082:26;63075:33;;63014:102;:::o;42331:35::-;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;42331:35:0;;-1:-1:-1;42331:35:0;:::o;66537:979::-;66706:25;;;;;:64;;-1:-1:-1;66735:26:0;;;;:17;:26;;;;;;;;:35;66706:64;66698:102;;;;-1:-1:-1;;;66698:102:0;;28125:2:1;66698:102:0;;;28107:21:1;28164:2;28144:18;;;28137:30;-1:-1:-1;;;28183:18:1;;;28176:55;28248:18;;66698:102:0;27923:349:1;66698:102:0;66813:8;;:33;;-1:-1:-1;;;66813:33:0;;-1:-1:-1;;;;;12823:15:1;;;66813:33:0;;;12805:34:1;12875:15;;;12855:18;;;12848:43;66813:8:0;;;;:23;;12740:18:1;;66813:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;66863:20:0;;;;:11;:20;;;;;;;;:25;66859:599;;-1:-1:-1;66859:599:0;;-1:-1:-1;;;;;66905:22:0;;;;;;:16;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;66944:20:0;;;;;;:16;:20;;;;;:22;;;;;;:::i;:::-;;;;;;66859:599;;;66988:20;;;;:11;:20;;;;;;;;;:25;66984:474;;;-1:-1:-1;;;;;67030:17:0;;;;;;:11;:17;;;;;:19;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;67064:15:0;;;;;;:11;:15;;;;;:17;;;;;;:::i;66984:474::-;67103:20;;;;:11;:20;;;;;;;;67127:1;67103:25;67099:359;;;-1:-1:-1;;;;;67145:20:0;;;;;;:14;:20;;;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;67182:18:0;;;;;;:14;:18;;;;;:20;;;;;;:::i;67099:359::-;67224:20;;;;:11;:20;;;;;;;;67248:1;67224:25;67220:238;;;-1:-1:-1;;;;;67266:20:0;;;;;;:14;:20;;;;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;67303:18:0;;;;;;:14;:18;;;;;;:20;;;;;;:::i;67220:238::-;67345:20;;;;:11;:20;;;;;;;;67369:1;67345:25;67341:117;;;-1:-1:-1;;;;;67387:21:0;;;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;67425:19:0;;;;;;:15;:19;;;;;:21;;;;;;:::i;:::-;;;;;;67341:117;67470:38;67490:4;67496:2;67500:7;67470:19;:38::i;58605:713::-;58754:8;:15;58680:7;;58751:59;;-1:-1:-1;58797:1:0;58790:8;;58751:59;58884:8;:15;58846:12;;:35;;-1:-1:-1;;;58846:35:0;;;;;30679:25:1;;;58822:21:0;;58884:15;-1:-1:-1;;;;;58846:12:0;;:28;;30652:18:1;;58846:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:53;;;;:::i;:::-;58822:77;;58998:15;58985:10;;58948:9;:34;58958:8;58967:13;58958:23;;;;;;;;:::i;:::-;;;;;;;;;58948:34;;;;;;;;;;;;:47;;;;:::i;:::-;:65;58945:126;;;59036:8;59045:13;59036:23;;;;;;;;:::i;:::-;;;;;;;;;59029:30;;;;;58945:126;59157:2;59149:5;:10;59146:49;;;59182:1;59175:8;;;;;59146:49;59272:38;59293:5;59300:9;:5;59308:1;59300:9;:::i;59272:38::-;59265:45;58605:713;-1:-1:-1;;;;58605:713:0:o;63497:135::-;63600:10;;63563:4;63578:19;;;:9;:19;;;;;;63563:4;;63613:15;;63578:32;;63600:10;63578:32;:::i;:::-;:50;;63497:135;-1:-1:-1;;63497:135:0:o;64809:82::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;64868:10:::1;:20:::0;64809:82::o;39446:28::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39446:28:0;:::o;39342:30::-;;;;;;;;;;;;67524:1063;68540:39;68557:4;68563:2;68567:7;68540:39;;;;;;;;;;;;:16;:39::i;65169:345::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;65297:9:::1;:43:::0;;-1:-1:-1;;;;;65297:43:0;;::::1;-1:-1:-1::0;;;;;;65297:43:0;;::::1;;::::0;;;65351:10:::1;:43:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;65405:12:::1;:48:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;65464:8:::1;:42:::0;;;;;::::1;::::0;::::1;;::::0;;65169:345::o;63686:74::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;63744:13;;::::1;::::0;:7:::1;::::0;:13:::1;::::0;::::1;::::0;::::1;:::i;63907:176::-:0;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;63998:20:::1;:33:::0;;;;64042:20:::1;:33:::0;63907:176::o;59843:366::-;59897:7;59919:13;39286:4;59957:13;;59935:19;;:35;;;;:::i;:::-;:53;;;;:::i;:::-;59919:69;;60013:10;;60004:5;:19;60001:76;;-1:-1:-1;;60046:19:0;;;59843:366::o;60001:76::-;60099:10;;60090:5;:19;60087:76;;-1:-1:-1;;60132:19:0;;;59843:366::o;60087:76::-;-1:-1:-1;;60182:19:0;;;59843:366::o;25027:239::-;25099:7;25135:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25135:16:0;25170:19;25162:73;;;;-1:-1:-1;;;25162:73:0;;24259:2:1;25162:73:0;;;24241:21:1;24298:2;24278:18;;;24271:30;24337:34;24317:18;;;24310:62;-1:-1:-1;;;24388:18:1;;;24381:39;24437:19;;25162:73:0;24057:405:1;64995:116:0;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;65079:19:::1;::::0;;;:9:::1;:19;::::0;;;;;:29;64995:116::o;39481:29::-;;;;;;;;;;;;65672:215;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;65776:19:::1;:27:::0;;;;65814:19:::1;:27:::0;65852:19:::1;:27:::0;65672:215::o;24757:208::-;24829:7;-1:-1:-1;;;;;24857:19:0;;24849:74;;;;-1:-1:-1;;;24849:74:0;;23848:2:1;24849:74:0;;;23830:21:1;23887:2;23867:18;;;23860:30;23926:34;23906:18;;;23899:62;-1:-1:-1;;;23977:18:1;;;23970:40;24027:19;;24849:74:0;23646:406:1;24849:74:0;-1:-1:-1;;;;;;24941:16:0;;;;;:9;:16;;;;;;;24757:208::o;6023:94::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;6088:21:::1;6106:1;6088:9;:21::i;:::-;6023:94::o:0;58149:149::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;58244:9:::1;58254:1;58244:12;;;;;;;;:::i;:::-;;;;;;;58233:8;;:23;;;;;-1:-1:-1::0;;;;;58233:23:0::1;;;;;-1:-1:-1::0;;;;;58233:23:0::1;;;;;;58278:9;58288:1;58278:12;;;;;;;;:::i;:::-;;;;;;;58267:8;;:23;;;;;-1:-1:-1::0;;;;;58267:23:0::1;;;;;-1:-1:-1::0;;;;;58267:23:0::1;;;;;;58149:149:::0;:::o;64142:144::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;64217:16:::1;:21:::0;;;::::1;;-1:-1:-1::0;;64217:21:0;;::::1;;::::0;;64249::::1;:29:::0;;;::::1;;::::0;;;::::1;;::::0;;64142:144::o;44505:232::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;44592:18:::1;44587:143;44624:9;:16;44611:10;:29;44587:143;;;44714:4;44670:18;:41;44689:9;44699:10;44689:21;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;44670:41:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;44670:41:0;:48;;-1:-1:-1;;44670:48:0::1;::::0;::::1;;::::0;;;::::1;::::0;;44641:12;::::1;::::0;::::1;:::i;:::-;;;;44587:143;;53605:1372:::0;53694:16;;;;53686:53;;;;-1:-1:-1;;;53686:53:0;;17176:2:1;53686:53:0;;;17158:21:1;17215:2;17195:18;;;17188:30;17254:26;17234:18;;;17227:54;17298:18;;53686:53:0;16974:348:1;53686:53:0;53752:18;53773:26;:16;964:14;;872:114;53773:26;53898:10;;:36;;-1:-1:-1;;;53898:36:0;;53752:47;;-1:-1:-1;53870:25:0;;-1:-1:-1;;;;;53898:10:0;;;;:28;;:36;;53927:6;;53898:36;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;53898:36:0;;;;;;;;;;;;:::i;:::-;53870:64;;53947:14;54032:9;54028:942;54051:6;:13;54047:1;:17;54028:942;;;54150:23;:34;54174:6;54181:1;54174:9;;;;;;;;:::i;:::-;;;;;;;;;;;;54150:34;;;;;;;;;;-1:-1:-1;54150:34:0;;;;54147:81;;;54204:8;;54147:81;54295:10;;54314:9;;54328:10;;-1:-1:-1;;;;;54295:10:0;;:18;;54314:6;;54321:1;;54314:9;;;;;;:::i;:::-;;;;;;;54295:29;;;;;;;;;;;;;30679:25:1;;30667:2;30652:18;;30533:177;54295:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;54295:43:0;;54292:90;;54358:8;;54292:90;54480:4;54443:23;:34;54467:6;54474:1;54467:9;;;;;;;;:::i;:::-;;;;;;;54443:34;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;54526:68;54541:10;54566:6;54553:10;:19;;;;:::i;:::-;54574:10;54585:1;54574:13;;;;;;;;:::i;:::-;;;;;;;54589:4;54526:14;:68::i;:::-;54614:10;54625:1;54614:13;;;;;;;;:::i;:::-;;;;;;;:18;;54631:1;54614:18;54611:323;;;54693:6;54700:1;54693:9;;;;;;;;:::i;:::-;;;;;;;54652:17;:38;54683:6;54670:10;:19;;;;:::i;:::-;54652:38;;;;;;;;;;;-1:-1:-1;54652:38:0;:50;54726:43;54740:19;54753:6;54740:10;:19;:::i;:::-;54761:3;54766:2;54726:13;:43::i;:::-;54723:196;;;54821:1;54793:14;:25;54808:6;54815:1;54808:9;;;;;;;;:::i;:::-;;;;;;;54793:25;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54723:196;;;54898:1;54870:14;:25;54885:6;54892:1;54885:9;;;;;;;;:::i;:::-;;;;;;;54870:25;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54723:196;54950:8;;;;:::i;:::-;;;;54028:942;54066:6;54071:1;54066:6;;:::i;:::-;;;54028:942;;;;53673:1304;;;53605:1372;:::o;25502:104::-;25558:13;25591:7;25584:14;;;;;:::i;59326:144::-;59396:7;59423:39;59431:30;59452:5;59459:1;59431:20;:30::i;55859:1716::-;44108:11;;44089:15;:30;;:49;;;;;44137:1;44123:11;;:15;44089:49;44081:86;;;;-1:-1:-1;;;44081:86:0;;29614:2:1;44081:86:0;;;29596:21:1;29653:2;29633:18;;;29626:30;29692:26;29672:18;;;29665:54;29736:18;;44081:86:0;29412:348:1;44081:86:0;55954:18:::1;55975:26;:16;964:14:::0;;872:114;55975:26:::1;55954:47;;56052:1;56040:9;:13;:32;;;;;56070:2;56057:9;:15;;56040:32;56032:103;;;;-1:-1:-1::0;;;56032:103:0::1;;;;;;;:::i;:::-;39041:4;56214:10;56193:17;;56174:16;;56155;;:35;;;;:::i;:::-;:55;;;;:::i;:::-;56154:70;;;;:::i;:::-;:93;;56146:148;;;::::0;-1:-1:-1;;;56146:148:0;;17529:2:1;56146:148:0::1;::::0;::::1;17511:21:1::0;17568:2;17548:18;;;17541:30;17607:34;17587:18;;;17580:62;-1:-1:-1;;;17658:18:1;;;17651:40;17708:19;;56146:148:0::1;17327:406:1::0;56146:148:0::1;56395:9;::::0;:43:::1;::::0;-1:-1:-1;;;56395:43:0;;56427:10:::1;56395:43;::::0;::::1;12531:51:1::0;56360:32:0::1;::::0;-1:-1:-1;;;;;56395:9:0::1;::::0;:31:::1;::::0;12504:18:1;;56395:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;56395:43:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;56360:78;;56451:14;56533:13:::0;56528:1040:::1;56557:15;:22;56549:5;:30;56548:54;;;;;56593:9;56584:6;:18;56548:54;56528:1040;;;56687:25;:49;56713:15;56729:5;56713:22;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;56687:49;;;::::1;::::0;;;;;;-1:-1:-1;56687:49:0;;::::1;;56684:96;;;56756:8;;56684:96;56810:1;56875:104;56889:19;56902:6:::0;56889:10;:19:::1;:::i;:::-;56945:15;;56928:14;;56911;;:31;;;;:::i;:::-;:49;;;;:::i;:::-;56963:15;;56875:13;:104::i;:::-;56872:308;;;-1:-1:-1::0;57007:1:0::1;56872:308;;;57032:103;57046:19;57059:6:::0;57046:10;:19:::1;:::i;:::-;57102:15;;57085:14;;57068;;:31;;;;:::i;:::-;:49;;;;:::i;:::-;57120:14;;57032:13;:103::i;:::-;57029:151;;;-1:-1:-1::0;57163:1:0::1;57029:151;57231:8;::::0;57257:20:::1;::::0;57231:47:::1;::::0;-1:-1:-1;;;57231:47:0;;57245:10:::1;57231:47;::::0;::::1;13569:51:1::0;13636:18;;;13629:34;;;;-1:-1:-1;;;;;57231:8:0;;::::1;::::0;:13:::1;::::0;13542:18:1;;57231:47:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;57382:4;57330:25;:49;57356:15;57372:5;57356:22;;;;;;;;:::i;:::-;;;;;;;57330:49;;;;;;;;;;;;:56;;;;;;;;;;;;;;;;;;57428:61;57443:10;57469:6;57456:10;:19;;;;:::i;:::-;57477:5;57484:4;57428:14;:61::i;:::-;57545:11;57555:1;57545:11:::0;::::1;:::i;:::-;;;56615:953;56528:1040;56604:10;56613:1;56604:10:::0;::::1;:::i;:::-;;;56528:1040;;57655:451:::0;44249:21;;;;44241:65;;;;-1:-1:-1;;;44241:65:0;;20299:2:1;44241:65:0;;;20281:21:1;20338:2;20318:18;;;20311:30;20377:33;20357:18;;;20350:61;20428:18;;44241:65:0;20097:355:1;44241:65:0;57809:21:::1;::::0;;;:11:::1;:21;::::0;;;;;::::1;;::::0;:26:::1;57801:73;;;::::0;-1:-1:-1;;;57801:73:0;;22253:2:1;57801:73:0::1;::::0;::::1;22235:21:1::0;22292:2;22272:18;;;22265:30;22331:34;22311:18;;;22304:62;-1:-1:-1;;;22382:18:1;;;22375:32;22424:19;;57801:73:0::1;22051:398:1::0;57801:73:0::1;57937:8;::::0;57963:12:::1;::::0;57937:39:::1;::::0;-1:-1:-1;;;57937:39:0;;57951:10:::1;57937:39;::::0;::::1;13569:51:1::0;13636:18;;;13629:34;;;;-1:-1:-1;;;;;57937:8:0;;::::1;::::0;:13:::1;::::0;13542:18:1;;57937:39:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;;58022:19:0::1;::::0;;;:9:::1;:19;::::0;;;;58044:1:::1;58022:23:::0;;;;58082:11:::1;:16:::0;;58044:1;;-1:-1:-1;58082:11:0;58022:19;58082:16:::1;::::0;58044:1;;58082:16:::1;:::i;:::-;::::0;;;-1:-1:-1;;;57655:451:0:o;62679:329::-;62755:14;62782:21;62818:8;:15;-1:-1:-1;;;;;62806:28:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62806:28:0;;62782:52;;62852:13;62847:128;62875:8;:15;62867:5;:23;62847:128;;;62935:11;:28;62947:8;62956:5;62947:15;;;;;;;;:::i;:::-;;;;;;;62935:28;;;;;;;;;;;;;;;;;;;;;62919:6;62926:5;62919:13;;;;;;;;:::i;:::-;:44;;;;:13;;;;;;;;;;;:44;62892:10;62901:1;62892:10;;:::i;:::-;;;62847:128;;;-1:-1:-1;62994:6:0;62679:329;-1:-1:-1;;62679:329:0:o;27185:295::-;-1:-1:-1;;;;;27288:24:0;;4240:10;27288:24;;27280:62;;;;-1:-1:-1;;;27280:62:0;;21064:2:1;27280:62:0;;;21046:21:1;21103:2;21083:18;;;21076:30;21142:27;21122:18;;;21115:55;21187:18;;27280:62:0;20862:349:1;27280:62:0;4240:10;27355:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;27355:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;27355:53:0;;;;;;;;;;27424:48;;15758:41:1;;;27355:42:0;;4240:10;27424:48;;15731:18:1;27424:48:0;;;;;;;27185:295;;:::o;64566:235::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;64689:11:::1;:27:::0;;;;64727:11:::1;:27:::0;64765:12:::1;:28:::0;64566:235::o;68595:1012::-;68787:25;;;;;:64;;-1:-1:-1;68816:26:0;;;;:17;:26;;;;;;;;:35;68787:64;68779:102;;;;-1:-1:-1;;;68779:102:0;;28125:2:1;68779:102:0;;;28107:21:1;28164:2;28144:18;;;28137:30;-1:-1:-1;;;28183:18:1;;;28176:55;28248:18;;68779:102:0;27923:349:1;68779:102:0;68894:8;;:33;;-1:-1:-1;;;68894:33:0;;-1:-1:-1;;;;;12823:15:1;;;68894:33:0;;;12805:34:1;12875:15;;;12855:18;;;12848:43;68894:8:0;;;;:23;;12740:18:1;;68894:33:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;68944:20:0;;;;:11;:20;;;;;;;;:25;68940:599;;-1:-1:-1;68940:599:0;;-1:-1:-1;;;;;68986:22:0;;;;;;:16;:22;;;;;:24;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;69025:20:0;;;;;;:16;:20;;;;;:22;;;;;;:::i;:::-;;;;;;68940:599;;;69069:20;;;;:11;:20;;;;;;;;;:25;69065:474;;;-1:-1:-1;;;;;69111:17:0;;;;;;:11;:17;;;;;:19;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;69145:15:0;;;;;;:11;:15;;;;;:17;;;;;;:::i;69065:474::-;69184:20;;;;:11;:20;;;;;;;;69208:1;69184:25;69180:359;;;-1:-1:-1;;;;;69226:20:0;;;;;;:14;:20;;;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;69263:18:0;;;;;;:14;:18;;;;;:20;;;;;;:::i;69180:359::-;69305:20;;;;:11;:20;;;;;;;;69329:1;69305:25;69301:238;;;-1:-1:-1;;;;;69347:20:0;;;;;;:14;:20;;;;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;69384:18:0;;;;;;:14;:18;;;;;;:20;;;;;;:::i;69301:238::-;69426:20;;;;:11;:20;;;;;;;;69450:1;69426:25;69422:117;;;-1:-1:-1;;;;;69468:21:0;;;;;;:15;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;69506:19:0;;;;;;:15;:19;;;;;:21;;;;;;:::i;:::-;;;;;;69422:117;69551:48;69575:4;69581:2;69585:7;69594:4;69551:23;:48::i;:::-;68595:1012;;;;:::o;60302:585::-;60375:16;60404:18;60425:20;60435:9;60425;:20::i;:::-;60404:41;;60458:28;60503:10;-1:-1:-1;;;;;60489:25:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60489:25:0;;60458:56;;60527:14;60563:9;60558:291;60584:10;60575:6;:19;60574:55;;;;-1:-1:-1;60603:16:0;964:14;60599:1;:30;60574:55;60558:291;;;60668:9;-1:-1:-1;;;;;60654:23:0;:10;60662:1;60654:7;:10::i;:::-;-1:-1:-1;;;;;60654:23:0;;60651:187;;;60791:1;60769:11;60781:6;60769:19;;;;;;;;:::i;:::-;;;;;;;;;;:23;60811:11;60821:1;60811:11;;:::i;:::-;;;60651:187;60631:3;;;;:::i;:::-;;;;60558:291;;;-1:-1:-1;60868:11:0;;60302:585;-1:-1:-1;;;;60302:585:0:o;63770:129::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;63846:11:::1;:17:::0;;;;63874:11:::1;:17:::0;63770:129::o;62050:92::-;62097:16;62123:17;62116:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;62116:24:0;;;;;;;;;;;;;;;;;;;;;;62050:92;:::o;53320:239::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;53431:23:::1;::::0;;;:17:::1;:23;::::0;;;;;:33;;;::::1;;-1:-1:-1::0;;53431:33:0;;::::1;;::::0;;53475:25:::1;:33:::0;;;::::1;;::::0;;;::::1;;::::0;;53519:14:::1;:32:::0;;;::::1;;53431:33;53519:32;-1:-1:-1::0;;53519:32:0;;::::1;::::0;;;::::1;::::0;;53320:239::o;46894:960::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;47038:10:::1;::::0;::::1;47034:383;;39225:3;47088:7;47073:12;;:22;;;;:::i;:::-;:43;;47065:87;;;::::0;-1:-1:-1;;;47065:87:0;;28479:2:1;47065:87:0::1;::::0;::::1;28461:21:1::0;28518:2;28498:18;;;28491:30;28557:33;28537:18;;;28530:61;28608:18;;47065:87:0::1;28277:355:1::0;47065:87:0::1;47034:383;;;47174:5;:10;;47183:1;47174:10;47170:247;;;39103:3;47224:7;47209:12;;:22;;;;:::i;:::-;:43;;47201:90;;;::::0;-1:-1:-1;;;47201:90:0;;27320:2:1;47201:90:0::1;::::0;::::1;27302:21:1::0;27359:2;27339:18;;;27332:30;27398:34;27378:18;;;27371:62;-1:-1:-1;;;27449:18:1;;;27442:32;27491:19;;47201:90:0::1;27118:398:1::0;47170:247:0::1;39164:3;47347:7;47332:12;;:22;;;;:::i;:::-;:43;;47324:81;;;::::0;-1:-1:-1;;;47324:81:0;;23494:2:1;47324:81:0::1;::::0;::::1;23476:21:1::0;23533:2;23513:18;;;23506:30;23572:27;23552:18;;;23545:55;23617:18;;47324:81:0::1;23292:349:1::0;47324:81:0::1;47429:11;47443:26;:16;964:14:::0;;872:114;47443:26:::1;47429:40;;47536:9;47531:316;47551:7;47547:1;:11;47531:316;;;47580:48;47595:10;47607:7;47613:1:::0;47607:3;:7:::1;:::i;:::-;47616:5;47623:4;47580:14;:48::i;:::-;47649:10;::::0;::::1;47645:191;;47680:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;47645:191;;;47720:5;:10;;47729:1;47720:10;47716:120;;;47751:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;47716:120::-;47806:12;:14:::0;;;:12:::1;:14;::::0;::::1;:::i;:::-;;;;;;47716:120;47560:3:::0;::::1;::::0;::::1;:::i;:::-;;;;47531:316;;66176:353:::0;30351:4;30375:16;;;:7;:16;;;;;;66249:13;;-1:-1:-1;;;;;30375:16:0;66275:76;;;;-1:-1:-1;;;66275:76:0;;26904:2:1;66275:76:0;;;26886:21:1;26943:2;26923:18;;;26916:30;26982:34;26962:18;;;26955:62;-1:-1:-1;;;27033:18:1;;;27026:45;27088:19;;66275:76:0;26702:411:1;66275:76:0;66364:18;66385:10;:8;:10::i;:::-;66454:20;;;;:11;:20;;;;;;66364:31;;-1:-1:-1;66364:31:0;;66445:30;;66454:20;;66445:8;:30::i;:::-;66491:27;;;;:18;:27;;;;;;66482:37;;:8;:37::i;:::-;66422:98;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;66408:113;;;66176:353;;;:::o;60971:404::-;61095:8;:15;61026:16;;61055:23;;-1:-1:-1;;;;;61081:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61081:30:0;;61055:56;;61128:13;61124:218;61151:8;:15;61143:23;;61124:218;;;61240:15;61226:10;;61197:9;:26;61207:8;61216:5;61207:15;;;;;;;;:::i;:::-;;;;;;;;;61197:26;;;;;;;;;;;;:39;;;;:::i;:::-;:58;61194:137;;61291:24;61299:8;61308:5;61299:15;;;;;;;;:::i;:::-;;;;;;;;;61291:7;:24::i;:::-;61275:6;61282:5;61275:13;;;;;;;;:::i;:::-;;;;;;:40;-1:-1:-1;;;;;61275:40:0;;;-1:-1:-1;;;;;61275:40:0;;;;;61194:137;61168:10;61177:1;61168:10;;:::i;:::-;;;61124:218;;;-1:-1:-1;61361:6:0;60971:404;-1:-1:-1;60971:404:0:o;64369:189::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;64463:14:::1;:22:::0;;;;64495:14:::1;:22:::0;64527:15:::1;:23:::0;64369:189::o;55056:765::-;44249:21;;;;44241:65;;;;-1:-1:-1;;;44241:65:0;;20299:2:1;44241:65:0;;;20281:21:1;20338:2;20318:18;;;20311:30;20377:33;20357:18;;;20350:61;20428:18;;44241:65:0;20097:355:1;44241:65:0;55157:25:::1;::::0;::::1;;55153:131;;55216:10;55230:9;55216:23;55208:64;;;::::0;-1:-1:-1;;;55208:64:0;;29257:2:1;55208:64:0::1;::::0;::::1;29239:21:1::0;29296:2;29276:18;;;29269:30;29335;29315:18;;;29308:58;29383:18;;55208:64:0::1;29055:352:1::0;55208:64:0::1;55296:18;55317:26;:16;964:14:::0;;872:114;55317:26:::1;55296:47;;55394:1;55382:9;:13;:32;;;;;55412:2;55399:9;:15;;55382:32;55374:116;;;;-1:-1:-1::0;;;55374:116:0::1;;;;;;;:::i;:::-;38792:5;39286:4;55544:13;;55522:19;;:35;;;;:::i;:::-;:53;;;;:::i;:::-;55509:67;::::0;:9;:67:::1;:::i;:::-;:88;;55501:147;;;::::0;-1:-1:-1;;;55501:147:0;;29967:2:1;55501:147:0::1;::::0;::::1;29949:21:1::0;30006:2;29986:18;;;29979:30;30045:34;30025:18;;;30018:62;-1:-1:-1;;;30096:18:1;;;30089:44;30150:19;;55501:147:0::1;29765:410:1::0;55501:147:0::1;55666:19;55661:153;55701:9;55687:11;:23;55661:153;;;55742:60;55764:10;55777:24;55790:11:::0;55777:10;:24:::1;:::i;:::-;55742:21;:60::i;:::-;55712:13:::0;::::1;::::0;::::1;:::i;:::-;;;;55661:153;;62259:295:::0;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;62358:9:::1;62354:125;62377:17;:24:::0;62373:28;::::1;62354:125;;;62466:1;62425:16;:38;62442:17;62460:1;62442:20;;;;;;;;:::i;:::-;;::::0;;;::::1;::::0;;;;;::::1;::::0;-1:-1:-1;;;;;62442:20:0::1;62425:38:::0;;;::::1;::::0;;;;;;;;:42;62403:6:::1;62442:20:::0;62403:6;::::1;:::i;:::-;;;62354:125;;;-1:-1:-1::0;62522:24:0::1;62529:17;;62522:24;:::i;39411:28::-:0;;;;;;;;;;;;64897:92;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;64964:12:::1;:22:::0;64897:92::o;48942:941::-;43954:11;;43935:15;:30;;:49;;;;;43983:1;43969:11;;:15;43935:49;43927:86;;;;-1:-1:-1;;;43927:86:0;;30382:2:1;43927:86:0;;;30364:21:1;30421:2;30401:18;;;30394:30;-1:-1:-1;;;30440:18:1;;;30433:54;30504:18;;43927:86:0;30180:348:1;43927:86:0;49016:18:::1;49037:26;:16;964:14:::0;;872:114;49037:26:::1;49016:47;;38979:4;49130:17;;49150:1;49130:21;;;;:::i;:::-;:49;;49122:94;;;::::0;-1:-1:-1;;;49122:94:0;;18766:2:1;49122:94:0::1;::::0;::::1;18748:21:1::0;18805:2;18785:18;;;18778:30;18844:32;18824:18;;;18817:60;18894:18;;49122:94:0::1;18564:354:1::0;49122:94:0::1;49256:10;49235:32;::::0;;;:20:::1;:32;::::0;;;;;::::1;;49227:88;;;::::0;-1:-1:-1;;;49227:88:0;;24669:2:1;49227:88:0::1;::::0;::::1;24651:21:1::0;24708:2;24688:18;;;24681:30;-1:-1:-1;;;24727:18:1;;;24720:54;24791:18;;49227:88:0::1;24467:348:1::0;49227:88:0::1;49354:10;49334:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;:40;49326:103;;;::::0;-1:-1:-1;;;49326:103:0;;21845:2:1;49326:103:0::1;::::0;::::1;21827:21:1::0;21884:2;21864:18;;;21857:30;21923:34;21903:18;;;21896:62;-1:-1:-1;;;21974:18:1;;;21967:37;22021:19;;49326:103:0::1;21643:403:1::0;49326:103:0::1;49519:9;::::0;:43:::1;::::0;-1:-1:-1;;;49519:43:0;;49551:10:::1;49519:43;::::0;::::1;12531:51:1::0;49572:1:0::1;::::0;-1:-1:-1;;;;;49519:9:0::1;::::0;:31:::1;::::0;12504:18:1;;49519:43:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;::::0;;::::1;-1:-1:-1::0;;49519:43:0::1;::::0;::::1;;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;:50;:54;49511:109;;;::::0;-1:-1:-1;;;49511:109:0;;19531:2:1;49511:109:0::1;::::0;::::1;19513:21:1::0;19570:2;19550:18;;;19543:30;19609:34;19589:18;;;19582:62;-1:-1:-1;;;19660:18:1;;;19653:40;19710:19;;49511:109:0::1;19329:406:1::0;49511:109:0::1;49701:10;49681:31;::::0;;;:19:::1;:31;::::0;;;;:38;;-1:-1:-1;;49681:38:0::1;49715:4;49681:38:::0;;::::1;::::0;;;49772:17:::1;:22:::0;;49715:4;;49772:17;;:22:::1;::::0;49715:4;;49772:22:::1;:::i;:::-;::::0;;;-1:-1:-1;49828:47:0::1;::::0;-1:-1:-1;49843:10:0::1;49855::::0;49867:1:::1;49870:4;49828:14;:47::i;65895:135::-:0;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;65975:10:::1;:18:::0;;;;66004:10:::1;:18:::0;65895:135::o;39379:25::-;;;;;;;;;;;;6272:192;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;6361:22:0;::::1;6353:73;;;::::0;-1:-1:-1;;;6353:73:0;;18359:2:1;6353:73:0::1;::::0;::::1;18341:21:1::0;18398:2;18378:18;;;18371:30;18437:34;18417:18;;;18410:62;-1:-1:-1;;;18488:18:1;;;18481:36;18534:19;;6353:73:0::1;18157:402:1::0;6353:73:0::1;6437:19;6447:8;6437:9;:19::i;52126:1106::-:0;52225:12;;-1:-1:-1;;;;;52225:12:0;52242:10;52217:35;52209:57;;;;-1:-1:-1;;;52209:57:0;;25022:2:1;52209:57:0;;;25004:21:1;25061:1;25041:18;;;25034:29;-1:-1:-1;;;25079:18:1;;;25072:39;25128:18;;52209:57:0;24820:332:1;52209:57:0;52318:14;52335:22;;;:11;:22;;;;;;52373:11;52370:69;;-1:-1:-1;52417:9:0;52370:69;52535:11;;52483;;52515:16;52528:3;52515:10;:16;:::i;:::-;52514:32;52511:72;;;-1:-1:-1;52570:1:0;52511:72;52595:16;52614:21;;;:13;:21;;;;;;;;;52684:11;:19;;;;;;:27;;-1:-1:-1;;52684:27:0;;;;;;;;;;-1:-1:-1;;;;;52614:21:0;;;;52724:455;;-1:-1:-1;;;;;52755:26:0;;;;;;:16;:26;;;;;:28;;;;;;:::i;:::-;;;;-1:-1:-1;;52833:13:0;:26;;;;;;;;;;;;;52903:19;;;-1:-1:-1;52874:26:0;;;:18;52833:26;52874;;;;:48;;;52903:19;;;52937:21;52903:19;52937:21;:::i;:::-;;;;;;52724:455;;;-1:-1:-1;;;;;52991:21:0;;;;;;:11;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;53059:8:0;:21;;;;;;;;;;;;;53124:13;;;-1:-1:-1;53095:26:0;;;:18;53059:21;53095:26;;;;:42;;;53124:13;;;53152:15;53124:13;53152:15;:::i;:::-;;;;;;52724:455;-1:-1:-1;;53219:5:0;53191:25;;;:17;:25;;;;;:33;;-1:-1:-1;;53191:33:0;;;-1:-1:-1;;52126:1106:0:o;44985:234::-;5445:6;;-1:-1:-1;;;;;5445:6:0;4240:10;5592:23;5584:68;;;;-1:-1:-1;;;5584:68:0;;;;;;;:::i;:::-;45072:18:::1;45067:145;45104:9;:16;45091:10;:29;45067:145;;;45196:4;45150:20;:43;45171:9;45181:10;45171:21;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;45150:43:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;45150:43:0;:50;;-1:-1:-1;;45150:50:0::1;::::0;::::1;;::::0;;;::::1;::::0;;45121:12;::::1;::::0;::::1;:::i;:::-;;;;45067:145;;34268:174:::0;34343:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34343:29:0;-1:-1:-1;;;;;34343:29:0;;;;;;;;:24;;34397:23;34343:24;34397:14;:23::i;:::-;-1:-1:-1;;;;;34388:46:0;;;;;;;;;;;34268:174;;:::o;45452:1352::-;45584:22;45594:3;45599:6;45584:9;:22::i;:::-;45619:28;:16;1083:19;;1101:1;1083:19;;;994:127;45619:28;45693:9;:23;;;;-1:-1:-1;45706:10:0;;;;45693:23;45689:1032;;;-1:-1:-1;;;;;45733:21:0;;;;;;:16;:21;;;;;:23;;;;;;:::i;:::-;;;;-1:-1:-1;;45771:13:0;:26;;;;;;;;;;;;;45841:19;;;-1:-1:-1;45812:26:0;;;:18;45771:26;45812;;;;:48;;;45841:19;;;45875:21;45841:19;45875:21;:::i;:::-;;;;;;45689:1032;;;45918:9;:23;;;;;45931:5;:10;;45940:1;45931:10;45918:23;45914:807;;;-1:-1:-1;;;;;45958:16:0;;;;;;:11;:16;;;;;:18;;;;;;:::i;:::-;;;;-1:-1:-1;;45991:8:0;:21;;;;;;;;;;;;;46056:13;;;-1:-1:-1;46027:26:0;;;:18;45991:21;46027:26;;;;:42;;;46056:13;;;46084:15;46056:13;46084:15;:::i;45914:807::-;46121:5;:10;;46130:1;46121:10;46117:604;;;-1:-1:-1;;;;;46148:19:0;;;;;;:14;:19;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;46184:11:0;:24;;;;;;;;;;;;;46252:16;;;-1:-1:-1;46223:26:0;;;:18;46184:24;46223:26;;;;:45;;;46252:16;;;46283:18;46252:16;46283:18;:::i;46117:604::-;46323:5;:10;;46332:1;46323:10;46319:402;;;-1:-1:-1;;;;;46350:19:0;;;;;;:14;:19;;;;;;:21;;;;;;:::i;:::-;;;;-1:-1:-1;;46386:11:0;:24;;;;;;;;;;;;;46454:16;;;-1:-1:-1;46425:26:0;;;:18;46386:24;46425:26;;;;:45;;;46454:16;;;46485:18;46454:16;46485:18;:::i;46319:402::-;46525:5;:10;;46534:1;46525:10;46521:200;;;-1:-1:-1;;;;;46552:20:0;;;;;;:15;:20;;;;;:22;;;;;;:::i;:::-;;;;-1:-1:-1;;46589:12:0;:25;;;;;;;;;;;;;46658:17;;;-1:-1:-1;46629:26:0;;;:18;46589:25;46629:26;;;;:46;;;46658:17;;;46690:19;46658:17;46690:19;:::i;:::-;;;;;;46521:200;-1:-1:-1;46769:19:0;;;;:11;:19;;;;;;:27;;-1:-1:-1;;46769:27:0;;;;;;;;;;;-1:-1:-1;45452:1352:0:o;27782:339::-;27977:41;4240:10;28010:7;27977:18;:41::i;:::-;27969:103;;;;-1:-1:-1;;;27969:103:0;;;;;;;:::i;:::-;28085:28;28095:4;28101:2;28105:7;28085:9;:28::i;6472:173::-;6547:6;;;-1:-1:-1;;;;;6564:17:0;;;-1:-1:-1;;;;;;6564:17:0;;;;;;;6597:40;;6547:6;;;6564:17;6547:6;;6597:40;;6528:16;;6597:40;6517:128;6472:173;:::o;59530:249::-;59637:12;;:35;;-1:-1:-1;;;59637:35:0;;;;;30679:25:1;;;59616:4:0;;59684:6;;59675:5;;-1:-1:-1;;;;;59637:12:0;;:28;;30652:18:1;;59637:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:43;;;;:::i;:::-;59636:54;59633:139;;;-1:-1:-1;59713:4:0;59706:11;;59633:139;-1:-1:-1;59755:5:0;59633:139;59530:249;;;;;:::o;28448:328::-;28623:41;4240:10;28656:7;28623:18;:41::i;:::-;28615:103;;;;-1:-1:-1;;;28615:103:0;;;;;;;:::i;:::-;28729:39;28743:4;28749:2;28753:7;28762:5;28729:13;:39::i;62587:86::-;62639:13;62663:7;62656:14;;;;;:::i;61448:573::-;61498:27;61542:7;61538:50;;-1:-1:-1;;61566:10:0;;;;;;;;;;;;-1:-1:-1;;;61566:10:0;;;;;61448:573::o;61538:50::-;61607:2;61598:6;61639:69;61646:6;;61639:69;;61669:5;;;;:::i;:::-;;-1:-1:-1;61689:7:0;;-1:-1:-1;61694:2:0;61689:7;;:::i;:::-;;;61639:69;;;61718:17;61748:3;-1:-1:-1;;;;;61738:14:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;61738:14:0;-1:-1:-1;61718:34:0;-1:-1:-1;61772:3:0;61786:198;61793:7;;61786:198;;61821:3;61823:1;61821;:3;:::i;:::-;61817:7;-1:-1:-1;61839:10:0;61869:7;61874:2;61869;:7;:::i;:::-;:12;;61879:2;61869:12;:::i;:::-;61864:17;;:2;:17;:::i;:::-;61853:29;;:2;:29;:::i;:::-;61839:44;;61898:9;61917:4;61910:12;;61898:24;;61947:2;61937:4;61942:1;61937:7;;;;;;;;:::i;:::-;;;;:12;-1:-1:-1;;;;;61937:12:0;;;;;;;;-1:-1:-1;61964:8:0;61970:2;61964:8;;:::i;:::-;;;61802:182;;61786:198;;;-1:-1:-1;62008:4:0;61448:573;-1:-1:-1;;;;61448:573:0:o;49933:2185::-;50072:3;50059:10;;50329:30;50350:5;50059:10;50329:20;:30::i;:::-;50392:12;;50470:14;;50307:52;;-1:-1:-1;50392:12:0;50470:14;;;;;:34;;;;-1:-1:-1;50488:16:0;;;50470:34;:73;;;;-1:-1:-1;50508:30:0;;;;:17;:30;;;;;;:35;;50470:73;:151;;;;;50601:20;50609:11;50601:7;:20::i;:::-;50547:10;;;50566:30;;;:17;:30;;;;;;;;50547:50;;-1:-1:-1;;;50547:50:0;;;;;30679:25:1;;;;-1:-1:-1;;;;;50547:74:0;;;;:10;;;;:18;;30652::1;;50547:50:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;50547:74:0;;50470:151;50467:243;;;50652:46;50667:30;;;:17;:30;;;;;;;;;50652:46;;:14;:46;;;;;;50637:61;;50652:46;;50637:61;;:::i;:::-;;;50467:243;50800:38;50814:5;50821:3;50826:11;50800:13;:38::i;:::-;50797:887;;;50934:16;;50931:742;;50998:1;50972:22;;:27;;;;;;;:::i;:::-;;;;;;;;51096:38;51110:5;51117:3;51122:11;;51096:13;:38::i;:::-;51093:565;;;51158:22;;;;:9;:22;;;;;51183:15;51158:40;;51223:13;:18;;51240:1;;51158:22;51223:18;;51240:1;;51223:18;:::i;:::-;;;;-1:-1:-1;51093:565:0;;-1:-1:-1;51093:565:0;;51349:20;51357:11;51349:7;:20::i;:::-;51344:25;;51409:1;51392:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;51486:20:0;;;;;;:16;:20;;;;;;51483:106;;51539:17;:26;;;;;;;-1:-1:-1;51539:26:0;;;;;;;;-1:-1:-1;;;;;;51539:26:0;-1:-1:-1;;;;;51539:26:0;;;;;51483:106;-1:-1:-1;;;;;51613:20:0;;;;;;:16;:20;;;;;:25;;51637:1;;51613:20;:25;;51637:1;;51613:25;:::i;:::-;;;;-1:-1:-1;;51093:565:0;51727:8;;-1:-1:-1;;;;;51727:8:0;:13;51741:10;51753:24;:22;:24::i;:::-;51727:51;;-1:-1:-1;;;;;;51727:51:0;;;;;;;-1:-1:-1;;;;;13587:32:1;;;51727:51:0;;;13569::1;13636:18;;;13629:34;13542:18;;51727:51:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51850:24:0;;;;:17;:24;;;;;:31;;-1:-1:-1;;51850:31:0;51877:4;51850:31;;;51915:39;;-1:-1:-1;51930:2:0;;51868:5;;51941;;51915:14;:39::i;:::-;51967:20;;;;:13;:20;;;;;;:25;;-1:-1:-1;;;;;;51967:25:0;-1:-1:-1;;;;;51967:25:0;;;;;;;;;;52031:12;;:37;;-1:-1:-1;;;52031:37:0;;;;;30679:25:1;;;52031:12:0;;;:30;;30652:18:1;;52031:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52023:46;52080:22;;;:11;:22;;;;;:30;;;;-1:-1:-1;;;;;;49933:2185:0:o;31270:110::-;31346:26;31356:2;31360:7;31346:26;;;;;;;;;;;;:9;:26::i;30580:348::-;30673:4;30375:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30375:16:0;30690:73;;;;-1:-1:-1;;;30690:73:0;;22656:2:1;30690:73:0;;;22638:21:1;22695:2;22675:18;;;22668:30;22734:34;22714:18;;;22707:62;-1:-1:-1;;;22785:18:1;;;22778:42;22837:19;;30690:73:0;22454:408:1;30690:73:0;30774:13;30790:23;30805:7;30790:14;:23::i;:::-;30774:39;;30843:5;-1:-1:-1;;;;;30832:16:0;:7;-1:-1:-1;;;;;30832:16:0;;:51;;;;30876:7;-1:-1:-1;;;;;30852:31:0;:20;30864:7;30852:11;:20::i;:::-;-1:-1:-1;;;;;30852:31:0;;30832:51;:87;;;-1:-1:-1;;;;;;27672:25:0;;;27648:4;27672:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;30887:32;27551:164;33572:578;33731:4;-1:-1:-1;;;;;33704:31:0;:23;33719:7;33704:14;:23::i;:::-;-1:-1:-1;;;;;33704:31:0;;33696:85;;;;-1:-1:-1;;;33696:85:0;;26494:2:1;33696:85:0;;;26476:21:1;26533:2;26513:18;;;26506:30;26572:34;26552:18;;;26545:62;-1:-1:-1;;;26623:18:1;;;26616:39;26672:19;;33696:85:0;26292:405:1;33696:85:0;-1:-1:-1;;;;;33800:16:0;;33792:65;;;;-1:-1:-1;;;33792:65:0;;20659:2:1;33792:65:0;;;20641:21:1;20698:2;20678:18;;;20671:30;20737:34;20717:18;;;20710:62;-1:-1:-1;;;20788:18:1;;;20781:34;20832:19;;33792:65:0;20457:400:1;33792:65:0;33974:29;33991:1;33995:7;33974:8;:29::i;:::-;-1:-1:-1;;;;;34016:15:0;;;;;;:9;:15;;;;;:20;;34035:1;;34016:15;:20;;34035:1;;34016:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34047:13:0;;;;;;:9;:13;;;;;:18;;34064:1;;34047:13;:18;;34064:1;;34047:18;:::i;:::-;;;;-1:-1:-1;;34076:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34076:21:0;-1:-1:-1;;;;;34076:21:0;;;;;;;;;34115:27;;34076:16;;34115:27;;;;;;;33572:578;;;:::o;29658:315::-;29815:28;29825:4;29831:2;29835:7;29815:9;:28::i;:::-;29862:48;29885:4;29891:2;29895:7;29904:5;29862:22;:48::i;:::-;29854:111;;;;-1:-1:-1;;;29854:111:0;;;;;;;:::i;31607:321::-;31737:18;31743:2;31747:7;31737:5;:18::i;:::-;31788:54;31819:1;31823:2;31827:7;31836:5;31788:22;:54::i;:::-;31766:154;;;;-1:-1:-1;;;31766:154:0;;;;;;;:::i;35007:799::-;35162:4;-1:-1:-1;;;;;35183:13:0;;7741:20;7789:8;35179:620;;35219:72;;-1:-1:-1;;;35219:72:0;;-1:-1:-1;;;;;35219:36:0;;;;;:72;;4240:10;;35270:4;;35276:7;;35285:5;;35219:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35219:72:0;;;;;;;;-1:-1:-1;;35219:72:0;;;;;;;;;;;;:::i;:::-;;;35215:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35461:13:0;;35457:272;;35504:60;;-1:-1:-1;;;35504:60:0;;;;;;;:::i;35457:272::-;35679:6;35673:13;35664:6;35660:2;35656:15;35649:38;35215:529;-1:-1:-1;;;;;;35342:51:0;-1:-1:-1;;;35342:51:0;;-1:-1:-1;35335:58:0;;35179:620;-1:-1:-1;35783:4:0;35007:799;;;;;;:::o;32264:382::-;-1:-1:-1;;;;;32344:16:0;;32336:61;;;;-1:-1:-1;;;32336:61:0;;25359:2:1;32336:61:0;;;25341:21:1;;;25378:18;;;25371:30;25437:34;25417:18;;;25410:62;25489:18;;32336:61:0;25157:356:1;32336:61:0;30351:4;30375:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30375:16:0;:30;32408:58;;;;-1:-1:-1;;;32408:58:0;;19942:2:1;32408:58:0;;;19924:21:1;19981:2;19961:18;;;19954:30;20020;20000:18;;;19993:58;20068:18;;32408:58:0;19740:352:1;32408:58:0;-1:-1:-1;;;;;32537:13:0;;;;;;:9;:13;;;;;:18;;32554:1;;32537:13;:18;;32554:1;;32537:18;:::i;:::-;;;;-1:-1:-1;;32566:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32566:21:0;-1:-1:-1;;;;;32566:21:0;;;;;;;;32605:33;;32566:16;;;32605:33;;32566:16;;32605:33;32264:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:406:1;78:5;-1:-1:-1;;;;;104:6:1;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:1;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:45;;;309:1;306;299:12;268:45;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;14:406;;;;;:::o;425:160::-;490:20;;546:13;;539:21;529:32;;519:60;;575:1;572;565:12;519:60;425:160;;;:::o;590:247::-;649:6;702:2;690:9;681:7;677:23;673:32;670:52;;;718:1;715;708:12;670:52;757:9;744:23;776:31;801:5;776:31;:::i;842:251::-;912:6;965:2;953:9;944:7;940:23;936:32;933:52;;;981:1;978;971:12;933:52;1013:9;1007:16;1032:31;1057:5;1032:31;:::i;1098:388::-;1166:6;1174;1227:2;1215:9;1206:7;1202:23;1198:32;1195:52;;;1243:1;1240;1233:12;1195:52;1282:9;1269:23;1301:31;1326:5;1301:31;:::i;:::-;1351:5;-1:-1:-1;1408:2:1;1393:18;;1380:32;1421:33;1380:32;1421:33;:::i;:::-;1473:7;1463:17;;;1098:388;;;;;:::o;1491:671::-;1577:6;1585;1593;1601;1654:3;1642:9;1633:7;1629:23;1625:33;1622:53;;;1671:1;1668;1661:12;1622:53;1710:9;1697:23;1729:31;1754:5;1729:31;:::i;:::-;1779:5;-1:-1:-1;1836:2:1;1821:18;;1808:32;1849:33;1808:32;1849:33;:::i;:::-;1901:7;-1:-1:-1;1960:2:1;1945:18;;1932:32;1973:33;1932:32;1973:33;:::i;:::-;2025:7;-1:-1:-1;2084:2:1;2069:18;;2056:32;2097:33;2056:32;2097:33;:::i;:::-;1491:671;;;;-1:-1:-1;1491:671:1;;-1:-1:-1;;1491:671:1:o;2167:456::-;2244:6;2252;2260;2313:2;2301:9;2292:7;2288:23;2284:32;2281:52;;;2329:1;2326;2319:12;2281:52;2368:9;2355:23;2387:31;2412:5;2387:31;:::i;:::-;2437:5;-1:-1:-1;2494:2:1;2479:18;;2466:32;2507:33;2466:32;2507:33;:::i;:::-;2167:456;;2559:7;;-1:-1:-1;;;2613:2:1;2598:18;;;;2585:32;;2167:456::o;2628:794::-;2723:6;2731;2739;2747;2800:3;2788:9;2779:7;2775:23;2771:33;2768:53;;;2817:1;2814;2807:12;2768:53;2856:9;2843:23;2875:31;2900:5;2875:31;:::i;:::-;2925:5;-1:-1:-1;2982:2:1;2967:18;;2954:32;2995:33;2954:32;2995:33;:::i;:::-;3047:7;-1:-1:-1;3101:2:1;3086:18;;3073:32;;-1:-1:-1;3156:2:1;3141:18;;3128:32;-1:-1:-1;;;;;3172:30:1;;3169:50;;;3215:1;3212;3205:12;3169:50;3238:22;;3291:4;3283:13;;3279:27;-1:-1:-1;3269:55:1;;3320:1;3317;3310:12;3269:55;3343:73;3408:7;3403:2;3390:16;3385:2;3381;3377:11;3343:73;:::i;:::-;3333:83;;;2628:794;;;;;;;:::o;3427:315::-;3492:6;3500;3553:2;3541:9;3532:7;3528:23;3524:32;3521:52;;;3569:1;3566;3559:12;3521:52;3608:9;3595:23;3627:31;3652:5;3627:31;:::i;:::-;3677:5;-1:-1:-1;3701:35:1;3732:2;3717:18;;3701:35;:::i;:::-;3691:45;;3427:315;;;;;:::o;3747:::-;3815:6;3823;3876:2;3864:9;3855:7;3851:23;3847:32;3844:52;;;3892:1;3889;3882:12;3844:52;3931:9;3918:23;3950:31;3975:5;3950:31;:::i;:::-;4000:5;4052:2;4037:18;;;;4024:32;;-1:-1:-1;;;3747:315:1:o;4067:977::-;4151:6;4182:2;4225;4213:9;4204:7;4200:23;4196:32;4193:52;;;4241:1;4238;4231:12;4193:52;4281:9;4268:23;-1:-1:-1;;;;;4306:6:1;4303:30;4300:50;;;4346:1;4343;4336:12;4300:50;4369:22;;4422:4;4414:13;;4410:27;-1:-1:-1;4400:55:1;;4451:1;4448;4441:12;4400:55;4487:2;4474:16;4510:60;4526:43;4566:2;4526:43;:::i;:::-;4510:60;:::i;:::-;4592:3;4616:2;4611:3;4604:15;4644:2;4639:3;4635:12;4628:19;;4675:2;4671;4667:11;4723:7;4718:2;4712;4709:1;4705:10;4701:2;4697:19;4693:28;4690:41;4687:61;;;4744:1;4741;4734:12;4687:61;4766:1;4757:10;;4776:238;4790:2;4787:1;4784:9;4776:238;;;4861:3;4848:17;4878:31;4903:5;4878:31;:::i;:::-;4922:18;;4808:1;4801:9;;;;;4960:12;;;;4992;;4776:238;;;-1:-1:-1;5033:5:1;4067:977;-1:-1:-1;;;;;;;4067:977:1:o;5049:902::-;5133:6;5164:2;5207;5195:9;5186:7;5182:23;5178:32;5175:52;;;5223:1;5220;5213:12;5175:52;5263:9;5250:23;-1:-1:-1;;;;;5288:6:1;5285:30;5282:50;;;5328:1;5325;5318:12;5282:50;5351:22;;5404:4;5396:13;;5392:27;-1:-1:-1;5382:55:1;;5433:1;5430;5423:12;5382:55;5469:2;5456:16;5492:60;5508:43;5548:2;5508:43;:::i;5492:60::-;5574:3;5598:2;5593:3;5586:15;5626:2;5621:3;5617:12;5610:19;;5657:2;5653;5649:11;5705:7;5700:2;5694;5691:1;5687:10;5683:2;5679:19;5675:28;5672:41;5669:61;;;5726:1;5723;5716:12;5669:61;5748:1;5739:10;;5758:163;5772:2;5769:1;5766:9;5758:163;;;5829:17;;5817:30;;5790:1;5783:9;;;;;5867:12;;;;5899;;5758:163;;5956:892;6051:6;6082:2;6125;6113:9;6104:7;6100:23;6096:32;6093:52;;;6141:1;6138;6131:12;6093:52;6174:9;6168:16;-1:-1:-1;;;;;6199:6:1;6196:30;6193:50;;;6239:1;6236;6229:12;6193:50;6262:22;;6315:4;6307:13;;6303:27;-1:-1:-1;6293:55:1;;6344:1;6341;6334:12;6293:55;6373:2;6367:9;6396:60;6412:43;6452:2;6412:43;:::i;6396:60::-;6478:3;6502:2;6497:3;6490:15;6530:2;6525:3;6521:12;6514:19;;6561:2;6557;6553:11;6609:7;6604:2;6598;6595:1;6591:10;6587:2;6583:19;6579:28;6576:41;6573:61;;;6630:1;6627;6620:12;6573:61;6652:1;6643:10;;6662:156;6676:2;6673:1;6670:9;6662:156;;;6733:10;;6721:23;;6694:1;6687:9;;;;;6764:12;;;;6796;;6662:156;;6853:963;6946:6;6977:2;7020;7008:9;6999:7;6995:23;6991:32;6988:52;;;7036:1;7033;7026:12;6988:52;7069:9;7063:16;-1:-1:-1;;;;;7094:6:1;7091:30;7088:50;;;7134:1;7131;7124:12;7088:50;7157:22;;7210:4;7202:13;;7198:27;-1:-1:-1;7188:55:1;;7239:1;7236;7229:12;7188:55;7268:2;7262:9;7291:60;7307:43;7347:2;7307:43;:::i;7291:60::-;7373:3;7397:2;7392:3;7385:15;7425:2;7420:3;7416:12;7409:19;;7456:2;7452;7448:11;7504:7;7499:2;7493;7490:1;7486:10;7482:2;7478:19;7474:28;7471:41;7468:61;;;7525:1;7522;7515:12;7468:61;7547:1;7538:10;;7557:229;7571:2;7568:1;7565:9;7557:229;;;7635:3;7629:10;7652:29;7675:5;7652:29;:::i;:::-;7694:18;;7589:1;7582:9;;;;;7732:12;;;;7764;;7557:229;;7821:180;7877:6;7930:2;7918:9;7909:7;7905:23;7901:32;7898:52;;;7946:1;7943;7936:12;7898:52;7969:26;7985:9;7969:26;:::i;8006:248::-;8068:6;8076;8129:2;8117:9;8108:7;8104:23;8100:32;8097:52;;;8145:1;8142;8135:12;8097:52;8168:26;8184:9;8168:26;:::i;8259:180::-;8318:6;8371:2;8359:9;8350:7;8346:23;8342:32;8339:52;;;8387:1;8384;8377:12;8339:52;-1:-1:-1;8410:23:1;;8259:180;-1:-1:-1;8259:180:1:o;8444:248::-;8512:6;8520;8573:2;8561:9;8552:7;8548:23;8544:32;8541:52;;;8589:1;8586;8579:12;8541:52;-1:-1:-1;;8612:23:1;;;8682:2;8667:18;;;8654:32;;-1:-1:-1;8444:248:1:o;8697:245::-;8755:6;8808:2;8796:9;8787:7;8783:23;8779:32;8776:52;;;8824:1;8821;8814:12;8776:52;8863:9;8850:23;8882:30;8906:5;8882:30;:::i;8947:249::-;9016:6;9069:2;9057:9;9048:7;9044:23;9040:32;9037:52;;;9085:1;9082;9075:12;9037:52;9117:9;9111:16;9136:30;9160:5;9136:30;:::i;9201:450::-;9270:6;9323:2;9311:9;9302:7;9298:23;9294:32;9291:52;;;9339:1;9336;9329:12;9291:52;9379:9;9366:23;-1:-1:-1;;;;;9404:6:1;9401:30;9398:50;;;9444:1;9441;9434:12;9398:50;9467:22;;9520:4;9512:13;;9508:27;-1:-1:-1;9498:55:1;;9549:1;9546;9539:12;9498:55;9572:73;9637:7;9632:2;9619:16;9614:2;9610;9606:11;9572:73;:::i;9841:184::-;9911:6;9964:2;9952:9;9943:7;9939:23;9935:32;9932:52;;;9980:1;9977;9970:12;9932:52;-1:-1:-1;10003:16:1;;9841:184;-1:-1:-1;9841:184:1:o;10030:385::-;10107:6;10115;10123;10131;10184:3;10172:9;10163:7;10159:23;10155:33;10152:53;;;10201:1;10198;10191:12;10152:53;10237:9;10224:23;10214:33;;10266:35;10297:2;10286:9;10282:18;10266:35;:::i;:::-;10256:45;;10320:35;10351:2;10340:9;10336:18;10320:35;:::i;:::-;10310:45;;10374:35;10405:2;10394:9;10390:18;10374:35;:::i;:::-;10364:45;;10030:385;;;;;;;:::o;10673:316::-;10750:6;10758;10766;10819:2;10807:9;10798:7;10794:23;10790:32;10787:52;;;10835:1;10832;10825:12;10787:52;-1:-1:-1;;10858:23:1;;;10928:2;10913:18;;10900:32;;-1:-1:-1;10979:2:1;10964:18;;;10951:32;;10673:316;-1:-1:-1;10673:316:1:o;10994:311::-;11060:6;11068;11121:2;11109:9;11100:7;11096:23;11092:32;11089:52;;;11137:1;11134;11127:12;11089:52;11173:9;11160:23;11150:33;;11233:2;11222:9;11218:18;11205:32;11246:29;11269:5;11246:29;:::i;11310:257::-;11351:3;11389:5;11383:12;11416:6;11411:3;11404:19;11432:63;11488:6;11481:4;11476:3;11472:14;11465:4;11458:5;11454:16;11432:63;:::i;:::-;11549:2;11528:15;-1:-1:-1;;11524:29:1;11515:39;;;;11556:4;11511:50;;11310:257;-1:-1:-1;;11310:257:1:o;11572:808::-;11900:3;11938:6;11932:13;11954:53;12000:6;11995:3;11988:4;11980:6;11976:17;11954:53;:::i;:::-;12070:13;;12029:16;;;;12092:57;12070:13;12029:16;12126:4;12114:17;;12092:57;:::i;:::-;-1:-1:-1;;;12171:20:1;;12200:18;;;12243:13;;12265:65;12243:13;12317:1;12306:13;;12299:4;12287:17;;12265:65;:::i;:::-;12350:20;12372:1;12346:28;;11572:808;-1:-1:-1;;;;;11572:808:1:o;12902:488::-;-1:-1:-1;;;;;13171:15:1;;;13153:34;;13223:15;;13218:2;13203:18;;13196:43;13270:2;13255:18;;13248:34;;;13318:3;13313:2;13298:18;;13291:31;;;13096:4;;13339:45;;13364:19;;13356:6;13339:45;:::i;:::-;13331:53;12902:488;-1:-1:-1;;;;;;12902:488:1:o;13674:658::-;13845:2;13897:21;;;13967:13;;13870:18;;;13989:22;;;13816:4;;13845:2;14068:15;;;;14042:2;14027:18;;;13816:4;14111:195;14125:6;14122:1;14119:13;14111:195;;;14190:13;;-1:-1:-1;;;;;14186:39:1;14174:52;;14281:15;;;;14246:12;;;;14222:1;14140:9;14111:195;;;-1:-1:-1;14323:3:1;;13674:658;-1:-1:-1;;;;;;13674:658:1:o;14337:632::-;14508:2;14560:21;;;14630:13;;14533:18;;;14652:22;;;14479:4;;14508:2;14731:15;;;;14705:2;14690:18;;;14479:4;14774:169;14788:6;14785:1;14782:13;14774:169;;;14849:13;;14837:26;;14918:15;;;;14883:12;;;;14810:1;14803:9;14774:169;;14974:639;15141:2;15193:21;;;15263:13;;15166:18;;;15285:22;;;15112:4;;15141:2;15364:15;;;;15338:2;15323:18;;;15112:4;15407:180;15421:6;15418:1;15415:13;15407:180;;;15486:13;;15501:4;15482:24;15470:37;;15562:15;;;;15527:12;;;;15443:1;15436:9;15407:180;;16750:219;16899:2;16888:9;16881:21;16862:4;16919:44;16959:2;16948:9;16944:18;16936:6;16919:44;:::i;17738:414::-;17940:2;17922:21;;;17979:2;17959:18;;;17952:30;18018:34;18013:2;17998:18;;17991:62;-1:-1:-1;;;18084:2:1;18069:18;;18062:48;18142:3;18127:19;;17738:414::o;21216:422::-;21418:2;21400:21;;;21457:2;21437:18;;;21430:30;21496:34;21491:2;21476:18;;21469:62;21567:28;21562:2;21547:18;;21540:56;21628:3;21613:19;;21216:422::o;25931:356::-;26133:2;26115:21;;;26152:18;;;26145:30;26211:34;26206:2;26191:18;;26184:62;26278:2;26263:18;;25931:356::o;28637:413::-;28839:2;28821:21;;;28878:2;28858:18;;;28851:30;28917:34;28912:2;28897:18;;28890:62;-1:-1:-1;;;28983:2:1;28968:18;;28961:47;29040:3;29025:19;;28637:413::o;30904:275::-;30975:2;30969:9;31040:2;31021:13;;-1:-1:-1;;31017:27:1;31005:40;;-1:-1:-1;;;;;31060:34:1;;31096:22;;;31057:62;31054:88;;;31122:18;;:::i;:::-;31158:2;31151:22;30904:275;;-1:-1:-1;30904:275:1:o;31184:183::-;31244:4;-1:-1:-1;;;;;31269:6:1;31266:30;31263:56;;;31299:18;;:::i;:::-;-1:-1:-1;31344:1:1;31340:14;31356:4;31336:25;;31184:183::o;31372:128::-;31412:3;31443:1;31439:6;31436:1;31433:13;31430:39;;;31449:18;;:::i;:::-;-1:-1:-1;31485:9:1;;31372:128::o;31505:204::-;31543:3;31579:4;31576:1;31572:12;31611:4;31608:1;31604:12;31646:3;31640:4;31636:14;31631:3;31628:23;31625:49;;;31654:18;;:::i;:::-;31690:13;;31505:204;-1:-1:-1;;;31505:204:1:o;31714:120::-;31754:1;31780;31770:35;;31785:18;;:::i;:::-;-1:-1:-1;31819:9:1;;31714:120::o;31839:168::-;31879:7;31945:1;31941;31937:6;31933:14;31930:1;31927:21;31922:1;31915:9;31908:17;31904:45;31901:71;;;31952:18;;:::i;:::-;-1:-1:-1;31992:9:1;;31839:168::o;32012:125::-;32052:4;32080:1;32077;32074:8;32071:34;;;32085:18;;:::i;:::-;-1:-1:-1;32122:9:1;;32012:125::o;32142:258::-;32214:1;32224:113;32238:6;32235:1;32232:13;32224:113;;;32314:11;;;32308:18;32295:11;;;32288:39;32260:2;32253:10;32224:113;;;32355:6;32352:1;32349:13;32346:48;;;-1:-1:-1;;32390:1:1;32372:16;;32365:27;32142:258::o;32405:136::-;32444:3;32472:5;32462:39;;32481:18;;:::i;:::-;-1:-1:-1;;;32517:18:1;;32405:136::o;32546:380::-;32625:1;32621:12;;;;32668;;;32689:61;;32743:4;32735:6;32731:17;32721:27;;32689:61;32796:2;32788:6;32785:14;32765:18;32762:38;32759:161;;;32842:10;32837:3;32833:20;32830:1;32823:31;32877:4;32874:1;32867:15;32905:4;32902:1;32895:15;32931:135;32970:3;-1:-1:-1;;32991:17:1;;32988:43;;;33011:18;;:::i;:::-;-1:-1:-1;33058:1:1;33047:13;;32931:135::o;33071:112::-;33103:1;33129;33119:35;;33134:18;;:::i;:::-;-1:-1:-1;33168:9:1;;33071:112::o;33188:127::-;33249:10;33244:3;33240:20;33237:1;33230:31;33280:4;33277:1;33270:15;33304:4;33301:1;33294:15;33320:127;33381:10;33376:3;33372:20;33369:1;33362:31;33412:4;33409:1;33402:15;33436:4;33433:1;33426:15;33452:127;33513:10;33508:3;33504:20;33501:1;33494:31;33544:4;33541:1;33534:15;33568:4;33565:1;33558:15;33584:127;33645:10;33640:3;33636:20;33633:1;33626:31;33676:4;33673:1;33666:15;33700:4;33697:1;33690:15;33716:131;-1:-1:-1;;;;;33791:31:1;;33781:42;;33771:70;;33837:1;33834;33827:12;33852:131;-1:-1:-1;;;;;;33926:32:1;;33916:43;;33906:71;;33973:1;33970;33963:12;33988:114;34072:4;34065:5;34061:16;34054:5;34051:27;34041:55;;34092:1;34089;34082:12

Swarm Source

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