ETH Price: $2,709.01 (+0.83%)

Token

RuggedBoredApes (RBA)
 

Overview

Max Total Supply

137 RBA

Holders

51

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 RBA
0x836dc66f88f2c890f80a2e1cf0b2b93435c4eb99
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
RuggedBoredApes

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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


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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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 {
        _setApprovalForAll(_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);

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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


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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: contracts/RBA_MintingContract (3).sol


pragma solidity ^0.8.0;




contract RuggedBoredApes is ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;

    Counters.Counter private _tokenId;
    uint public rbaStartIndex = 1000;
    uint public rbaEndIndex = 5000;
    uint public maxApes = 10000;
    uint public maxSinglePurchaseCount = 8;
    uint public price = 88000000000000000; //0.088 Ether
    string baseTokenURI;
    bool public saleOpen = false;

    struct ApprovedContract {
        string name;
        address contractAddress;
        uint discount;
        uint startIndex;
        uint endIndex;
    }
    mapping(address => ApprovedContract) approvedContractDetails;
    ApprovedContract[] public approvedContracts;
    address public ruggedBinAddress;

    event ApprovedContractNameChange(address _contractAddress, string _newName);
    event ApprovedContractDiscountChange(address _contractAddress, uint _newDiscount);
    event ApprovedContractAddition(string _name, address _contractAddress, uint _discount, uint _startIndex, uint _endIndex);

    constructor(string memory baseURI) ERC721("RuggedBoredApes", "RBA") {
        setBaseURI(baseURI);
    }

    //Get token Ids of all tokens owned by _owner
    function tokenIdsByOwner(address _owner)
        external
        view
        returns (uint[] memory)
    {
        uint tokenCount = balanceOf(_owner);

        uint[] memory tokensId = new uint[](tokenCount);
        for (uint i = 0; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokensId;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        baseTokenURI = baseURI;
    }

    function setPrice(uint _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function setRbaStartIndex(uint _newRbaStartIndex) external onlyOwner {
        rbaStartIndex = _newRbaStartIndex;
    }

    function setRbaEndIndex(uint _newRbaEndIndex) external onlyOwner {
        rbaEndIndex = _newRbaEndIndex;
    }

    function setMaxApes(uint _maxApes) external onlyOwner {
        maxApes += _maxApes;
    }

    function setRuggedBinAddress(address _ruggedBinAddress) external onlyOwner {
        ruggedBinAddress = _ruggedBinAddress;
    }

    function setMaxSinglePurchaseCount(uint _maxSinglePurchaseCount) external onlyOwner {
        maxSinglePurchaseCount = _maxSinglePurchaseCount;
    }

    //Close sale if open, open sale if closed
    function flipSaleState() external onlyOwner {
        saleOpen = !saleOpen;
    }

    function withdrawAll() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    //mint RuggedBoredApes with genesisTokenId
    function mintRuggedBoredApes(address _to, uint _count, uint[] memory genesisTokenIds, address[] memory genesisContractAddresses) external payable {
        require(_count >= genesisContractAddresses.length, "Count cannot be less than number of tokens ids passed");
        require(genesisTokenIds.length == genesisContractAddresses.length, "Token ids must match contract addresses");
        require(totalSupply() + _count <= maxApes, "Exceeds maximum supply of RuggedBoredApes");
        if (msg.sender != owner()) {
            require(saleOpen, "Sale is not open yet");
            require(_count > 0 && _count <= maxSinglePurchaseCount, "Minimum 1 & Maximum Single Purchase Count of RuggedBoredApes can be minted per transaction");
            
            // value checks
            uint etherValue;

            for (uint i = 0; i < genesisContractAddresses.length; i++) {
                ApprovedContract memory migrationContract = approvedContractDetails[genesisContractAddresses[i]];
                etherValue += price * (100 - migrationContract.discount)/100;
            }

            if (_count > genesisContractAddresses.length) {
                etherValue += (_count - genesisContractAddresses.length) * price;
            }
            require(msg.value >= etherValue, "Ether sent with this transaction is not correct");

            // mint process
            for (uint i = 0; i < genesisContractAddresses.length; i++) {
                ERC721Enumerable instance = ERC721Enumerable(genesisContractAddresses[i]);
                ApprovedContract memory migrationContract = approvedContractDetails[genesisContractAddresses[i]];
                
                if ((migrationContract.startIndex + genesisTokenIds[i]) <= migrationContract.endIndex) {
                    instance.safeTransferFrom(_to, ruggedBinAddress, genesisTokenIds[i]);
                    _safeMint(_to, migrationContract.startIndex + genesisTokenIds[i]);
                } 
            }

            if (_count > genesisContractAddresses.length) {
                require((rbaStartIndex + uint(_tokenId.current()) + _count) <= rbaEndIndex, "Cannot mint. Exceeds allowable supply of RBA");
                for (uint i = 0; i < (_count - genesisTokenIds.length); i++) {
                    _tokenId.increment();
                    _safeMint(_to, rbaStartIndex + uint(_tokenId.current()));
                }
            }
        } else {
            // mint process
            for (uint i = 0; i < genesisContractAddresses.length; i++) {
                ERC721Enumerable instance = ERC721Enumerable(genesisContractAddresses[i]);
                ApprovedContract memory migrationContract = approvedContractDetails[genesisContractAddresses[i]];
                
                if ((migrationContract.startIndex + genesisTokenIds[i]) <= migrationContract.endIndex) {
                    instance.safeTransferFrom(_to, ruggedBinAddress, genesisTokenIds[i]);
                    _safeMint(_to, migrationContract.startIndex + genesisTokenIds[i]);
                } 
            }

            if (_count > genesisContractAddresses.length) {
                require((rbaStartIndex + uint(_tokenId.current()) + _count) <= rbaEndIndex, "Cannot mint. Exceeds allowable supply of RBA");
                for (uint i = 0; i < (_count - genesisTokenIds.length); i++) {
                    _tokenId.increment();
                    _safeMint(_to, rbaStartIndex + uint(_tokenId.current()));
                }
            }
        }       
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }
    
    function hasGenesis(address user) external view returns (address[] memory, uint[] memory){
        uint genesisContractAddressCount;
        for (uint i = 0; i < approvedContracts.length; i++) {
            ERC721Enumerable instance = ERC721Enumerable(approvedContracts[i].contractAddress);
            uint genesisCount = instance.balanceOf(user);

            if (genesisCount > 0) {
                genesisContractAddressCount++;
            }
        }

        if (genesisContractAddressCount > 0) {
            address[] memory validContractAddresses = new address[](genesisContractAddressCount);
            uint[] memory tokenCount = new uint[](genesisContractAddressCount);
            uint genesisContractAddressCount1;
            for (uint i = 0; i < approvedContracts.length; i++) {
                ERC721Enumerable instance = ERC721Enumerable(approvedContracts[i].contractAddress);
                uint genesisCount1 = instance.balanceOf(user);

                if (genesisCount1 > 0) {
                    validContractAddresses[genesisContractAddressCount1] = approvedContracts[i].contractAddress;
                    tokenCount[genesisContractAddressCount1] = genesisCount1;
                    genesisContractAddressCount1++;
                }
            }

            return (validContractAddresses, tokenCount);
        } else {
            return(new address[](0), new uint[](0));
        }
    }

    function getGenesisTokenIds(address user, uint totalIdCount) external view returns(uint[] memory) {
        uint[] memory tokenIds = new uint[](totalIdCount);
        uint runningSum;
        for (uint i = 0; i < approvedContracts.length; i++) {
            ERC721Enumerable instance = ERC721Enumerable(approvedContracts[i].contractAddress);
            uint genesisCount2 = instance.balanceOf(user);

            if (genesisCount2 > 0) {
                for (uint j = 0; j < genesisCount2; j++) {
                    tokenIds[j+runningSum] = instance.tokenOfOwnerByIndex(user, j);
                }
                runningSum += genesisCount2;
            } 
        }
        return tokenIds;
    }

    function addApprovedContract(string calldata _name, address _contractAddress, uint _discount, uint _startIndex, uint _endIndex) external onlyOwner {        
        approvedContracts.push(ApprovedContract(_name, _contractAddress, _discount, _startIndex, _endIndex));

        approvedContractDetails[_contractAddress] = ApprovedContract(_name, _contractAddress, _discount, _startIndex, _endIndex);
        emit ApprovedContractAddition(_name, _contractAddress, _discount, _startIndex, _endIndex);
    }

    function getApprovedContract(address _contractAddress) external view returns (string memory, address, uint, uint , uint) {
        ApprovedContract memory approvedContract = approvedContractDetails[_contractAddress];
        return (approvedContract.name, approvedContract.contractAddress, approvedContract.discount, approvedContract.startIndex, approvedContract.endIndex);
    }

    function updateApprovedContractDiscount(address _contractAddress, uint _newDiscount) external onlyOwner {
        ApprovedContract memory approvedContract = approvedContractDetails[_contractAddress];
        approvedContract.discount = _newDiscount;

        approvedContractDetails[_contractAddress] = approvedContract;
        emit ApprovedContractDiscountChange(_contractAddress, _newDiscount);
    }

    function updateApprovedContractName(address _contractAddress, string calldata _newName) external onlyOwner {
        ApprovedContract memory approvedContract = approvedContractDetails[_contractAddress];
        approvedContract.name = _newName;

        approvedContractDetails[_contractAddress] = approvedContract;
        emit ApprovedContractNameChange(_contractAddress, _newName);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","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":false,"internalType":"string","name":"_name","type":"string"},{"indexed":false,"internalType":"address","name":"_contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_discount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_startIndex","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_endIndex","type":"uint256"}],"name":"ApprovedContractAddition","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_contractAddress","type":"address"},{"indexed":false,"internalType":"uint256","name":"_newDiscount","type":"uint256"}],"name":"ApprovedContractDiscountChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_contractAddress","type":"address"},{"indexed":false,"internalType":"string","name":"_newName","type":"string"}],"name":"ApprovedContractNameChange","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_discount","type":"uint256"},{"internalType":"uint256","name":"_startIndex","type":"uint256"},{"internalType":"uint256","name":"_endIndex","type":"uint256"}],"name":"addApprovedContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"approvedContracts","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"address","name":"contractAddress","type":"address"},{"internalType":"uint256","name":"discount","type":"uint256"},{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"endIndex","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"}],"name":"getApprovedContract","outputs":[{"internalType":"string","name":"","type":"string"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"totalIdCount","type":"uint256"}],"name":"getGenesisTokenIds","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"hasGenesis","outputs":[{"internalType":"address[]","name":"","type":"address[]"},{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxApes","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSinglePurchaseCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"},{"internalType":"uint256[]","name":"genesisTokenIds","type":"uint256[]"},{"internalType":"address[]","name":"genesisContractAddresses","type":"address[]"}],"name":"mintRuggedBoredApes","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbaEndIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rbaStartIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"ruggedBinAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxApes","type":"uint256"}],"name":"setMaxApes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSinglePurchaseCount","type":"uint256"}],"name":"setMaxSinglePurchaseCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRbaEndIndex","type":"uint256"}],"name":"setRbaEndIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newRbaStartIndex","type":"uint256"}],"name":"setRbaStartIndex","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_ruggedBinAddress","type":"address"}],"name":"setRuggedBinAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokenIdsByOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"uint256","name":"_newDiscount","type":"uint256"}],"name":"updateApprovedContractDiscount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contractAddress","type":"address"},{"internalType":"string","name":"_newName","type":"string"}],"name":"updateApprovedContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526103e8600c55611388600d55612710600e556008600f55670138a388a43c00006010556012805460ff191690553480156200003e57600080fd5b50604051620048ed380380620048ed833981016040819052620000619162000282565b604080518082018252600f81526e527567676564426f7265644170657360881b60208083019182528351808501909452600384526252424160e81b908401528151919291620000b391600091620001c6565b508051620000c9906001906020840190620001c6565b505050620000e6620000e0620000f860201b60201c565b620000fc565b620000f1816200014e565b506200039b565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a546001600160a01b03163314620001ad5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640160405180910390fd5b8051620001c2906011906020840190620001c6565b5050565b828054620001d4906200035e565b90600052602060002090601f016020900481019282620001f8576000855562000243565b82601f106200021357805160ff191683800117855562000243565b8280016001018555821562000243579182015b828111156200024357825182559160200191906001019062000226565b506200025192915062000255565b5090565b5b8082111562000251576000815560010162000256565b634e487b7160e01b600052604160045260246000fd5b600060208083850312156200029657600080fd5b82516001600160401b0380821115620002ae57600080fd5b818501915085601f830112620002c357600080fd5b815181811115620002d857620002d86200026c565b604051601f8201601f19908116603f011681019083821181831017156200030357620003036200026c565b8160405282815288868487010111156200031c57600080fd5b600093505b8284101562000340578484018601518185018701529285019262000321565b82841115620003525760008684830101525b98975050505050505050565b600181811c908216806200037357607f821691505b602082108114156200039557634e487b7160e01b600052602260045260246000fd5b50919050565b61454280620003ab6000396000f3fe6080604052600436106102e75760003560e01c80637a0e403511610184578063a6c365f8116100d6578063c9963d051161008a578063f2fde38b11610064578063f2fde38b14610822578063f499fa5e14610842578063f7c66da91461086257600080fd5b8063c9963d0514610799578063d54e7be8146107b9578063e985e9c5146107d957600080fd5b8063b88d4fde116100bb578063b88d4fde14610739578063c84bb62f14610759578063c87b56dd1461077957600080fd5b8063a6c365f814610703578063a858fd1d1461071957600080fd5b806391b7f5ed11610138578063a035b1fe11610112578063a035b1fe146106ad578063a22cb465146106c3578063a4057658146106e357600080fd5b806391b7f5ed1461065e57806395d89b411461067e57806399288dbb1461069357600080fd5b806386ebad281161016957806386ebad28146105f35780638da5cb5b146106135780638f85fa941461063157600080fd5b80637a0e4035146105ad578063853828b6146105de57600080fd5b8063352bc9bb1161023d5780634f6ccce7116101f157806365cc0151116101cb57806365cc01511461056557806370a0823114610578578063715018a61461059857600080fd5b80634f6ccce71461050557806355f804b3146105255780636352211e1461054557600080fd5b806342842e0e1161022257806342842e0e146104af5780634c3ca55c146104cf5780634eb9cf45146104e557600080fd5b8063352bc9bb1461047957806337f755561461048f57600080fd5b8063095f59a21161029f57806327531c331161027957806327531c33146104165780632f745c591461044457806334918dfd1461046457600080fd5b8063095f59a2146103c157806318160ddd146103e157806323b872dd146103f657600080fd5b806306fdde03116102d057806306fdde0314610345578063081812fc14610367578063095ea7b31461039f57600080fd5b806301ffc9a7146102ec5780630392fe0514610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613c4e565b610882565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b50610337600f5481565b604051908152602001610318565b34801561035157600080fd5b5061035a6108c6565b6040516103189190613cc3565b34801561037357600080fd5b50610387610382366004613cd6565b610958565b6040516001600160a01b039091168152602001610318565b3480156103ab57600080fd5b506103bf6103ba366004613d0b565b610a03565b005b3480156103cd57600080fd5b506103bf6103dc366004613cd6565b610b35565b3480156103ed57600080fd5b50600854610337565b34801561040257600080fd5b506103bf610411366004613d35565b610b94565b34801561042257600080fd5b50610436610431366004613d71565b610c1b565b604051610318929190613dc7565b34801561045057600080fd5b5061033761045f366004613d0b565b610f08565b34801561047057600080fd5b506103bf610fb0565b34801561048557600080fd5b50610337600e5481565b34801561049b57600080fd5b506103bf6104aa366004613d0b565b61101e565b3480156104bb57600080fd5b506103bf6104ca366004613d35565b61122b565b3480156104db57600080fd5b50610337600d5481565b3480156104f157600080fd5b506103bf610500366004613d71565b611246565b34801561051157600080fd5b50610337610520366004613cd6565b6112cf565b34801561053157600080fd5b506103bf610540366004613ec6565b611373565b34801561055157600080fd5b50610387610560366004613cd6565b6113e4565b6103bf610573366004613fa5565b61146f565b34801561058457600080fd5b50610337610593366004613d71565b611f93565b3480156105a457600080fd5b506103bf61202d565b3480156105b957600080fd5b506105cd6105c8366004613d71565b612093565b60405161031895949392919061407a565b3480156105ea57600080fd5b506103bf6121c3565b3480156105ff57600080fd5b506103bf61060e366004613cd6565b6122b8565b34801561061f57600080fd5b50600a546001600160a01b0316610387565b34801561063d57600080fd5b5061065161064c366004613d71565b612317565b60405161031891906140ba565b34801561066a57600080fd5b506103bf610679366004613cd6565b6123b9565b34801561068a57600080fd5b5061035a612418565b34801561069f57600080fd5b5060125461030c9060ff1681565b3480156106b957600080fd5b5061033760105481565b3480156106cf57600080fd5b506103bf6106de3660046140cd565b612427565b3480156106ef57600080fd5b506106516106fe366004613d0b565b612432565b34801561070f57600080fd5b50610337600c5481565b34801561072557600080fd5b506105cd610734366004613cd6565b612622565b34801561074557600080fd5b506103bf610754366004614109565b6126fb565b34801561076557600080fd5b506103bf610774366004613cd6565b612783565b34801561078557600080fd5b5061035a610794366004613cd6565b6127f7565b3480156107a557600080fd5b506103bf6107b43660046141c2565b6128e0565b3480156107c557600080fd5b506103bf6107d4366004614215565b612b35565b3480156107e557600080fd5b5061030c6107f4366004614285565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082e57600080fd5b506103bf61083d366004613d71565b612d9a565b34801561084e57600080fd5b506103bf61085d366004613cd6565b612e79565b34801561086e57600080fd5b50601554610387906001600160a01b031681565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806108c057506108c082612ed8565b92915050565b6060600080546108d5906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906142b8565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a0e826113e4565b9050806001600160a01b0316836001600160a01b03161415610a985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b336001600160a01b0382161480610ab45750610ab481336107f4565b610b265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109de565b610b308383612f73565b505050565b600a546001600160a01b03163314610b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600f55565b610b9e3382612fee565b610c105760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109de565b610b308383836130f6565b6060806000805b601454811015610cee57600060148281548110610c4157610c416142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038981166004830152909116925082906370a0823190602401602060405180830381865afa158015610c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc39190614309565b90508015610cd95783610cd581614338565b9450505b50508080610ce690614338565b915050610c22565b508015610ee85760008167ffffffffffffffff811115610d1057610d10613e27565b604051908082528060200260200182016040528015610d39578160200160208202803683370190505b50905060008267ffffffffffffffff811115610d5757610d57613e27565b604051908082528060200260200182016040528015610d80578160200160208202803683370190505b5090506000805b601454811015610edb57600060148281548110610da657610da66142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038c81166004830152909116925082906370a0823190602401602060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e289190614309565b90508015610ec65760148381548110610e4357610e436142f3565b906000526020600020906005020160010160009054906101000a90046001600160a01b0316868581518110610e7a57610e7a6142f3565b60200260200101906001600160a01b031690816001600160a01b03168152505080858581518110610ead57610ead6142f3565b602090810291909101015283610ec281614338565b9450505b50508080610ed390614338565b915050610d87565b5091969095509350505050565b505060408051600080825260208201908152818301909252939092509050565b6000610f1383611f93565b8210610f875760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109de565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461100a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6012805460ff19811660ff90911615179055565b600a546001600160a01b031633146110785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038216600090815260136020526040808220815160a081019092528054829082906110a9906142b8565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906142b8565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b505050918352505060018201546001600160a01b03908116602080840191909152600284015460408085019190915260038501546060850152600490940154608090930192909252838301869052861660009081526013825291909120825180519394508493919261119992849290910190613b9f565b5060208281015160018301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039283161790556040808501516002850155606085015160038501556080909401516004909301929092558251918616825281018490527f3d07d7517e3c9daf9d86800de1f888c840684ff70086d878b28dbd2f71fd8de6910160405180910390a1505050565b610b30838383604051806020016040528060008152506126fb565b600a546001600160a01b031633146112a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006112da60085490565b821061134e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109de565b60088281548110611361576113616142f3565b90600052602060002001549050919050565b600a546001600160a01b031633146113cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b80516113e0906011906020840190613b9f565b5050565b6000818152600260205260408120546001600160a01b0316806108c05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109de565b80518310156114e65760405162461bcd60e51b815260206004820152603560248201527f436f756e742063616e6e6f74206265206c657373207468616e206e756d62657260448201527f206f6620746f6b656e732069647320706173736564000000000000000000000060648201526084016109de565b805182511461155d5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e20696473206d757374206d6174636820636f6e747261637420616460448201527f647265737365730000000000000000000000000000000000000000000000000060648201526084016109de565b600e548361156a60085490565b6115749190614353565b11156115e85760405162461bcd60e51b815260206004820152602960248201527f45786365656473206d6178696d756d20737570706c79206f662052756767656460448201527f426f72656441706573000000000000000000000000000000000000000000000060648201526084016109de565b600a546001600160a01b03163314611c615760125460ff1661164c5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206f70656e2079657400000000000000000000000060448201526064016109de565b60008311801561165e5750600f548311155b6116f65760405162461bcd60e51b815260206004820152605a60248201527f4d696e696d756d20312026204d6178696d756d2053696e676c6520507572636860448201527f61736520436f756e74206f6620527567676564426f726564417065732063616e60648201527f206265206d696e74656420706572207472616e73616374696f6e000000000000608482015260a4016109de565b6000805b82518110156118605760006013600085848151811061171b5761171b6142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052908160008201805461175e906142b8565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906142b8565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b505050918352505060018201546001600160a01b03166020820152600282015460408083019190915260038301546060830152600490920154608090910152810151909150606490611829908261436b565b6010546118369190614382565b61184091906143b7565b61184a9084614353565b925050808061185890614338565b9150506116fa565b508151841115611890576010548251611879908661436b565b6118839190614382565b61188d9082614353565b90505b803410156119065760405162461bcd60e51b815260206004820152602f60248201527f45746865722073656e7420776974682074686973207472616e73616374696f6e60448201527f206973206e6f7420636f7272656374000000000000000000000000000000000060648201526084016109de565b60005b8251811015611b67576000838281518110611926576119266142f3565b60200260200101519050600060136000868581518110611948576119486142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052908160008201805461198b906142b8565b80601f01602080910402602001604051908101604052809291908181526020018280546119b7906142b8565b8015611a045780601f106119d957610100808354040283529160200191611a04565b820191906000526020600020905b8154815290600101906020018083116119e757829003601f168201915b505050918352505060018201546001600160a01b031660208201526002820154604082015260038201546060820152600490910154608091820152810151875191925090879085908110611a5a57611a5a6142f3565b60200260200101518260600151611a719190614353565b11611b5257816001600160a01b03166342842e0e89601560009054906101000a90046001600160a01b0316898781518110611aae57611aae6142f3565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611b0857600080fd5b505af1158015611b1c573d6000803e3d6000fd5b50505050611b5288878581518110611b3657611b366142f3565b60200260200101518360600151611b4d9190614353565b6132db565b50508080611b5f90614338565b915050611909565b508151841115611c5b57600d5484611b7e600b5490565b600c54611b8b9190614353565b611b959190614353565b1115611c095760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e742e204578636565647320616c6c6f7761626c65207360448201527f7570706c79206f6620524241000000000000000000000000000000000000000060648201526084016109de565b60005b8351611c18908661436b565b811015611c5957611c2d600b80546001019055565b611c4786611c3a600b5490565b600c54611b4d9190614353565b80611c5181614338565b915050611c0c565b505b50611f8d565b60005b8151811015611ea6576000828281518110611c8157611c816142f3565b60200260200101519050600060136000858581518110611ca357611ca36142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a0016040529081600082018054611ce6906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611d12906142b8565b8015611d5f5780601f10611d3457610100808354040283529160200191611d5f565b820191906000526020600020905b815481529060010190602001808311611d4257829003601f168201915b505050918352505060018201546001600160a01b031660208201526002820154604082015260038201546060820152600490910154608091820152810151865191925090869085908110611db557611db56142f3565b60200260200101518260600151611dcc9190614353565b11611e9157816001600160a01b03166342842e0e88601560009054906101000a90046001600160a01b0316888781518110611e0957611e096142f3565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611e6357600080fd5b505af1158015611e77573d6000803e3d6000fd5b50505050611e9187868581518110611b3657611b366142f3565b50508080611e9e90614338565b915050611c64565b508051831115611f8d57600d5483611ebd600b5490565b600c54611eca9190614353565b611ed49190614353565b1115611f485760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e742e204578636565647320616c6c6f7761626c65207360448201527f7570706c79206f6620524241000000000000000000000000000000000000000060648201526084016109de565b60005b8251611f57908561436b565b811015611f8b57611f6c600b80546001019055565b611f7985611c3a600b5490565b80611f8381614338565b915050611f4b565b505b50505050565b60006001600160a01b0382166120115760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109de565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146120875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b61209160006132f5565b565b6060600080600080600060136000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405290816000820180546120dd906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612109906142b8565b80156121565780601f1061212b57610100808354040283529160200191612156565b820191906000526020600020905b81548152906001019060200180831161213957829003601f168201915b505050918352505060018201546001600160a01b03166020808301919091526002830154604080840191909152600384015460608085019190915260049094015460809384015284519185015190850151938501519490920151909b919a50919850919650945092505050565b600a546001600160a01b0316331461221d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b604051600090339047908381818185875af1925050503d806000811461225f576040519150601f19603f3d011682016040523d82523d6000602084013e612264565b606091505b50509050806122b55760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e0000000000000000000000000000000060448201526064016109de565b50565b600a546001600160a01b031633146123125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600d55565b6060600061232483611f93565b905060008167ffffffffffffffff81111561234157612341613e27565b60405190808252806020026020018201604052801561236a578160200160208202803683370190505b50905060005b828110156123b1576123828582610f08565b828281518110612394576123946142f3565b6020908102919091010152806123a981614338565b915050612370565b509392505050565b600a546001600160a01b031633146124135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b601055565b6060600180546108d5906142b8565b6113e0338383613354565b606060008267ffffffffffffffff81111561244f5761244f613e27565b604051908082528060200260200182016040528015612478578160200160208202803683370190505b5090506000805b6014548110156126185760006014828154811061249e5761249e6142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038a81166004830152909116925082906370a0823190602401602060405180830381865afa1580156124fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125209190614309565b905080156126035760005b818110156125f5576040517f2f745c590000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201839052841690632f745c5990604401602060405180830381865afa158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190614309565b866125c88784614353565b815181106125d8576125d86142f3565b6020908102919091010152806125ed81614338565b91505061252b565b506126008185614353565b93505b5050808061261090614338565b91505061247f565b5090949350505050565b6014818154811061263257600080fd5b9060005260206000209060050201600091509050806000018054612655906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612681906142b8565b80156126ce5780601f106126a3576101008083540402835291602001916126ce565b820191906000526020600020905b8154815290600101906020018083116126b157829003601f168201915b5050505060018301546002840154600385015460049095015493946001600160a01b039092169390925085565b6127053383612fee565b6127775760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109de565b611f8d84848484613423565b600a546001600160a01b031633146127dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b80600e60008282546127ef9190614353565b909155505050565b6000818152600260205260409020546060906001600160a01b03166128845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109de565b600061288e6134ac565b905060008151116128ae57604051806020016040528060008152506128d9565b806128b8846134bb565b6040516020016128c99291906143cb565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461293a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038316600090815260136020526040808220815160a0810190925280548290829061296b906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612997906142b8565b80156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b505050505081526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820154815260200160038201548152602001600482015481525050905082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506001600160a01b0385168152601360209081526040909120825180518493612aa0928492910190613b9f565b50602082015160018201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055604080830151600283015560608301516003830155608090920151600490910155517fe0c728715c689d714bcae366c84d96fd3cce5044789898c270be3735b1c4ea5090612b2790869086908690614425565b60405180910390a150505050565b600a546001600160a01b03163314612b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6040805160c06020601f8901819004028201810190925260a081018781526014928291908a908a908190850183828082843760009201829052509385525050506001600160a01b03881660208084019190915260408301889052606083018790526080909201859052835460018101855593815281902082518051939460050290910192612c209284920190613b9f565b506020828101516001830180546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055604080840151600284015560608401516003840155608090930151600490920191909155815160c0601f89018390049092028101820190925260a082018781528291899089908190850183828082843760009201829052509385525050506001600160a01b0387166020808401829052604080850189905260608501889052608090940186905290825260138152919020825180519192612cfd92849290910190613b9f565b50602082015160018201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055604080830151600283015560608301516003830155608090920151600490910155517fd1dfbaf3a673062305bd1a7457937f8986985cac2866daf1aee50b0705ca817390612d8a90889088908890889088908890614451565b60405180910390a1505050505050565b600a546001600160a01b03163314612df45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038116612e705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109de565b6122b5816132f5565b600a546001600160a01b03163314612ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600c55565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612f3b57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108c057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108c0565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190612fb5826113e4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166130785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109de565b6000613083836113e4565b9050806001600160a01b0316846001600160a01b031614806130be5750836001600160a01b03166130b384610958565b6001600160a01b0316145b806130ee57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316613109826113e4565b6001600160a01b0316146131855760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016109de565b6001600160a01b0382166132005760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109de565b61320b8383836135ed565b613216600082612f73565b6001600160a01b038316600090815260036020526040812080546001929061323f90849061436b565b90915550506001600160a01b038216600090815260036020526040812080546001929061326d908490614353565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e08282604051806020016040528060008152506136a5565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133b65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109de565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61342e8484846130f6565b61343a8484848461372e565b611f8d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b6060601180546108d5906142b8565b6060816134fb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613525578061350f81614338565b915061351e9050600a836143b7565b91506134ff565b60008167ffffffffffffffff81111561354057613540613e27565b6040519080825280601f01601f19166020018201604052801561356a576020820181803683370190505b5090505b84156130ee5761357f60018361436b565b915061358c600a86614493565b613597906030614353565b60f81b8183815181106135ac576135ac6142f3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135e6600a866143b7565b945061356e565b6001600160a01b0383166136485761364381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61366b565b816001600160a01b0316836001600160a01b03161461366b5761366b83826138b4565b6001600160a01b03821661368257610b3081613951565b826001600160a01b0316826001600160a01b031614610b3057610b308282613a00565b6136af8383613a44565b6136bc600084848461372e565b610b305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b60006001600160a01b0384163b156138a9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061378b9033908990889088906004016144a7565b6020604051808303816000875af19250505080156137c6575060408051601f3d908101601f191682019092526137c3918101906144d9565b60015b613876573d8080156137f4576040519150601f19603f3d011682016040523d82523d6000602084013e6137f9565b606091505b50805161386e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490506130ee565b506001949350505050565b600060016138c184611f93565b6138cb919061436b565b60008381526007602052604090205490915080821461391e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139639060019061436b565b6000838152600960205260408120546008805493945090928490811061398b5761398b6142f3565b9060005260206000200154905080600883815481106139ac576139ac6142f3565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806139e4576139e46144f6565b6001900381819060005260206000200160009055905550505050565b6000613a0b83611f93565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613a9a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109de565b6000818152600260205260409020546001600160a01b031615613aff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109de565b613b0b600083836135ed565b6001600160a01b0382166000908152600360205260408120805460019290613b34908490614353565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054613bab906142b8565b90600052602060002090601f016020900481019282613bcd5760008555613c13565b82601f10613be657805160ff1916838001178555613c13565b82800160010185558215613c13579182015b82811115613c13578251825591602001919060010190613bf8565b50613c1f929150613c23565b5090565b5b80821115613c1f5760008155600101613c24565b6001600160e01b0319811681146122b557600080fd5b600060208284031215613c6057600080fd5b81356128d981613c38565b60005b83811015613c86578181015183820152602001613c6e565b83811115611f8d5750506000910152565b60008151808452613caf816020860160208601613c6b565b601f01601f19169290920160200192915050565b6020815260006128d96020830184613c97565b600060208284031215613ce857600080fd5b5035919050565b80356001600160a01b0381168114613d0657600080fd5b919050565b60008060408385031215613d1e57600080fd5b613d2783613cef565b946020939093013593505050565b600080600060608486031215613d4a57600080fd5b613d5384613cef565b9250613d6160208501613cef565b9150604084013590509250925092565b600060208284031215613d8357600080fd5b6128d982613cef565b600081518084526020808501945080840160005b83811015613dbc57815187529582019590820190600101613da0565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b82811015613e095781516001600160a01b031684529284019290840190600101613de4565b50505083810382850152613e1d8186613d8c565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e6657613e66613e27565b604052919050565b600067ffffffffffffffff831115613e8857613e88613e27565b613e9b6020601f19601f86011601613e3d565b9050828152838383011115613eaf57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613ed857600080fd5b813567ffffffffffffffff811115613eef57600080fd5b8201601f81018413613f0057600080fd5b6130ee84823560208401613e6e565b600067ffffffffffffffff821115613f2957613f29613e27565b5060051b60200190565b600082601f830112613f4457600080fd5b81356020613f59613f5483613f0f565b613e3d565b82815260059290921b84018101918181019086841115613f7857600080fd5b8286015b84811015613f9a57613f8d81613cef565b8352918301918301613f7c565b509695505050505050565b60008060008060808587031215613fbb57600080fd5b613fc485613cef565b93506020808601359350604086013567ffffffffffffffff80821115613fe957600080fd5b818801915088601f830112613ffd57600080fd5b813561400b613f5482613f0f565b81815260059190911b8301840190848101908b83111561402a57600080fd5b938501935b828510156140485784358252938501939085019061402f565b96505050606088013592508083111561406057600080fd5b505061406e87828801613f33565b91505092959194509250565b60a08152600061408d60a0830188613c97565b90506001600160a01b03861660208301528460408301528360608301528260808301529695505050505050565b6020815260006128d96020830184613d8c565b600080604083850312156140e057600080fd5b6140e983613cef565b9150602083013580151581146140fe57600080fd5b809150509250929050565b6000806000806080858703121561411f57600080fd5b61412885613cef565b935061413660208601613cef565b925060408501359150606085013567ffffffffffffffff81111561415957600080fd5b8501601f8101871361416a57600080fd5b61406e87823560208401613e6e565b60008083601f84011261418b57600080fd5b50813567ffffffffffffffff8111156141a357600080fd5b6020830191508360208285010111156141bb57600080fd5b9250929050565b6000806000604084860312156141d757600080fd5b6141e084613cef565b9250602084013567ffffffffffffffff8111156141fc57600080fd5b61420886828701614179565b9497909650939450505050565b60008060008060008060a0878903121561422e57600080fd5b863567ffffffffffffffff81111561424557600080fd5b61425189828a01614179565b9097509550614264905060208801613cef565b93506040870135925060608701359150608087013590509295509295509295565b6000806040838503121561429857600080fd5b6142a183613cef565b91506142af60208401613cef565b90509250929050565b600181811c908216806142cc57607f821691505b602082108114156142ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561431b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561434c5761434c614322565b5060010190565b6000821982111561436657614366614322565b500190565b60008282101561437d5761437d614322565b500390565b600081600019048311821515161561439c5761439c614322565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826143c6576143c66143a1565b500490565b600083516143dd818460208801613c6b565b8351908301906143f1818360208801613c6b565b01949350505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6001600160a01b03841681526040602082015260006144486040830184866143fa565b95945050505050565b60a08152600061446560a08301888a6143fa565b90506001600160a01b0386166020830152846040830152836060830152826080830152979650505050505050565b6000826144a2576144a26143a1565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e1d6080830184613c97565b6000602082840312156144eb57600080fd5b81516128d981613c38565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208015aa2bf9ec3b12715572061f665ff119ecafba545f6f9f2376a2bf9c1d38aa64736f6c634300080c00330000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004068747470733a2f2f617277656176652e6e65742f2d7276546e585a773530705a63386965654a6f4153556f425150423376652d4f6c496b58545047496e79552f

Deployed Bytecode

0x6080604052600436106102e75760003560e01c80637a0e403511610184578063a6c365f8116100d6578063c9963d051161008a578063f2fde38b11610064578063f2fde38b14610822578063f499fa5e14610842578063f7c66da91461086257600080fd5b8063c9963d0514610799578063d54e7be8146107b9578063e985e9c5146107d957600080fd5b8063b88d4fde116100bb578063b88d4fde14610739578063c84bb62f14610759578063c87b56dd1461077957600080fd5b8063a6c365f814610703578063a858fd1d1461071957600080fd5b806391b7f5ed11610138578063a035b1fe11610112578063a035b1fe146106ad578063a22cb465146106c3578063a4057658146106e357600080fd5b806391b7f5ed1461065e57806395d89b411461067e57806399288dbb1461069357600080fd5b806386ebad281161016957806386ebad28146105f35780638da5cb5b146106135780638f85fa941461063157600080fd5b80637a0e4035146105ad578063853828b6146105de57600080fd5b8063352bc9bb1161023d5780634f6ccce7116101f157806365cc0151116101cb57806365cc01511461056557806370a0823114610578578063715018a61461059857600080fd5b80634f6ccce71461050557806355f804b3146105255780636352211e1461054557600080fd5b806342842e0e1161022257806342842e0e146104af5780634c3ca55c146104cf5780634eb9cf45146104e557600080fd5b8063352bc9bb1461047957806337f755561461048f57600080fd5b8063095f59a21161029f57806327531c331161027957806327531c33146104165780632f745c591461044457806334918dfd1461046457600080fd5b8063095f59a2146103c157806318160ddd146103e157806323b872dd146103f657600080fd5b806306fdde03116102d057806306fdde0314610345578063081812fc14610367578063095ea7b31461039f57600080fd5b806301ffc9a7146102ec5780630392fe0514610321575b600080fd5b3480156102f857600080fd5b5061030c610307366004613c4e565b610882565b60405190151581526020015b60405180910390f35b34801561032d57600080fd5b50610337600f5481565b604051908152602001610318565b34801561035157600080fd5b5061035a6108c6565b6040516103189190613cc3565b34801561037357600080fd5b50610387610382366004613cd6565b610958565b6040516001600160a01b039091168152602001610318565b3480156103ab57600080fd5b506103bf6103ba366004613d0b565b610a03565b005b3480156103cd57600080fd5b506103bf6103dc366004613cd6565b610b35565b3480156103ed57600080fd5b50600854610337565b34801561040257600080fd5b506103bf610411366004613d35565b610b94565b34801561042257600080fd5b50610436610431366004613d71565b610c1b565b604051610318929190613dc7565b34801561045057600080fd5b5061033761045f366004613d0b565b610f08565b34801561047057600080fd5b506103bf610fb0565b34801561048557600080fd5b50610337600e5481565b34801561049b57600080fd5b506103bf6104aa366004613d0b565b61101e565b3480156104bb57600080fd5b506103bf6104ca366004613d35565b61122b565b3480156104db57600080fd5b50610337600d5481565b3480156104f157600080fd5b506103bf610500366004613d71565b611246565b34801561051157600080fd5b50610337610520366004613cd6565b6112cf565b34801561053157600080fd5b506103bf610540366004613ec6565b611373565b34801561055157600080fd5b50610387610560366004613cd6565b6113e4565b6103bf610573366004613fa5565b61146f565b34801561058457600080fd5b50610337610593366004613d71565b611f93565b3480156105a457600080fd5b506103bf61202d565b3480156105b957600080fd5b506105cd6105c8366004613d71565b612093565b60405161031895949392919061407a565b3480156105ea57600080fd5b506103bf6121c3565b3480156105ff57600080fd5b506103bf61060e366004613cd6565b6122b8565b34801561061f57600080fd5b50600a546001600160a01b0316610387565b34801561063d57600080fd5b5061065161064c366004613d71565b612317565b60405161031891906140ba565b34801561066a57600080fd5b506103bf610679366004613cd6565b6123b9565b34801561068a57600080fd5b5061035a612418565b34801561069f57600080fd5b5060125461030c9060ff1681565b3480156106b957600080fd5b5061033760105481565b3480156106cf57600080fd5b506103bf6106de3660046140cd565b612427565b3480156106ef57600080fd5b506106516106fe366004613d0b565b612432565b34801561070f57600080fd5b50610337600c5481565b34801561072557600080fd5b506105cd610734366004613cd6565b612622565b34801561074557600080fd5b506103bf610754366004614109565b6126fb565b34801561076557600080fd5b506103bf610774366004613cd6565b612783565b34801561078557600080fd5b5061035a610794366004613cd6565b6127f7565b3480156107a557600080fd5b506103bf6107b43660046141c2565b6128e0565b3480156107c557600080fd5b506103bf6107d4366004614215565b612b35565b3480156107e557600080fd5b5061030c6107f4366004614285565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561082e57600080fd5b506103bf61083d366004613d71565b612d9a565b34801561084e57600080fd5b506103bf61085d366004613cd6565b612e79565b34801561086e57600080fd5b50601554610387906001600160a01b031681565b60006001600160e01b031982167f780e9d630000000000000000000000000000000000000000000000000000000014806108c057506108c082612ed8565b92915050565b6060600080546108d5906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054610901906142b8565b801561094e5780601f106109235761010080835404028352916020019161094e565b820191906000526020600020905b81548152906001019060200180831161093157829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a0e826113e4565b9050806001600160a01b0316836001600160a01b03161415610a985760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016109de565b336001600160a01b0382161480610ab45750610ab481336107f4565b610b265760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109de565b610b308383612f73565b505050565b600a546001600160a01b03163314610b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600f55565b610b9e3382612fee565b610c105760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109de565b610b308383836130f6565b6060806000805b601454811015610cee57600060148281548110610c4157610c416142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038981166004830152909116925082906370a0823190602401602060405180830381865afa158015610c9f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610cc39190614309565b90508015610cd95783610cd581614338565b9450505b50508080610ce690614338565b915050610c22565b508015610ee85760008167ffffffffffffffff811115610d1057610d10613e27565b604051908082528060200260200182016040528015610d39578160200160208202803683370190505b50905060008267ffffffffffffffff811115610d5757610d57613e27565b604051908082528060200260200182016040528015610d80578160200160208202803683370190505b5090506000805b601454811015610edb57600060148281548110610da657610da66142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038c81166004830152909116925082906370a0823190602401602060405180830381865afa158015610e04573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610e289190614309565b90508015610ec65760148381548110610e4357610e436142f3565b906000526020600020906005020160010160009054906101000a90046001600160a01b0316868581518110610e7a57610e7a6142f3565b60200260200101906001600160a01b031690816001600160a01b03168152505080858581518110610ead57610ead6142f3565b602090810291909101015283610ec281614338565b9450505b50508080610ed390614338565b915050610d87565b5091969095509350505050565b505060408051600080825260208201908152818301909252939092509050565b6000610f1383611f93565b8210610f875760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201527f74206f6620626f756e647300000000000000000000000000000000000000000060648201526084016109de565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b0316331461100a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6012805460ff19811660ff90911615179055565b600a546001600160a01b031633146110785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038216600090815260136020526040808220815160a081019092528054829082906110a9906142b8565b80601f01602080910402602001604051908101604052809291908181526020018280546110d5906142b8565b80156111225780601f106110f757610100808354040283529160200191611122565b820191906000526020600020905b81548152906001019060200180831161110557829003601f168201915b505050918352505060018201546001600160a01b03908116602080840191909152600284015460408085019190915260038501546060850152600490940154608090930192909252838301869052861660009081526013825291909120825180519394508493919261119992849290910190613b9f565b5060208281015160018301805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039283161790556040808501516002850155606085015160038501556080909401516004909301929092558251918616825281018490527f3d07d7517e3c9daf9d86800de1f888c840684ff70086d878b28dbd2f71fd8de6910160405180910390a1505050565b610b30838383604051806020016040528060008152506126fb565b600a546001600160a01b031633146112a05760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6015805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055565b60006112da60085490565b821061134e5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201527f7574206f6620626f756e6473000000000000000000000000000000000000000060648201526084016109de565b60088281548110611361576113616142f3565b90600052602060002001549050919050565b600a546001600160a01b031633146113cd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b80516113e0906011906020840190613b9f565b5050565b6000818152600260205260408120546001600160a01b0316806108c05760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201527f656e7420746f6b656e000000000000000000000000000000000000000000000060648201526084016109de565b80518310156114e65760405162461bcd60e51b815260206004820152603560248201527f436f756e742063616e6e6f74206265206c657373207468616e206e756d62657260448201527f206f6620746f6b656e732069647320706173736564000000000000000000000060648201526084016109de565b805182511461155d5760405162461bcd60e51b815260206004820152602760248201527f546f6b656e20696473206d757374206d6174636820636f6e747261637420616460448201527f647265737365730000000000000000000000000000000000000000000000000060648201526084016109de565b600e548361156a60085490565b6115749190614353565b11156115e85760405162461bcd60e51b815260206004820152602960248201527f45786365656473206d6178696d756d20737570706c79206f662052756767656460448201527f426f72656441706573000000000000000000000000000000000000000000000060648201526084016109de565b600a546001600160a01b03163314611c615760125460ff1661164c5760405162461bcd60e51b815260206004820152601460248201527f53616c65206973206e6f74206f70656e2079657400000000000000000000000060448201526064016109de565b60008311801561165e5750600f548311155b6116f65760405162461bcd60e51b815260206004820152605a60248201527f4d696e696d756d20312026204d6178696d756d2053696e676c6520507572636860448201527f61736520436f756e74206f6620527567676564426f726564417065732063616e60648201527f206265206d696e74656420706572207472616e73616374696f6e000000000000608482015260a4016109de565b6000805b82518110156118605760006013600085848151811061171b5761171b6142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052908160008201805461175e906142b8565b80601f016020809104026020016040519081016040528092919081815260200182805461178a906142b8565b80156117d75780601f106117ac576101008083540402835291602001916117d7565b820191906000526020600020905b8154815290600101906020018083116117ba57829003601f168201915b505050918352505060018201546001600160a01b03166020820152600282015460408083019190915260038301546060830152600490920154608090910152810151909150606490611829908261436b565b6010546118369190614382565b61184091906143b7565b61184a9084614353565b925050808061185890614338565b9150506116fa565b508151841115611890576010548251611879908661436b565b6118839190614382565b61188d9082614353565b90505b803410156119065760405162461bcd60e51b815260206004820152602f60248201527f45746865722073656e7420776974682074686973207472616e73616374696f6e60448201527f206973206e6f7420636f7272656374000000000000000000000000000000000060648201526084016109de565b60005b8251811015611b67576000838281518110611926576119266142f3565b60200260200101519050600060136000868581518110611948576119486142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a001604052908160008201805461198b906142b8565b80601f01602080910402602001604051908101604052809291908181526020018280546119b7906142b8565b8015611a045780601f106119d957610100808354040283529160200191611a04565b820191906000526020600020905b8154815290600101906020018083116119e757829003601f168201915b505050918352505060018201546001600160a01b031660208201526002820154604082015260038201546060820152600490910154608091820152810151875191925090879085908110611a5a57611a5a6142f3565b60200260200101518260600151611a719190614353565b11611b5257816001600160a01b03166342842e0e89601560009054906101000a90046001600160a01b0316898781518110611aae57611aae6142f3565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611b0857600080fd5b505af1158015611b1c573d6000803e3d6000fd5b50505050611b5288878581518110611b3657611b366142f3565b60200260200101518360600151611b4d9190614353565b6132db565b50508080611b5f90614338565b915050611909565b508151841115611c5b57600d5484611b7e600b5490565b600c54611b8b9190614353565b611b959190614353565b1115611c095760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e742e204578636565647320616c6c6f7761626c65207360448201527f7570706c79206f6620524241000000000000000000000000000000000000000060648201526084016109de565b60005b8351611c18908661436b565b811015611c5957611c2d600b80546001019055565b611c4786611c3a600b5490565b600c54611b4d9190614353565b80611c5181614338565b915050611c0c565b505b50611f8d565b60005b8151811015611ea6576000828281518110611c8157611c816142f3565b60200260200101519050600060136000858581518110611ca357611ca36142f3565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020016000206040518060a0016040529081600082018054611ce6906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054611d12906142b8565b8015611d5f5780601f10611d3457610100808354040283529160200191611d5f565b820191906000526020600020905b815481529060010190602001808311611d4257829003601f168201915b505050918352505060018201546001600160a01b031660208201526002820154604082015260038201546060820152600490910154608091820152810151865191925090869085908110611db557611db56142f3565b60200260200101518260600151611dcc9190614353565b11611e9157816001600160a01b03166342842e0e88601560009054906101000a90046001600160a01b0316888781518110611e0957611e096142f3565b60209081029190910101516040516001600160e01b031960e086901b1681526001600160a01b0393841660048201529290911660248301526044820152606401600060405180830381600087803b158015611e6357600080fd5b505af1158015611e77573d6000803e3d6000fd5b50505050611e9187868581518110611b3657611b366142f3565b50508080611e9e90614338565b915050611c64565b508051831115611f8d57600d5483611ebd600b5490565b600c54611eca9190614353565b611ed49190614353565b1115611f485760405162461bcd60e51b815260206004820152602c60248201527f43616e6e6f74206d696e742e204578636565647320616c6c6f7761626c65207360448201527f7570706c79206f6620524241000000000000000000000000000000000000000060648201526084016109de565b60005b8251611f57908561436b565b811015611f8b57611f6c600b80546001019055565b611f7985611c3a600b5490565b80611f8381614338565b915050611f4b565b505b50505050565b60006001600160a01b0382166120115760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560448201527f726f20616464726573730000000000000000000000000000000000000000000060648201526084016109de565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146120875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b61209160006132f5565b565b6060600080600080600060136000886001600160a01b03166001600160a01b031681526020019081526020016000206040518060a00160405290816000820180546120dd906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612109906142b8565b80156121565780601f1061212b57610100808354040283529160200191612156565b820191906000526020600020905b81548152906001019060200180831161213957829003601f168201915b505050918352505060018201546001600160a01b03166020808301919091526002830154604080840191909152600384015460608085019190915260049094015460809384015284519185015190850151938501519490920151909b919a50919850919650945092505050565b600a546001600160a01b0316331461221d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b604051600090339047908381818185875af1925050503d806000811461225f576040519150601f19603f3d011682016040523d82523d6000602084013e612264565b606091505b50509050806122b55760405162461bcd60e51b815260206004820152601060248201527f5472616e73666572206661696c65642e0000000000000000000000000000000060448201526064016109de565b50565b600a546001600160a01b031633146123125760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600d55565b6060600061232483611f93565b905060008167ffffffffffffffff81111561234157612341613e27565b60405190808252806020026020018201604052801561236a578160200160208202803683370190505b50905060005b828110156123b1576123828582610f08565b828281518110612394576123946142f3565b6020908102919091010152806123a981614338565b915050612370565b509392505050565b600a546001600160a01b031633146124135760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b601055565b6060600180546108d5906142b8565b6113e0338383613354565b606060008267ffffffffffffffff81111561244f5761244f613e27565b604051908082528060200260200182016040528015612478578160200160208202803683370190505b5090506000805b6014548110156126185760006014828154811061249e5761249e6142f3565b60009182526020822060059190910201600101546040516370a0823160e01b81526001600160a01b038a81166004830152909116925082906370a0823190602401602060405180830381865afa1580156124fc573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125209190614309565b905080156126035760005b818110156125f5576040517f2f745c590000000000000000000000000000000000000000000000000000000081526001600160a01b038a8116600483015260248201839052841690632f745c5990604401602060405180830381865afa158015612599573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906125bd9190614309565b866125c88784614353565b815181106125d8576125d86142f3565b6020908102919091010152806125ed81614338565b91505061252b565b506126008185614353565b93505b5050808061261090614338565b91505061247f565b5090949350505050565b6014818154811061263257600080fd5b9060005260206000209060050201600091509050806000018054612655906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612681906142b8565b80156126ce5780601f106126a3576101008083540402835291602001916126ce565b820191906000526020600020905b8154815290600101906020018083116126b157829003601f168201915b5050505060018301546002840154600385015460049095015493946001600160a01b039092169390925085565b6127053383612fee565b6127775760405162461bcd60e51b815260206004820152603160248201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656400000000000000000000000000000060648201526084016109de565b611f8d84848484613423565b600a546001600160a01b031633146127dd5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b80600e60008282546127ef9190614353565b909155505050565b6000818152600260205260409020546060906001600160a01b03166128845760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201527f6e6578697374656e7420746f6b656e000000000000000000000000000000000060648201526084016109de565b600061288e6134ac565b905060008151116128ae57604051806020016040528060008152506128d9565b806128b8846134bb565b6040516020016128c99291906143cb565b6040516020818303038152906040525b9392505050565b600a546001600160a01b0316331461293a5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038316600090815260136020526040808220815160a0810190925280548290829061296b906142b8565b80601f0160208091040260200160405190810160405280929190818152602001828054612997906142b8565b80156129e45780601f106129b9576101008083540402835291602001916129e4565b820191906000526020600020905b8154815290600101906020018083116129c757829003601f168201915b505050505081526020016001820160009054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020016002820154815260200160038201548152602001600482015481525050905082828080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201829052509385525050506001600160a01b0385168152601360209081526040909120825180518493612aa0928492910190613b9f565b50602082015160018201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055604080830151600283015560608301516003830155608090920151600490910155517fe0c728715c689d714bcae366c84d96fd3cce5044789898c270be3735b1c4ea5090612b2790869086908690614425565b60405180910390a150505050565b600a546001600160a01b03163314612b8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6040805160c06020601f8901819004028201810190925260a081018781526014928291908a908a908190850183828082843760009201829052509385525050506001600160a01b03881660208084019190915260408301889052606083018790526080909201859052835460018101855593815281902082518051939460050290910192612c209284920190613b9f565b506020828101516001830180546001600160a01b0390921673ffffffffffffffffffffffffffffffffffffffff19909216919091179055604080840151600284015560608401516003840155608090930151600490920191909155815160c0601f89018390049092028101820190925260a082018781528291899089908190850183828082843760009201829052509385525050506001600160a01b0387166020808401829052604080850189905260608501889052608090940186905290825260138152919020825180519192612cfd92849290910190613b9f565b50602082015160018201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091179055604080830151600283015560608301516003830155608090920151600490910155517fd1dfbaf3a673062305bd1a7457937f8986985cac2866daf1aee50b0705ca817390612d8a90889088908890889088908890614451565b60405180910390a1505050505050565b600a546001600160a01b03163314612df45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b6001600160a01b038116612e705760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109de565b6122b5816132f5565b600a546001600160a01b03163314612ed35760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109de565b600c55565b60006001600160e01b031982167f80ac58cd000000000000000000000000000000000000000000000000000000001480612f3b57506001600160e01b031982167f5b5e139f00000000000000000000000000000000000000000000000000000000145b806108c057507f01ffc9a7000000000000000000000000000000000000000000000000000000006001600160e01b03198316146108c0565b6000818152600460205260409020805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0384169081179091558190612fb5826113e4565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166130785760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201527f697374656e7420746f6b656e000000000000000000000000000000000000000060648201526084016109de565b6000613083836113e4565b9050806001600160a01b0316846001600160a01b031614806130be5750836001600160a01b03166130b384610958565b6001600160a01b0316145b806130ee57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316613109826113e4565b6001600160a01b0316146131855760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201527f6f776e657200000000000000000000000000000000000000000000000000000060648201526084016109de565b6001600160a01b0382166132005760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016109de565b61320b8383836135ed565b613216600082612f73565b6001600160a01b038316600090815260036020526040812080546001929061323f90849061436b565b90915550506001600160a01b038216600090815260036020526040812080546001929061326d908490614353565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b6113e08282604051806020016040528060008152506136a5565b600a80546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156133b65760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109de565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61342e8484846130f6565b61343a8484848461372e565b611f8d5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b6060601180546108d5906142b8565b6060816134fb57505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115613525578061350f81614338565b915061351e9050600a836143b7565b91506134ff565b60008167ffffffffffffffff81111561354057613540613e27565b6040519080825280601f01601f19166020018201604052801561356a576020820181803683370190505b5090505b84156130ee5761357f60018361436b565b915061358c600a86614493565b613597906030614353565b60f81b8183815181106135ac576135ac6142f3565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506135e6600a866143b7565b945061356e565b6001600160a01b0383166136485761364381600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61366b565b816001600160a01b0316836001600160a01b03161461366b5761366b83826138b4565b6001600160a01b03821661368257610b3081613951565b826001600160a01b0316826001600160a01b031614610b3057610b308282613a00565b6136af8383613a44565b6136bc600084848461372e565b610b305760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b60006001600160a01b0384163b156138a9576040517f150b7a020000000000000000000000000000000000000000000000000000000081526001600160a01b0385169063150b7a029061378b9033908990889088906004016144a7565b6020604051808303816000875af19250505080156137c6575060408051601f3d908101601f191682019092526137c3918101906144d9565b60015b613876573d8080156137f4576040519150601f19603f3d011682016040523d82523d6000602084013e6137f9565b606091505b50805161386e5760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527f63656976657220696d706c656d656e746572000000000000000000000000000060648201526084016109de565b805181602001fd5b6001600160e01b0319167f150b7a02000000000000000000000000000000000000000000000000000000001490506130ee565b506001949350505050565b600060016138c184611f93565b6138cb919061436b565b60008381526007602052604090205490915080821461391e576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906139639060019061436b565b6000838152600960205260408120546008805493945090928490811061398b5761398b6142f3565b9060005260206000200154905080600883815481106139ac576139ac6142f3565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806139e4576139e46144f6565b6001900381819060005260206000200160009055905550505050565b6000613a0b83611f93565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b038216613a9a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109de565b6000818152600260205260409020546001600160a01b031615613aff5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109de565b613b0b600083836135ed565b6001600160a01b0382166000908152600360205260408120805460019290613b34908490614353565b9091555050600081815260026020526040808220805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054613bab906142b8565b90600052602060002090601f016020900481019282613bcd5760008555613c13565b82601f10613be657805160ff1916838001178555613c13565b82800160010185558215613c13579182015b82811115613c13578251825591602001919060010190613bf8565b50613c1f929150613c23565b5090565b5b80821115613c1f5760008155600101613c24565b6001600160e01b0319811681146122b557600080fd5b600060208284031215613c6057600080fd5b81356128d981613c38565b60005b83811015613c86578181015183820152602001613c6e565b83811115611f8d5750506000910152565b60008151808452613caf816020860160208601613c6b565b601f01601f19169290920160200192915050565b6020815260006128d96020830184613c97565b600060208284031215613ce857600080fd5b5035919050565b80356001600160a01b0381168114613d0657600080fd5b919050565b60008060408385031215613d1e57600080fd5b613d2783613cef565b946020939093013593505050565b600080600060608486031215613d4a57600080fd5b613d5384613cef565b9250613d6160208501613cef565b9150604084013590509250925092565b600060208284031215613d8357600080fd5b6128d982613cef565b600081518084526020808501945080840160005b83811015613dbc57815187529582019590820190600101613da0565b509495945050505050565b604080825283519082018190526000906020906060840190828701845b82811015613e095781516001600160a01b031684529284019290840190600101613de4565b50505083810382850152613e1d8186613d8c565b9695505050505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613e6657613e66613e27565b604052919050565b600067ffffffffffffffff831115613e8857613e88613e27565b613e9b6020601f19601f86011601613e3d565b9050828152838383011115613eaf57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613ed857600080fd5b813567ffffffffffffffff811115613eef57600080fd5b8201601f81018413613f0057600080fd5b6130ee84823560208401613e6e565b600067ffffffffffffffff821115613f2957613f29613e27565b5060051b60200190565b600082601f830112613f4457600080fd5b81356020613f59613f5483613f0f565b613e3d565b82815260059290921b84018101918181019086841115613f7857600080fd5b8286015b84811015613f9a57613f8d81613cef565b8352918301918301613f7c565b509695505050505050565b60008060008060808587031215613fbb57600080fd5b613fc485613cef565b93506020808601359350604086013567ffffffffffffffff80821115613fe957600080fd5b818801915088601f830112613ffd57600080fd5b813561400b613f5482613f0f565b81815260059190911b8301840190848101908b83111561402a57600080fd5b938501935b828510156140485784358252938501939085019061402f565b96505050606088013592508083111561406057600080fd5b505061406e87828801613f33565b91505092959194509250565b60a08152600061408d60a0830188613c97565b90506001600160a01b03861660208301528460408301528360608301528260808301529695505050505050565b6020815260006128d96020830184613d8c565b600080604083850312156140e057600080fd5b6140e983613cef565b9150602083013580151581146140fe57600080fd5b809150509250929050565b6000806000806080858703121561411f57600080fd5b61412885613cef565b935061413660208601613cef565b925060408501359150606085013567ffffffffffffffff81111561415957600080fd5b8501601f8101871361416a57600080fd5b61406e87823560208401613e6e565b60008083601f84011261418b57600080fd5b50813567ffffffffffffffff8111156141a357600080fd5b6020830191508360208285010111156141bb57600080fd5b9250929050565b6000806000604084860312156141d757600080fd5b6141e084613cef565b9250602084013567ffffffffffffffff8111156141fc57600080fd5b61420886828701614179565b9497909650939450505050565b60008060008060008060a0878903121561422e57600080fd5b863567ffffffffffffffff81111561424557600080fd5b61425189828a01614179565b9097509550614264905060208801613cef565b93506040870135925060608701359150608087013590509295509295509295565b6000806040838503121561429857600080fd5b6142a183613cef565b91506142af60208401613cef565b90509250929050565b600181811c908216806142cc57607f821691505b602082108114156142ed57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b60006020828403121561431b57600080fd5b5051919050565b634e487b7160e01b600052601160045260246000fd5b600060001982141561434c5761434c614322565b5060010190565b6000821982111561436657614366614322565b500190565b60008282101561437d5761437d614322565b500390565b600081600019048311821515161561439c5761439c614322565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826143c6576143c66143a1565b500490565b600083516143dd818460208801613c6b565b8351908301906143f1818360208801613c6b565b01949350505050565b818352818160208501375060006020828401015260006020601f19601f840116840101905092915050565b6001600160a01b03841681526040602082015260006144486040830184866143fa565b95945050505050565b60a08152600061446560a08301888a6143fa565b90506001600160a01b0386166020830152846040830152836060830152826080830152979650505050505050565b6000826144a2576144a26143a1565b500690565b60006001600160a01b03808716835280861660208401525083604083015260806060830152613e1d6080830184613c97565b6000602082840312156144eb57600080fd5b81516128d981613c38565b634e487b7160e01b600052603160045260246000fdfea26469706673582212208015aa2bf9ec3b12715572061f665ff119ecafba545f6f9f2376a2bf9c1d38aa64736f6c634300080c0033

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

0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004068747470733a2f2f617277656176652e6e65742f2d7276546e585a773530705a63386965654a6f4153556f425150423376652d4f6c496b58545047496e79552f

-----Decoded View---------------
Arg [0] : baseURI (string): https://arweave.net/-rvTnXZw50pZc8ieeJoASUoBQPB3ve-OlIkXTPGInyU/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [2] : 68747470733a2f2f617277656176652e6e65742f2d7276546e585a773530705a
Arg [3] : 63386965654a6f4153556f425150423376652d4f6c496b58545047496e79552f


Deployed Bytecode Sourcemap

47012:10428:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40779:224;;;;;;;;;;-1:-1:-1;40779:224:0;;;;;:::i;:::-;;:::i;:::-;;;611:14:1;;604:22;586:41;;574:2;559:18;40779:224:0;;;;;;;;47267:38;;;;;;;;;;;;;;;;;;;784:25:1;;;772:2;757:18;47267:38:0;638:177:1;27599:100:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;29158:221::-;;;;;;;;;;-1:-1:-1;29158:221:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1979:55:1;;;1961:74;;1949:2;1934:18;29158:221:0;1815:226:1;28681:411:0;;;;;;;;;;-1:-1:-1;28681:411:0;;;;;:::i;:::-;;:::i;:::-;;49296:151;;;;;;;;;;-1:-1:-1;49296:151:0;;;;;:::i;:::-;;:::i;41419:113::-;;;;;;;;;;-1:-1:-1;41507:10:0;:17;41419:113;;29908:339;;;;;;;;;;-1:-1:-1;29908:339:0;;;;;:::i;:::-;;:::i;53539:1449::-;;;;;;;;;;-1:-1:-1;53539:1449:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;41087:256::-;;;;;;;;;;-1:-1:-1;41087:256:0;;;;;:::i;:::-;;:::i;49502:83::-;;;;;;;;;;;;;:::i;47233:27::-;;;;;;;;;;;;;;;;56624:409;;;;;;;;;;-1:-1:-1;56624:409:0;;;;;:::i;:::-;;:::i;30318:185::-;;;;;;;;;;-1:-1:-1;30318:185:0;;;;;:::i;:::-;;:::i;47196:30::-;;;;;;;;;;;;;;;;49158:130;;;;;;;;;;-1:-1:-1;49158:130:0;;;;;:::i;:::-;;:::i;41609:233::-;;;;;;;;;;-1:-1:-1;41609:233:0;;;;;:::i;:::-;;:::i;48602:101::-;;;;;;;;;;-1:-1:-1;48602:101:0;;;;;:::i;:::-;;:::i;27293:239::-;;;;;;;;;;-1:-1:-1;27293:239:0;;;;;:::i;:::-;;:::i;49825:3581::-;;;;;;:::i;:::-;;:::i;27023:208::-;;;;;;;;;;-1:-1:-1;27023:208:0;;;;;:::i;:::-;;:::i;6195:103::-;;;;;;;;;;;;;:::i;56234:382::-;;;;;;;;;;-1:-1:-1;56234:382:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;;;:::i;49593:176::-;;;;;;;;;;;;;:::i;48937:113::-;;;;;;;;;;-1:-1:-1;48937:113:0;;;;;:::i;:::-;;:::i;5544:87::-;;;;;;;;;;-1:-1:-1;5617:6:0;;-1:-1:-1;;;;;5617:6:0;5544:87;;48222:372;;;;;;;;;;-1:-1:-1;48222:372:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;48711:89::-;;;;;;;;;;-1:-1:-1;48711:89:0;;;;;:::i;:::-;;:::i;27768:104::-;;;;;;;;;;;;;:::i;47396:28::-;;;;;;;;;;-1:-1:-1;47396:28:0;;;;;;;;47312:37;;;;;;;;;;;;;;;;29451:155;;;;;;;;;;-1:-1:-1;29451:155:0;;;;;:::i;:::-;;:::i;54996:715::-;;;;;;;;;;-1:-1:-1;54996:715:0;;;;;:::i;:::-;;:::i;47157:32::-;;;;;;;;;;;;;;;;47668:43;;;;;;;;;;-1:-1:-1;47668:43:0;;;;;:::i;:::-;;:::i;30574:328::-;;;;;;;;;;-1:-1:-1;30574:328:0;;;;;:::i;:::-;;:::i;49058:92::-;;;;;;;;;;-1:-1:-1;49058:92:0;;;;;:::i;:::-;;:::i;27943:334::-;;;;;;;;;;-1:-1:-1;27943:334:0;;;;;:::i;:::-;;:::i;57041:396::-;;;;;;;;;;-1:-1:-1;57041:396:0;;;;;:::i;:::-;;:::i;55719:507::-;;;;;;;;;;-1:-1:-1;55719:507:0;;;;;:::i;:::-;;:::i;29677:164::-;;;;;;;;;;-1:-1:-1;29677:164:0;;;;;:::i;:::-;-1:-1:-1;;;;;29798:25:0;;;29774:4;29798:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;29677:164;6453:201;;;;;;;;;;-1:-1:-1;6453:201:0;;;;;:::i;:::-;;:::i;48808:121::-;;;;;;;;;;-1:-1:-1;48808:121:0;;;;;:::i;:::-;;:::i;47718:31::-;;;;;;;;;;-1:-1:-1;47718:31:0;;;;-1:-1:-1;;;;;47718:31:0;;;40779:224;40881:4;-1:-1:-1;;;;;;40905:50:0;;40920:35;40905:50;;:90;;;40959:36;40983:11;40959:23;:36::i;:::-;40898:97;40779:224;-1:-1:-1;;40779:224:0:o;27599:100::-;27653:13;27686:5;27679:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27599:100;:::o;29158:221::-;29234:7;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;29254:73;;;;-1:-1:-1;;;29254:73:0;;12231:2:1;29254:73:0;;;12213:21:1;12270:2;12250:18;;;12243:30;12309:34;12289:18;;;12282:62;12380:14;12360:18;;;12353:42;12412:19;;29254:73:0;;;;;;;;;-1:-1:-1;29347:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;29347:24:0;;29158:221::o;28681:411::-;28762:13;28778:23;28793:7;28778:14;:23::i;:::-;28762:39;;28826:5;-1:-1:-1;;;;;28820:11:0;:2;-1:-1:-1;;;;;28820:11:0;;;28812:57;;;;-1:-1:-1;;;28812:57:0;;12644:2:1;28812:57:0;;;12626:21:1;12683:2;12663:18;;;12656:30;12722:34;12702:18;;;12695:62;12793:3;12773:18;;;12766:31;12814:19;;28812:57:0;12442:397:1;28812:57:0;4348:10;-1:-1:-1;;;;;28904:21:0;;;;:62;;-1:-1:-1;28929:37:0;28946:5;4348:10;29677:164;:::i;28929:37::-;28882:168;;;;-1:-1:-1;;;28882:168:0;;13046:2:1;28882:168:0;;;13028:21:1;13085:2;13065:18;;;13058:30;13124:34;13104:18;;;13097:62;13195:26;13175:18;;;13168:54;13239:19;;28882:168:0;12844:420:1;28882:168:0;29063:21;29072:2;29076:7;29063:8;:21::i;:::-;28751:341;28681:411;;:::o;49296:151::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49391:22:::1;:48:::0;49296:151::o;29908:339::-;30103:41;4348:10;30136:7;30103:18;:41::i;:::-;30095:103;;;;-1:-1:-1;;;30095:103:0;;13832:2:1;30095:103:0;;;13814:21:1;13871:2;13851:18;;;13844:30;13910:34;13890:18;;;13883:62;13981:19;13961:18;;;13954:47;14018:19;;30095:103:0;13630:413:1;30095:103:0;30211:28;30221:4;30227:2;30231:7;30211:9;:28::i;53539:1449::-;53596:16;;53639:32;;53682:322;53703:17;:24;53699:28;;53682:322;;;53749:25;53794:17;53812:1;53794:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;53866:24;;-1:-1:-1;;;53866:24:0;;-1:-1:-1;;;;;1979:55:1;;;53866:24:0;;;1961:74:1;53794:36:0;;;;-1:-1:-1;53794:36:0;;53866:18;;1934::1;;53866:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;53846:44;-1:-1:-1;53911:16:0;;53907:86;;53948:29;;;;:::i;:::-;;;;53907:86;53734:270;;53729:3;;;;;:::i;:::-;;;;53682:322;;;-1:-1:-1;54020:31:0;;54016:965;;54068:39;54124:27;54110:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54110:42:0;;54068:84;;54167:24;54205:27;54194:39;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54194:39:0;-1:-1:-1;54167:66:0;-1:-1:-1;54248:33:0;;54296:542;54317:17;:24;54313:28;;54296:542;;;54367:25;54412:17;54430:1;54412:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;54489:24;;-1:-1:-1;;;54489:24:0;;-1:-1:-1;;;;;1979:55:1;;;54489:24:0;;;1961:74:1;54412:36:0;;;;-1:-1:-1;54412:36:0;;54489:18;;1934::1;;54489:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;54468:45;-1:-1:-1;54538:17:0;;54534:289;;54635:17;54653:1;54635:20;;;;;;;;:::i;:::-;;;;;;;;;;;:36;;;;;;;;;;-1:-1:-1;;;;;54635:36:0;54580:22;54603:28;54580:52;;;;;;;;:::i;:::-;;;;;;:91;-1:-1:-1;;;;;54580:91:0;;;-1:-1:-1;;;;;54580:91:0;;;;;54737:13;54694:10;54705:28;54694:40;;;;;;;;:::i;:::-;;;;;;;;;;:56;54773:30;;;;:::i;:::-;;;;54534:289;54348:490;;54343:3;;;;;:::i;:::-;;;;54296:542;;;-1:-1:-1;54862:22:0;;54886:10;;-1:-1:-1;53539:1449:0;-1:-1:-1;;;;53539:1449:0:o;54016:965::-;-1:-1:-1;;54937:16:0;;;54951:1;54937:16;;;;;;54955:13;;;;;;;;;54937:16;;;-1:-1:-1;53539:1449:0;-1:-1:-1;53539:1449:0:o;41087:256::-;41184:7;41220:23;41237:5;41220:16;:23::i;:::-;41212:5;:31;41204:87;;;;-1:-1:-1;;;41204:87:0;;15017:2:1;41204:87:0;;;14999:21:1;15056:2;15036:18;;;15029:30;15095:34;15075:18;;;15068:62;15166:13;15146:18;;;15139:41;15197:19;;41204:87:0;14815:407:1;41204:87:0;-1:-1:-1;;;;;;41309:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;41087:256::o;49502:83::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49569:8:::1;::::0;;-1:-1:-1;;49557:20:0;::::1;49569:8;::::0;;::::1;49568:9;49557:20;::::0;;49502:83::o;56624:409::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;-1:-1:-1;;;;;56782:41:0;::::1;56739:40;56782:41:::0;;;:23:::1;:41;::::0;;;;;56739:84;;::::1;::::0;::::1;::::0;;;;;;;56782:41;;56739:84:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;56739:84:0;;;-1:-1:-1;;56739:84:0::1;::::0;::::1;::::0;-1:-1:-1;;;;;56739:84:0;;::::1;;::::0;;::::1;::::0;;;;::::1;::::0;::::1;::::0;;;;;;;;;::::1;::::0;::::1;::::0;;;;;::::1;::::0;;::::1;::::0;;;;;;;;;56834:25;;::::1;:40:::0;;;56887:41;::::1;56739:84;56887:41:::0;;;:23:::1;:41:::0;;;;;;:60;;;;56739:84;;-1:-1:-1;56739:84:0;;56887:41;;:60:::1;::::0;:41;;:60;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;56887:60:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;56887:60:0::1;-1:-1:-1::0;;;;;56887:60:0;;::::1;;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;56963:62;;15419:55:1;;;15401:74;;15491:18;;15484:34;;;56963:62:0::1;::::0;15374:18:1;56963:62:0::1;;;;;;;56728:305;56624:409:::0;;:::o;30318:185::-;30456:39;30473:4;30479:2;30483:7;30456:39;;;;;;;;;;;;:16;:39::i;49158:130::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49244:16:::1;:36:::0;;-1:-1:-1;;49244:36:0::1;-1:-1:-1::0;;;;;49244:36:0;;;::::1;::::0;;;::::1;::::0;;49158:130::o;41609:233::-;41684:7;41720:30;41507:10;:17;;41419:113;41720:30;41712:5;:38;41704:95;;;;-1:-1:-1;;;41704:95:0;;15731:2:1;41704:95:0;;;15713:21:1;15770:2;15750:18;;;15743:30;15809:34;15789:18;;;15782:62;15880:14;15860:18;;;15853:42;15912:19;;41704:95:0;15529:408:1;41704:95:0;41817:10;41828:5;41817:17;;;;;;;;:::i;:::-;;;;;;;;;41810:24;;41609:233;;;:::o;48602:101::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;48673:22;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;48602:101:::0;:::o;27293:239::-;27365:7;27401:16;;;:7;:16;;;;;;-1:-1:-1;;;;;27401:16:0;27436:19;27428:73;;;;-1:-1:-1;;;27428:73:0;;16144:2:1;27428:73:0;;;16126:21:1;16183:2;16163:18;;;16156:30;16222:34;16202:18;;;16195:62;16293:11;16273:18;;;16266:39;16322:19;;27428:73:0;15942:405:1;49825:3581:0;50000:24;:31;49990:6;:41;;49982:107;;;;-1:-1:-1;;;49982:107:0;;16554:2:1;49982:107:0;;;16536:21:1;16593:2;16573:18;;;16566:30;16632:34;16612:18;;;16605:62;16703:23;16683:18;;;16676:51;16744:19;;49982:107:0;16352:417:1;49982:107:0;50134:24;:31;50108:15;:22;:57;50100:109;;;;-1:-1:-1;;;50100:109:0;;16976:2:1;50100:109:0;;;16958:21:1;17015:2;16995:18;;;16988:30;17054:34;17034:18;;;17027:62;17125:9;17105:18;;;17098:37;17152:19;;50100:109:0;16774:403:1;50100:109:0;50254:7;;50244:6;50228:13;41507:10;:17;;41419:113;50228:13;:22;;;;:::i;:::-;:33;;50220:87;;;;-1:-1:-1;;;50220:87:0;;17517:2:1;50220:87:0;;;17499:21:1;17556:2;17536:18;;;17529:30;17595:34;17575:18;;;17568:62;17666:11;17646:18;;;17639:39;17695:19;;50220:87:0;17315:405:1;50220:87:0;5617:6;;-1:-1:-1;;;;;5617:6:0;50322:10;:21;50318:3074;;50368:8;;;;50360:41;;;;-1:-1:-1;;;50360:41:0;;17927:2:1;50360:41:0;;;17909:21:1;17966:2;17946:18;;;17939:30;18005:22;17985:18;;;17978:50;18045:18;;50360:41:0;17725:344:1;50360:41:0;50433:1;50424:6;:10;:46;;;;;50448:22;;50438:6;:32;;50424:46;50416:149;;;;-1:-1:-1;;;50416:149:0;;18276:2:1;50416:149:0;;;18258:21:1;18315:2;18295:18;;;18288:30;18354:34;18334:18;;;18327:62;18425:34;18405:18;;;18398:62;18497:28;18476:19;;;18469:57;18543:19;;50416:149:0;18074:494:1;50416:149:0;50623:15;;50655:269;50676:24;:31;50672:1;:35;50655:269;;;50733:41;50777:23;:52;50801:24;50826:1;50801:27;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;50777:52:0;-1:-1:-1;;;;;50777:52:0;;;;;;;;;;;;50733:96;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;50733:96:0;;;-1:-1:-1;;50733:96:0;;;;-1:-1:-1;;;;;50733:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50877:26;;;50733:96;;-1:-1:-1;50905:3:0;;50871:32;;50905:3;50871:32;:::i;:::-;50862:5;;:42;;;;:::i;:::-;:46;;;;:::i;:::-;50848:60;;;;:::i;:::-;;;50714:210;50709:3;;;;;:::i;:::-;;;;50655:269;;;;50953:24;:31;50944:6;:40;50940:145;;;51064:5;;51029:31;;51020:40;;:6;:40;:::i;:::-;51019:50;;;;:::i;:::-;51005:64;;;;:::i;:::-;;;50940:145;51120:10;51107:9;:23;;51099:83;;;;-1:-1:-1;;;51099:83:0;;19452:2:1;51099:83:0;;;19434:21:1;19491:2;19471:18;;;19464:30;19530:34;19510:18;;;19503:62;19601:17;19581:18;;;19574:45;19636:19;;51099:83:0;19250:411:1;51099:83:0;51233:6;51228:605;51249:24;:31;51245:1;:35;51228:605;;;51306:25;51351:24;51376:1;51351:27;;;;;;;;:::i;:::-;;;;;;;51306:73;;51398:41;51442:23;:52;51466:24;51491:1;51466:27;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;51442:52:0;-1:-1:-1;;;;;51442:52:0;;;;;;;;;;;;51398:96;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;51398:96:0;;;-1:-1:-1;;51398:96:0;;;;-1:-1:-1;;;;;51398:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51590:26;;;51567:18;;51398:96;;-1:-1:-1;51590:26:0;51567:15;;51583:1;;51567:18;;;;;;:::i;:::-;;;;;;;51536:17;:28;;;:49;;;;:::i;:::-;51535:81;51531:286;;51641:8;-1:-1:-1;;;;;51641:25:0;;51667:3;51672:16;;;;;;;;;-1:-1:-1;;;;;51672:16:0;51690:15;51706:1;51690:18;;;;;;;;:::i;:::-;;;;;;;;;;;51641:68;;-1:-1:-1;;;;;;51641:68:0;;;;;;;-1:-1:-1;;;;;19947:15:1;;;51641:68:0;;;19929:34:1;19999:15;;;;19979:18;;;19972:43;20031:18;;;20024:34;19841:18;;51641:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51732:65;51742:3;51778:15;51794:1;51778:18;;;;;;;;:::i;:::-;;;;;;;51747:17;:28;;;:49;;;;:::i;:::-;51732:9;:65::i;:::-;51287:546;;51282:3;;;;;:::i;:::-;;;;51228:605;;;;51862:24;:31;51853:6;:40;51849:425;;;51977:11;;51966:6;51944:18;:8;964:14;;872:114;51944:18;51923:13;;:40;;;;:::i;:::-;:49;;;;:::i;:::-;51922:66;;51914:123;;;;-1:-1:-1;;;51914:123:0;;20271:2:1;51914:123:0;;;20253:21:1;20310:2;20290:18;;;20283:30;20349:34;20329:18;;;20322:62;20420:14;20400:18;;;20393:42;20452:19;;51914:123:0;20069:408:1;51914:123:0;52061:6;52056:203;52087:22;;52078:31;;:6;:31;:::i;:::-;52073:1;:37;52056:203;;;52140:20;:8;1083:19;;1101:1;1083:19;;;994:127;52140:20;52183:56;52193:3;52219:18;:8;964:14;;872:114;52219:18;52198:13;;:40;;;;:::i;52183:56::-;52112:3;;;;:::i;:::-;;;;52056:203;;;;51849:425;50345:1940;50318:3074;;;52340:6;52335:605;52356:24;:31;52352:1;:35;52335:605;;;52413:25;52458:24;52483:1;52458:27;;;;;;;;:::i;:::-;;;;;;;52413:73;;52505:41;52549:23;:52;52573:24;52598:1;52573:27;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;;;;52549:52:0;-1:-1:-1;;;;;52549:52:0;;;;;;;;;;;;52505:96;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;52505:96:0;;;-1:-1:-1;;52505:96:0;;;;-1:-1:-1;;;;;52505:96:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52697:26;;;52674:18;;52505:96;;-1:-1:-1;52697:26:0;52674:15;;52690:1;;52674:18;;;;;;:::i;:::-;;;;;;;52643:17;:28;;;:49;;;;:::i;:::-;52642:81;52638:286;;52748:8;-1:-1:-1;;;;;52748:25:0;;52774:3;52779:16;;;;;;;;;-1:-1:-1;;;;;52779:16:0;52797:15;52813:1;52797:18;;;;;;;;:::i;:::-;;;;;;;;;;;52748:68;;-1:-1:-1;;;;;;52748:68:0;;;;;;;-1:-1:-1;;;;;19947:15:1;;;52748:68:0;;;19929:34:1;19999:15;;;;19979:18;;;19972:43;20031:18;;;20024:34;19841:18;;52748:68:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52839:65;52849:3;52885:15;52901:1;52885:18;;;;;;;;:::i;52839:65::-;52394:546;;52389:3;;;;;:::i;:::-;;;;52335:605;;;;52969:24;:31;52960:6;:40;52956:425;;;53084:11;;53073:6;53051:18;:8;964:14;;872:114;53051:18;53030:13;;:40;;;;:::i;:::-;:49;;;;:::i;:::-;53029:66;;53021:123;;;;-1:-1:-1;;;53021:123:0;;20271:2:1;53021:123:0;;;20253:21:1;20310:2;20290:18;;;20283:30;20349:34;20329:18;;;20322:62;20420:14;20400:18;;;20393:42;20452:19;;53021:123:0;20069:408:1;53021:123:0;53168:6;53163:203;53194:22;;53185:31;;:6;:31;:::i;:::-;53180:1;:37;53163:203;;;53247:20;:8;1083:19;;1101:1;1083:19;;;994:127;53247:20;53290:56;53300:3;53326:18;:8;964:14;;872:114;53290:56;53219:3;;;;:::i;:::-;;;;53163:203;;;;52956:425;49825:3581;;;;:::o;27023:208::-;27095:7;-1:-1:-1;;;;;27123:19:0;;27115:74;;;;-1:-1:-1;;;27115:74:0;;20684:2:1;27115:74:0;;;20666:21:1;20723:2;20703:18;;;20696:30;20762:34;20742:18;;;20735:62;20833:12;20813:18;;;20806:40;20863:19;;27115:74:0;20482:406:1;27115:74:0;-1:-1:-1;;;;;;27207:16:0;;;;;:9;:16;;;;;;;27023:208::o;6195:103::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;56234:382::-;56312:13;56327:7;56336:4;56342;56349;56366:40;56409:23;:41;56433:16;-1:-1:-1;;;;;56409:41:0;-1:-1:-1;;;;;56409:41:0;;;;;;;;;;;;56366:84;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;56366:84:0;;;-1:-1:-1;;56366:84:0;;;;-1:-1:-1;;;;;56366:84:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56469:21;;56492:32;;;;56526:25;;;;56553:27;;;;56582:25;;;;;56469:21;;56492:32;;-1:-1:-1;56526:25:0;;-1:-1:-1;56553:27:0;;-1:-1:-1;56582:25:0;-1:-1:-1;56234:382:0;-1:-1:-1;;;56234:382:0:o;49593:176::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49665:49:::1;::::0;49647:12:::1;::::0;49665:10:::1;::::0;49688:21:::1;::::0;49647:12;49665:49;49647:12;49665:49;49688:21;49665:10;:49:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49646:68;;;49733:7;49725:36;;;::::0;-1:-1:-1;;;49725:36:0;;21305:2:1;49725:36:0::1;::::0;::::1;21287:21:1::0;21344:2;21324:18;;;21317:30;21383:18;21363;;;21356:46;21419:18;;49725:36:0::1;21103:340:1::0;49725:36:0::1;49635:134;49593:176::o:0;48937:113::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49013:11:::1;:29:::0;48937:113::o;48222:372::-;48313:13;48344:15;48362:17;48372:6;48362:9;:17::i;:::-;48344:35;;48392:22;48428:10;48417:22;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;48417:22:0;;48392:47;;48455:6;48450:109;48471:10;48467:1;:14;48450:109;;;48517:30;48537:6;48545:1;48517:19;:30::i;:::-;48503:8;48512:1;48503:11;;;;;;;;:::i;:::-;;;;;;;;;;:44;48483:3;;;;:::i;:::-;;;;48450:109;;;-1:-1:-1;48578:8:0;48222:372;-1:-1:-1;;;48222:372:0:o;48711:89::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;48775:5:::1;:17:::0;48711:89::o;27768:104::-;27824:13;27857:7;27850:14;;;;;:::i;29451:155::-;29546:52;4348:10;29579:8;29589;29546:18;:52::i;54996:715::-;55079:13;55105:22;55141:12;55130:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55130:24:0;-1:-1:-1;55105:49:0;-1:-1:-1;55165:15:0;;55191:487;55212:17;:24;55208:28;;55191:487;;;55258:25;55303:17;55321:1;55303:20;;;;;;;;:::i;:::-;;;;;;;;;;;;;;:36;;;55376:24;;-1:-1:-1;;;55376:24:0;;-1:-1:-1;;;;;1979:55:1;;;55376:24:0;;;1961:74:1;55303:36:0;;;;-1:-1:-1;55303:36:0;;55376:18;;1934::1;;55376:24:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55355:45;-1:-1:-1;55421:17:0;;55417:249;;55464:6;55459:146;55480:13;55476:1;:17;55459:146;;;55548:37;;;;;-1:-1:-1;;;;;15419:55:1;;;55548:37:0;;;15401:74:1;15491:18;;;15484:34;;;55548:28:0;;;;;15374:18:1;;55548:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;55523:8;55532:12;55534:10;55532:1;:12;:::i;:::-;55523:22;;;;;;;;:::i;:::-;;;;;;;;;;:62;55495:3;;;;:::i;:::-;;;;55459:146;;;-1:-1:-1;55623:27:0;55637:13;55623:27;;:::i;:::-;;;55417:249;55243:435;;55238:3;;;;;:::i;:::-;;;;55191:487;;;-1:-1:-1;55695:8:0;;54996:715;-1:-1:-1;;;;54996:715:0:o;47668:43::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;47668:43:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;47668:43:0;;;;;;-1:-1:-1;47668:43:0;:::o;30574:328::-;30749:41;4348:10;30782:7;30749:18;:41::i;:::-;30741:103;;;;-1:-1:-1;;;30741:103:0;;13832:2:1;30741:103:0;;;13814:21:1;13871:2;13851:18;;;13844:30;13910:34;13890:18;;;13883:62;13981:19;13961:18;;;13954:47;14018:19;;30741:103:0;13630:413:1;30741:103:0;30855:39;30869:4;30875:2;30879:7;30888:5;30855:13;:39::i;49058:92::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;49134:8:::1;49123:7;;:19;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;;49058:92:0:o;27943:334::-;32477:4;32501:16;;;:7;:16;;;;;;28016:13;;-1:-1:-1;;;;;32501:16:0;28042:76;;;;-1:-1:-1;;;28042:76:0;;21650:2:1;28042:76:0;;;21632:21:1;21689:2;21669:18;;;21662:30;21728:34;21708:18;;;21701:62;21799:17;21779:18;;;21772:45;21834:19;;28042:76:0;21448:411:1;28042:76:0;28131:21;28155:10;:8;:10::i;:::-;28131:34;;28207:1;28189:7;28183:21;:25;:86;;;;;;;;;;;;;;;;;28235:7;28244:18;:7;:16;:18::i;:::-;28218:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28183:86;28176:93;27943:334;-1:-1:-1;;;27943:334:0:o;57041:396::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;-1:-1:-1;;;;;57202:41:0;::::1;57159:40;57202:41:::0;;;:23:::1;:41;::::0;;;;;57159:84;;::::1;::::0;::::1;::::0;;;;;;;57202:41;;57159:84:::1;::::0;::::1;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;;;;57159:84:0::1;-1:-1:-1::0;;;;;57159:84:0::1;-1:-1:-1::0;;;;;57159:84:0::1;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;57278:8;;57254:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;-1:-1:-1;57254:32:0;;;-1:-1:-1;;;;;;;;57299:41:0;::::1;::::0;;:23:::1;:41;::::0;;;;;;;:60;;;;57254:16;;57299:60:::1;::::0;:41;;:60;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;57299:60:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;57299:60:0::1;-1:-1:-1::0;;;;;57299:60:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;57375:54;::::1;::::0;::::1;::::0;57402:16;;57420:8;;;;57375:54:::1;:::i;:::-;;;;;;;;57148:289;57041:396:::0;;;:::o;55719:507::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;55908:76:::1;::::0;;;::::1;;::::0;::::1;::::0;;::::1;;::::0;;;;;;;::::1;::::0;::::1;::::0;;;55885:17:::1;::::0;55908:76;;;55925:5;;;;;;55908:76;;55925:5;;;;55908:76;::::1;;::::0;::::1;::::0;;;-1:-1:-1;55908:76:0;;;-1:-1:-1;;;;;;;;55908:76:0;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;55885:100;;::::1;::::0;::::1;::::0;;;;;;;;;;;;;;::::1;;::::0;;::::1;::::0;::::1;::::0;;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55885:100:0::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;;;;55885:100:0;;::::1;-1:-1:-1::0;;55885:100:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;;;;56042:76;;;::::1;::::0;::::1;::::0;;::::1;::::0;;::::1;::::0;;;;;;;::::1;::::0;::::1;::::0;;;;;56059:5;;;;;;56042:76;;56059:5;;;;56042:76;::::1;;::::0;::::1;::::0;;;-1:-1:-1;56042:76:0;;;-1:-1:-1;;;;;;;;56042:76:0;::::1;;::::0;;::::1;::::0;;;;;;;;;;;;;;;;;;;;;;;55998:41;;;:23:::1;:41:::0;;;;;:120;;;;:41;;:120:::1;::::0;:41;;:120;;::::1;::::0;::::1;:::i;:::-;-1:-1:-1::0;55998:120:0::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;-1:-1:-1;;55998:120:0::1;-1:-1:-1::0;;;;;55998:120:0;;::::1;::::0;;;::::1;::::0;;::::1;::::0;;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;::::0;56134:84;::::1;::::0;::::1;::::0;56159:5;;;;56166:16;;56184:9;;56195:11;;56208:9;;56134:84:::1;:::i;:::-;;;;;;;;55719:507:::0;;;;;;:::o;6453:201::-;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;-1:-1:-1;;;;;6542:22:0;::::1;6534:73;;;::::0;-1:-1:-1;;;6534:73:0;;23832:2:1;6534:73:0::1;::::0;::::1;23814:21:1::0;23871:2;23851:18;;;23844:30;23910:34;23890:18;;;23883:62;23981:8;23961:18;;;23954:36;24007:19;;6534:73:0::1;23630:402:1::0;6534:73:0::1;6618:28;6637:8;6618:18;:28::i;48808:121::-:0;5617:6;;-1:-1:-1;;;;;5617:6:0;4348:10;5764:23;5756:68;;;;-1:-1:-1;;;5756:68:0;;13471:2:1;5756:68:0;;;13453:21:1;;;13490:18;;;13483:30;13549:34;13529:18;;;13522:62;13601:18;;5756:68:0;13269:356:1;5756:68:0;48888:13:::1;:33:::0;48808:121::o;26654:305::-;26756:4;-1:-1:-1;;;;;;26793:40:0;;26808:25;26793:40;;:105;;-1:-1:-1;;;;;;;26850:48:0;;26865:33;26850:48;26793:105;:158;;;-1:-1:-1;18452:25:0;-1:-1:-1;;;;;;18437:40:0;;;26915:36;18328:157;36558:174;36633:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;36633:29:0;-1:-1:-1;;;;;36633:29:0;;;;;;;;:24;;36687:23;36633:24;36687:14;:23::i;:::-;-1:-1:-1;;;;;36678:46:0;;;;;;;;;;;36558:174;;:::o;32706:348::-;32799:4;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;32816:73;;;;-1:-1:-1;;;32816:73:0;;24239:2:1;32816:73:0;;;24221:21:1;24278:2;24258:18;;;24251:30;24317:34;24297:18;;;24290:62;24388:14;24368:18;;;24361:42;24420:19;;32816:73:0;24037:408:1;32816:73:0;32900:13;32916:23;32931:7;32916:14;:23::i;:::-;32900:39;;32969:5;-1:-1:-1;;;;;32958:16:0;:7;-1:-1:-1;;;;;32958:16:0;;:51;;;;33002:7;-1:-1:-1;;;;;32978:31:0;:20;32990:7;32978:11;:20::i;:::-;-1:-1:-1;;;;;32978:31:0;;32958:51;:87;;;-1:-1:-1;;;;;;29798:25:0;;;29774:4;29798:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;33013:32;32950:96;32706:348;-1:-1:-1;;;;32706:348:0:o;35815:625::-;35974:4;-1:-1:-1;;;;;35947:31:0;:23;35962:7;35947:14;:23::i;:::-;-1:-1:-1;;;;;35947:31:0;;35939:81;;;;-1:-1:-1;;;35939:81:0;;24652:2:1;35939:81:0;;;24634:21:1;24691:2;24671:18;;;24664:30;24730:34;24710:18;;;24703:62;24801:7;24781:18;;;24774:35;24826:19;;35939:81:0;24450:401:1;35939:81:0;-1:-1:-1;;;;;36039:16:0;;36031:65;;;;-1:-1:-1;;;36031:65:0;;25058:2:1;36031:65:0;;;25040:21:1;25097:2;25077:18;;;25070:30;25136:34;25116:18;;;25109:62;25207:6;25187:18;;;25180:34;25231:19;;36031:65:0;24856:400:1;36031:65:0;36109:39;36130:4;36136:2;36140:7;36109:20;:39::i;:::-;36213:29;36230:1;36234:7;36213:8;:29::i;:::-;-1:-1:-1;;;;;36255:15:0;;;;;;:9;:15;;;;;:20;;36274:1;;36255:15;:20;;36274:1;;36255:20;:::i;:::-;;;;-1:-1:-1;;;;;;;36286:13:0;;;;;;:9;:13;;;;;:18;;36303:1;;36286:13;:18;;36303:1;;36286:18;:::i;:::-;;;;-1:-1:-1;;36315:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;36315:21:0;-1:-1:-1;;;;;36315:21:0;;;;;;;;;36354:27;;36315:16;;36354:27;;;;;;;28751:341;28681:411;;:::o;33396:110::-;33472:26;33482:2;33486:7;33472:26;;;;;;;;;;;;:9;:26::i;6814:191::-;6907:6;;;-1:-1:-1;;;;;6924:17:0;;;-1:-1:-1;;6924:17:0;;;;;;;6957:40;;6907:6;;;6924:17;6907:6;;6957:40;;6888:16;;6957:40;6877:128;6814:191;:::o;36874:315::-;37029:8;-1:-1:-1;;;;;37020:17:0;:5;-1:-1:-1;;;;;37020:17:0;;;37012:55;;;;-1:-1:-1;;;37012:55:0;;25463:2:1;37012:55:0;;;25445:21:1;25502:2;25482:18;;;25475:30;25541:27;25521:18;;;25514:55;25586:18;;37012:55:0;25261:349:1;37012:55:0;-1:-1:-1;;;;;37078:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;37078:46:0;;;;;;;;;;37140:41;;586::1;;;37140::0;;559:18:1;37140:41:0;;;;;;;36874:315;;;:::o;31784:::-;31941:28;31951:4;31957:2;31961:7;31941:9;:28::i;:::-;31988:48;32011:4;32017:2;32021:7;32030:5;31988:22;:48::i;:::-;31980:111;;;;-1:-1:-1;;;31980:111:0;;25817:2:1;31980:111:0;;;25799:21:1;25856:2;25836:18;;;25829:30;25895:34;25875:18;;;25868:62;25966:20;25946:18;;;25939:48;26004:19;;31980:111:0;25615:414:1;53414:113:0;53474:13;53507:12;53500:19;;;;;:::i;1830:723::-;1886:13;2107:10;2103:53;;-1:-1:-1;;2134:10:0;;;;;;;;;;;;;;;;;;1830:723::o;2103:53::-;2181:5;2166:12;2222:78;2229:9;;2222:78;;2255:8;;;;:::i;:::-;;-1:-1:-1;2278:10:0;;-1:-1:-1;2286:2:0;2278:10;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2332:17:0;;2310:39;;2360:154;2367:10;;2360:154;;2394:11;2404:1;2394:11;;:::i;:::-;;-1:-1:-1;2463:10:0;2471:2;2463:5;:10;:::i;:::-;2450:24;;:2;:24;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;:56;;;;;;;;;;-1:-1:-1;2491:11:0;2500:2;2491:11;;:::i;:::-;;;2360:154;;42455:589;-1:-1:-1;;;;;42661:18:0;;42657:187;;42696:40;42728:7;43871:10;:17;;43844:24;;;;:15;:24;;;;;:44;;;43899:24;;;;;;;;;;;;43767:164;42696:40;42657:187;;;42766:2;-1:-1:-1;;;;;42758:10:0;:4;-1:-1:-1;;;;;42758:10:0;;42754:90;;42785:47;42818:4;42824:7;42785:32;:47::i;:::-;-1:-1:-1;;;;;42858:16:0;;42854:183;;42891:45;42928:7;42891:36;:45::i;42854:183::-;42964:4;-1:-1:-1;;;;;42958:10:0;:2;-1:-1:-1;;;;;42958:10:0;;42954:83;;42985:40;43013:2;43017:7;42985:27;:40::i;33733:321::-;33863:18;33869:2;33873:7;33863:5;:18::i;:::-;33914:54;33945:1;33949:2;33953:7;33962:5;33914:22;:54::i;:::-;33892:154;;;;-1:-1:-1;;;33892:154:0;;25817:2:1;33892:154:0;;;25799:21:1;25856:2;25836:18;;;25829:30;25895:34;25875:18;;;25868:62;25966:20;25946:18;;;25939:48;26004:19;;33892:154:0;25615:414:1;37754:799:0;37909:4;-1:-1:-1;;;;;37930:13:0;;8540:19;:23;37926:620;;37966:72;;;;;-1:-1:-1;;;;;37966:36:0;;;;;:72;;4348:10;;38017:4;;38023:7;;38032:5;;37966:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;37966:72:0;;;;;;;;-1:-1:-1;;37966:72:0;;;;;;;;;;;;:::i;:::-;;;37962:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38208:13:0;;38204:272;;38251:60;;-1:-1:-1;;;38251:60:0;;25817:2:1;38251:60:0;;;25799:21:1;25856:2;25836:18;;;25829:30;25895:34;25875:18;;;25868:62;25966:20;25946:18;;;25939:48;26004:19;;38251:60:0;25615:414:1;38204:272:0;38426:6;38420:13;38411:6;38407:2;38403:15;38396:38;37962:529;-1:-1:-1;;;;;;38089:51:0;38099:41;38089:51;;-1:-1:-1;38082:58:0;;37926:620;-1:-1:-1;38530:4:0;37754:799;;;;;;:::o;44558:988::-;44824:22;44874:1;44849:22;44866:4;44849:16;:22::i;:::-;:26;;;;:::i;:::-;44886:18;44907:26;;;:17;:26;;;;;;44824:51;;-1:-1:-1;45040:28:0;;;45036:328;;-1:-1:-1;;;;;45107:18:0;;45085:19;45107:18;;;:12;:18;;;;;;;;:34;;;;;;;;;45158:30;;;;;;:44;;;45275:30;;:17;:30;;;;;:43;;;45036:328;-1:-1:-1;45460:26:0;;;;:17;:26;;;;;;;;45453:33;;;-1:-1:-1;;;;;45504:18:0;;;;;:12;:18;;;;;:34;;;;;;;45497:41;44558:988::o;45841:1079::-;46119:10;:17;46094:22;;46119:21;;46139:1;;46119:21;:::i;:::-;46151:18;46172:24;;;:15;:24;;;;;;46545:10;:26;;46094:46;;-1:-1:-1;46172:24:0;;46094:46;;46545:26;;;;;;:::i;:::-;;;;;;;;;46523:48;;46609:11;46584:10;46595;46584:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;46689:28;;;:15;:28;;;;;;;:41;;;46861:24;;;;;46854:31;46896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;45912:1008;;;45841:1079;:::o;43345:221::-;43430:14;43447:20;43464:2;43447:16;:20::i;:::-;-1:-1:-1;;;;;43478:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;43523:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;43345:221:0:o;34390:439::-;-1:-1:-1;;;;;34470:16:0;;34462:61;;;;-1:-1:-1;;;34462:61:0;;27313:2:1;34462:61:0;;;27295:21:1;;;27332:18;;;27325:30;27391:34;27371:18;;;27364:62;27443:18;;34462:61:0;27111:356:1;34462:61:0;32477:4;32501:16;;;:7;:16;;;;;;-1:-1:-1;;;;;32501:16:0;:30;34534:58;;;;-1:-1:-1;;;34534:58:0;;27674:2:1;34534:58:0;;;27656:21:1;27713:2;27693:18;;;27686:30;27752;27732:18;;;27725:58;27800:18;;34534:58:0;27472:352:1;34534:58:0;34605:45;34634:1;34638:2;34642:7;34605:20;:45::i;:::-;-1:-1:-1;;;;;34663:13:0;;;;;;:9;:13;;;;;:18;;34680:1;;34663:13;:18;;34680:1;;34663:18;:::i;:::-;;;;-1:-1:-1;;34692:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;34692:21:0;-1:-1:-1;;;;;34692:21:0;;;;;;;;34731:33;;34692:16;;;34731:33;;34692:16;;34731:33;48673:22:::1;48602:101:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:177:1;-1:-1:-1;;;;;;92:5:1;88:78;81:5;78:89;68:117;;181:1;178;171:12;196:245;254:6;307:2;295:9;286:7;282:23;278:32;275:52;;;323:1;320;313:12;275:52;362:9;349:23;381:30;405:5;381:30;:::i;820:258::-;892:1;902:113;916:6;913:1;910:13;902:113;;;992:11;;;986:18;973:11;;;966:39;938:2;931:10;902:113;;;1033:6;1030:1;1027:13;1024:48;;;-1:-1:-1;;1068:1:1;1050:16;;1043:27;820:258::o;1083:317::-;1125:3;1163:5;1157:12;1190:6;1185:3;1178:19;1206:63;1262:6;1255:4;1250:3;1246:14;1239:4;1232:5;1228:16;1206:63;:::i;:::-;1314:2;1302:15;-1:-1:-1;;1298:88:1;1289:98;;;;1389:4;1285:109;;1083:317;-1:-1:-1;;1083:317:1:o;1405:220::-;1554:2;1543:9;1536:21;1517:4;1574:45;1615:2;1604:9;1600:18;1592:6;1574:45;:::i;1630:180::-;1689:6;1742:2;1730:9;1721:7;1717:23;1713:32;1710:52;;;1758:1;1755;1748:12;1710:52;-1:-1:-1;1781:23:1;;1630:180;-1:-1:-1;1630:180:1:o;2046:196::-;2114:20;;-1:-1:-1;;;;;2163:54:1;;2153:65;;2143:93;;2232:1;2229;2222:12;2143:93;2046:196;;;:::o;2247:254::-;2315:6;2323;2376:2;2364:9;2355:7;2351:23;2347:32;2344:52;;;2392:1;2389;2382:12;2344:52;2415:29;2434:9;2415:29;:::i;:::-;2405:39;2491:2;2476:18;;;;2463:32;;-1:-1:-1;;;2247:254:1:o;2506:328::-;2583:6;2591;2599;2652:2;2640:9;2631:7;2627:23;2623:32;2620:52;;;2668:1;2665;2658:12;2620:52;2691:29;2710:9;2691:29;:::i;:::-;2681:39;;2739:38;2773:2;2762:9;2758:18;2739:38;:::i;:::-;2729:48;;2824:2;2813:9;2809:18;2796:32;2786:42;;2506:328;;;;;:::o;2839:186::-;2898:6;2951:2;2939:9;2930:7;2926:23;2922:32;2919:52;;;2967:1;2964;2957:12;2919:52;2990:29;3009:9;2990:29;:::i;3030:435::-;3083:3;3121:5;3115:12;3148:6;3143:3;3136:19;3174:4;3203:2;3198:3;3194:12;3187:19;;3240:2;3233:5;3229:14;3261:1;3271:169;3285:6;3282:1;3279:13;3271:169;;;3346:13;;3334:26;;3380:12;;;;3415:15;;;;3307:1;3300:9;3271:169;;;-1:-1:-1;3456:3:1;;3030:435;-1:-1:-1;;;;;3030:435:1:o;3470:855::-;3738:2;3750:21;;;3820:13;;3723:18;;;3842:22;;;3690:4;;3917;;3895:2;3880:18;;;3944:15;;;3690:4;3987:218;4001:6;3998:1;3995:13;3987:218;;;4066:13;;-1:-1:-1;;;;;4062:62:1;4050:75;;4145:12;;;;4180:15;;;;4023:1;4016:9;3987:218;;;3991:3;;;4250:9;4245:3;4241:19;4236:2;4225:9;4221:18;4214:47;4278:41;4315:3;4307:6;4278:41;:::i;:::-;4270:49;3470:855;-1:-1:-1;;;;;;3470:855:1:o;4330:184::-;-1:-1:-1;;;4379:1:1;4372:88;4479:4;4476:1;4469:15;4503:4;4500:1;4493:15;4519:334;4590:2;4584:9;4646:2;4636:13;;-1:-1:-1;;4632:86:1;4620:99;;4749:18;4734:34;;4770:22;;;4731:62;4728:88;;;4796:18;;:::i;:::-;4832:2;4825:22;4519:334;;-1:-1:-1;4519:334:1:o;4858:466::-;4923:5;4957:18;4949:6;4946:30;4943:56;;;4979:18;;:::i;:::-;5017:116;5127:4;-1:-1:-1;;5053:2:1;5045:6;5041:15;5037:88;5033:99;5017:116;:::i;:::-;5008:125;;5156:6;5149:5;5142:21;5196:3;5187:6;5182:3;5178:16;5175:25;5172:45;;;5213:1;5210;5203:12;5172:45;5262:6;5257:3;5250:4;5243:5;5239:16;5226:43;5316:1;5309:4;5300:6;5293:5;5289:18;5285:29;5278:40;4858:466;;;;;:::o;5329:451::-;5398:6;5451:2;5439:9;5430:7;5426:23;5422:32;5419:52;;;5467:1;5464;5457:12;5419:52;5507:9;5494:23;5540:18;5532:6;5529:30;5526:50;;;5572:1;5569;5562:12;5526:50;5595:22;;5648:4;5640:13;;5636:27;-1:-1:-1;5626:55:1;;5677:1;5674;5667:12;5626:55;5700:74;5766:7;5761:2;5748:16;5743:2;5739;5735:11;5700:74;:::i;5785:183::-;5845:4;5878:18;5870:6;5867:30;5864:56;;;5900:18;;:::i;:::-;-1:-1:-1;5945:1:1;5941:14;5957:4;5937:25;;5785:183::o;5973:668::-;6027:5;6080:3;6073:4;6065:6;6061:17;6057:27;6047:55;;6098:1;6095;6088:12;6047:55;6134:6;6121:20;6160:4;6184:60;6200:43;6240:2;6200:43;:::i;:::-;6184:60;:::i;:::-;6278:15;;;6364:1;6360:10;;;;6348:23;;6344:32;;;6309:12;;;;6388:15;;;6385:35;;;6416:1;6413;6406:12;6385:35;6452:2;6444:6;6440:15;6464:148;6480:6;6475:3;6472:15;6464:148;;;6546:23;6565:3;6546:23;:::i;:::-;6534:36;;6590:12;;;;6497;;6464:148;;;-1:-1:-1;6630:5:1;5973:668;-1:-1:-1;;;;;;5973:668:1:o;6646:1281::-;6782:6;6790;6798;6806;6859:3;6847:9;6838:7;6834:23;6830:33;6827:53;;;6876:1;6873;6866:12;6827:53;6899:29;6918:9;6899:29;:::i;:::-;6889:39;;6947:2;6996;6985:9;6981:18;6968:32;6958:42;;7051:2;7040:9;7036:18;7023:32;7074:18;7115:2;7107:6;7104:14;7101:34;;;7131:1;7128;7121:12;7101:34;7169:6;7158:9;7154:22;7144:32;;7214:7;7207:4;7203:2;7199:13;7195:27;7185:55;;7236:1;7233;7226:12;7185:55;7272:2;7259:16;7295:60;7311:43;7351:2;7311:43;:::i;7295:60::-;7389:15;;;7471:1;7467:10;;;;7459:19;;7455:28;;;7420:12;;;;7495:19;;;7492:39;;;7527:1;7524;7517:12;7492:39;7551:11;;;;7571:142;7587:6;7582:3;7579:15;7571:142;;;7653:17;;7641:30;;7604:12;;;;7691;;;;7571:142;;;7732:5;-1:-1:-1;;;7790:2:1;7775:18;;7762:32;;-1:-1:-1;7806:16:1;;;7803:36;;;7835:1;7832;7825:12;7803:36;;;7858:63;7913:7;7902:8;7891:9;7887:24;7858:63;:::i;:::-;7848:73;;;6646:1281;;;;;;;:::o;7932:556::-;8193:3;8182:9;8175:22;8156:4;8214:46;8255:3;8244:9;8240:19;8232:6;8214:46;:::i;:::-;8206:54;;-1:-1:-1;;;;;8300:6:1;8296:55;8291:2;8280:9;8276:18;8269:83;8388:6;8383:2;8372:9;8368:18;8361:34;8431:6;8426:2;8415:9;8411:18;8404:34;8475:6;8469:3;8458:9;8454:19;8447:35;7932:556;;;;;;;;:::o;8493:261::-;8672:2;8661:9;8654:21;8635:4;8692:56;8744:2;8733:9;8729:18;8721:6;8692:56;:::i;8759:347::-;8824:6;8832;8885:2;8873:9;8864:7;8860:23;8856:32;8853:52;;;8901:1;8898;8891:12;8853:52;8924:29;8943:9;8924:29;:::i;:::-;8914:39;;9003:2;8992:9;8988:18;8975:32;9050:5;9043:13;9036:21;9029:5;9026:32;9016:60;;9072:1;9069;9062:12;9016:60;9095:5;9085:15;;;8759:347;;;;;:::o;9111:667::-;9206:6;9214;9222;9230;9283:3;9271:9;9262:7;9258:23;9254:33;9251:53;;;9300:1;9297;9290:12;9251:53;9323:29;9342:9;9323:29;:::i;:::-;9313:39;;9371:38;9405:2;9394:9;9390:18;9371:38;:::i;:::-;9361:48;;9456:2;9445:9;9441:18;9428:32;9418:42;;9511:2;9500:9;9496:18;9483:32;9538:18;9530:6;9527:30;9524:50;;;9570:1;9567;9560:12;9524:50;9593:22;;9646:4;9638:13;;9634:27;-1:-1:-1;9624:55:1;;9675:1;9672;9665:12;9624:55;9698:74;9764:7;9759:2;9746:16;9741:2;9737;9733:11;9698:74;:::i;9783:348::-;9835:8;9845:6;9899:3;9892:4;9884:6;9880:17;9876:27;9866:55;;9917:1;9914;9907:12;9866:55;-1:-1:-1;9940:20:1;;9983:18;9972:30;;9969:50;;;10015:1;10012;10005:12;9969:50;10052:4;10044:6;10040:17;10028:29;;10104:3;10097:4;10088:6;10080;10076:19;10072:30;10069:39;10066:59;;;10121:1;10118;10111:12;10066:59;9783:348;;;;;:::o;10136:485::-;10216:6;10224;10232;10285:2;10273:9;10264:7;10260:23;10256:32;10253:52;;;10301:1;10298;10291:12;10253:52;10324:29;10343:9;10324:29;:::i;:::-;10314:39;;10404:2;10393:9;10389:18;10376:32;10431:18;10423:6;10420:30;10417:50;;;10463:1;10460;10453:12;10417:50;10502:59;10553:7;10544:6;10533:9;10529:22;10502:59;:::i;:::-;10136:485;;10580:8;;-1:-1:-1;10476:85:1;;-1:-1:-1;;;;10136:485:1:o;10626:691::-;10733:6;10741;10749;10757;10765;10773;10826:3;10814:9;10805:7;10801:23;10797:33;10794:53;;;10843:1;10840;10833:12;10794:53;10883:9;10870:23;10916:18;10908:6;10905:30;10902:50;;;10948:1;10945;10938:12;10902:50;10987:59;11038:7;11029:6;11018:9;11014:22;10987:59;:::i;:::-;11065:8;;-1:-1:-1;10961:85:1;-1:-1:-1;11119:38:1;;-1:-1:-1;11153:2:1;11138:18;;11119:38;:::i;:::-;11109:48;;11204:2;11193:9;11189:18;11176:32;11166:42;;11255:2;11244:9;11240:18;11227:32;11217:42;;11306:3;11295:9;11291:19;11278:33;11268:43;;10626:691;;;;;;;;:::o;11322:260::-;11390:6;11398;11451:2;11439:9;11430:7;11426:23;11422:32;11419:52;;;11467:1;11464;11457:12;11419:52;11490:29;11509:9;11490:29;:::i;:::-;11480:39;;11538:38;11572:2;11561:9;11557:18;11538:38;:::i;:::-;11528:48;;11322:260;;;;;:::o;11587:437::-;11666:1;11662:12;;;;11709;;;11730:61;;11784:4;11776:6;11772:17;11762:27;;11730:61;11837:2;11829:6;11826:14;11806:18;11803:38;11800:218;;;-1:-1:-1;;;11871:1:1;11864:88;11975:4;11972:1;11965:15;12003:4;12000:1;11993:15;11800:218;;11587:437;;;:::o;14048:184::-;-1:-1:-1;;;14097:1:1;14090:88;14197:4;14194:1;14187:15;14221:4;14218:1;14211:15;14237:184;14307:6;14360:2;14348:9;14339:7;14335:23;14331:32;14328:52;;;14376:1;14373;14366:12;14328:52;-1:-1:-1;14399:16:1;;14237:184;-1:-1:-1;14237:184:1:o;14426:::-;-1:-1:-1;;;14475:1:1;14468:88;14575:4;14572:1;14565:15;14599:4;14596:1;14589:15;14615:195;14654:3;-1:-1:-1;;14678:5:1;14675:77;14672:103;;;14755:18;;:::i;:::-;-1:-1:-1;14802:1:1;14791:13;;14615:195::o;17182:128::-;17222:3;17253:1;17249:6;17246:1;17243:13;17240:39;;;17259:18;;:::i;:::-;-1:-1:-1;17295:9:1;;17182:128::o;18573:125::-;18613:4;18641:1;18638;18635:8;18632:34;;;18646:18;;:::i;:::-;-1:-1:-1;18683:9:1;;18573:125::o;18703:228::-;18743:7;18869:1;-1:-1:-1;;18797:74:1;18794:1;18791:81;18786:1;18779:9;18772:17;18768:105;18765:131;;;18876:18;;:::i;:::-;-1:-1:-1;18916:9:1;;18703:228::o;18936:184::-;-1:-1:-1;;;18985:1:1;18978:88;19085:4;19082:1;19075:15;19109:4;19106:1;19099:15;19125:120;19165:1;19191;19181:35;;19196:18;;:::i;:::-;-1:-1:-1;19230:9:1;;19125:120::o;21864:470::-;22043:3;22081:6;22075:13;22097:53;22143:6;22138:3;22131:4;22123:6;22119:17;22097:53;:::i;:::-;22213:13;;22172:16;;;;22235:57;22213:13;22172:16;22269:4;22257:17;;22235:57;:::i;:::-;22308:20;;21864:470;-1:-1:-1;;;;21864:470:1:o;22339:326::-;22428:6;22423:3;22416:19;22480:6;22473:5;22466:4;22461:3;22457:14;22444:43;;22532:1;22525:4;22516:6;22511:3;22507:16;22503:27;22496:38;22398:3;22654:4;-1:-1:-1;;22579:2:1;22571:6;22567:15;22563:88;22558:3;22554:98;22550:109;22543:116;;22339:326;;;;:::o;22670:367::-;-1:-1:-1;;;;;22861:6:1;22857:55;22846:9;22839:74;22949:2;22944;22933:9;22929:18;22922:30;22820:4;22969:62;23027:2;23016:9;23012:18;23004:6;22996;22969:62;:::i;:::-;22961:70;22670:367;-1:-1:-1;;;;;22670:367:1:o;23042:583::-;23313:3;23302:9;23295:22;23276:4;23334:63;23392:3;23381:9;23377:19;23369:6;23361;23334:63;:::i;:::-;23326:71;;-1:-1:-1;;;;;23437:6:1;23433:55;23428:2;23417:9;23413:18;23406:83;23525:6;23520:2;23509:9;23505:18;23498:34;23568:6;23563:2;23552:9;23548:18;23541:34;23612:6;23606:3;23595:9;23591:19;23584:35;23042:583;;;;;;;;;:::o;26034:112::-;26066:1;26092;26082:35;;26097:18;;:::i;:::-;-1:-1:-1;26131:9:1;;26034:112::o;26151:512::-;26345:4;-1:-1:-1;;;;;26455:2:1;26447:6;26443:15;26432:9;26425:34;26507:2;26499:6;26495:15;26490:2;26479:9;26475:18;26468:43;;26547:6;26542:2;26531:9;26527:18;26520:34;26590:3;26585:2;26574:9;26570:18;26563:31;26611:46;26652:3;26641:9;26637:19;26629:6;26611:46;:::i;26668:249::-;26737:6;26790:2;26778:9;26769:7;26765:23;26761:32;26758:52;;;26806:1;26803;26796:12;26758:52;26838:9;26832:16;26857:30;26881:5;26857:30;:::i;26922:184::-;-1:-1:-1;;;26971:1:1;26964:88;27071:4;27068:1;27061:15;27095:4;27092:1;27085:15

Swarm Source

ipfs://8015aa2bf9ec3b12715572061f665ff119ecafba545f6f9f2376a2bf9c1d38aa
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.