ETH Price: $3,325.42 (-8.58%)

Token

blocky dinos (bd)
 

Overview

Max Total Supply

94 bd

Holders

41

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
w4llets.eth
Balance
1 bd
0x0fF662758804813Efd5Aa8e2D84Fb5085e69b801
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:
blockydinos

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT


/**

 .----------------.  .----------------.  .----------------.  .----------------.  .----------------.  .----------------. 
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |
| |   ______     | || |   _____      | || |     ____     | || |     ______   | || |  ___  ____   | || |  ____  ____  | |
| |  |_   _ \    | || |  |_   _|     | || |   .'    `.   | || |   .' ___  |  | || | |_  ||_  _|  | || | |_  _||_  _| | |
| |    | |_) |   | || |    | |       | || |  /  .--.  \  | || |  / .'   \_|  | || |   | |_/ /    | || |   \ \  / /   | |
| |    |  __'.   | || |    | |   _   | || |  | |    | |  | || |  | |         | || |   |  __'.    | || |    \ \/ /    | |
| |   _| |__) |  | || |   _| |__/ |  | || |  \  `--'  /  | || |  \ `.___.'\  | || |  _| |  \ \_  | || |    _|  |_    | |
| |  |_______/   | || |  |________|  | || |   `.____.'   | || |   `._____.'  | || | |____||____| | || |   |______|   | |
| |              | || |              | || |              | || |              | || |              | || |              | |
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |
 '----------------'  '----------------'  '----------------'  '----------------'  '----------------'  '----------------' 
 .----------------.  .----------------.  .-----------------. .----------------.  .----------------.                     
| .--------------. || .--------------. || .--------------. || .--------------. || .--------------. |                    
| |  ________    | || |     _____    | || | ____  _____  | || |     ____     | || |    _______   | |                    
| | |_   ___ `.  | || |    |_   _|   | || ||_   \|_   _| | || |   .'    `.   | || |   /  ___  |  | |                    
| |   | |   `. \ | || |      | |     | || |  |   \ | |   | || |  /  .--.  \  | || |  |  (__ \_|  | |                    
| |   | |    | | | || |      | |     | || |  | |\ \| |   | || |  | |    | |  | || |   '.___`-.   | |                    
| |  _| |___.' / | || |     _| |_    | || | _| |_\   |_  | || |  \  `--'  /  | || |  |`\____) |  | |                    
| | |________.'  | || |    |_____|   | || ||_____|\____| | || |   `.____.'   | || |  |_______.'  | |                    
| |              | || |              | || |              | || |              | || |              | |                    
| '--------------' || '--------------' || '--------------' || '--------------' || '--------------' |                    
 '----------------'  '----------------'  '----------------'  '----------------'  '----------------'                     
                                
*/



pragma solidity ^0.8.0;





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



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



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

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

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

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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


/**
 * @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);
    }
    
    function toHexString(bytes32 value) internal pure returns (string memory) {
        uint256 tValue = uint256(value);
        uint256 length = 32;
        bytes memory buffer = new bytes(2 * length);
        for (uint256 i = 2 * length; i > 0; --i) {
            buffer[i-1] = _HEX_SYMBOLS[tValue & 0xf];
            tValue >>= 4;
        }
        require(tValue == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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



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


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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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



    /**
     * @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 override returns (uint256) {
        uint256 currCount = 0;
        uint256 currSupply = _currentIndex;
        bool counting = false; 
        TokenOwnership memory ownership; 
        unchecked {
            for (uint256 i = _startTokenId(); i < currSupply; ++i) {
                ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if(ownership.addr == owner) {
                    counting = true; 
                    currCount++;
                } else if(ownership.addr == address(0)) {
                    if(counting) currCount++;
                } else {
                    counting = false; 
                }
                if(counting && index == (currCount - 1)) {
                    return i; 
                }
            }
        }
        revert OwnerIndexOutOfBounds();
    }

    /**
     * @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 override returns (uint256) {
        return index - _startTokenId(); 
    }


    /**
     * @dev Returns the tokenIds of the address. O(totalSupply) in complexity.
     */
    function tokensOfOwner(address owner) public view returns (uint256[] memory) {
        uint256 holdingAmount = balanceOf(owner);
        uint256 currSupply = _currentIndex;
        uint256 tokenIdsIdx;
        address currOwnershipAddr;

        uint256[] memory list = new uint256[](holdingAmount);

        unchecked {
            for (uint256 i = _startTokenId(); i < currSupply; ++i) {
                TokenOwnership memory ownership = _ownerships[i];

                if (ownership.burned) {
                    continue;
                }

                // Find out who owns this sequence
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }

                // Append tokens the last found owner owns in the sequence
                if (currOwnershipAddr == owner) {
                    list[tokenIdsIdx++] = i;
                }

                // All tokens have been found, we don't need to keep searching
                if (tokenIdsIdx == holdingAmount) {
                    break;
                }
            }
        }

        return list;
    }



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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been minted.
     *
     * startTokenId - the first token id minted
     * quantity - the amount of tokens minted
     *
     */
    function _tokenMinted(
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}


abstract contract tinydinos {
    function balanceOf(address owner) external virtual view returns (uint256 balance);
}

contract blockydinos is ERC721A, Ownable {

    // Constants
    address public constant rawrDAO = 0xABA96619B891aD24ffCAFA3E05630F968B21E89a;

    // Minting Variables
    uint256 public mintPrice = 0.01 ether;
    uint256 public maxPurchase = 10;
    uint256 public maxSupply = 10000;
    uint256 public tdClaimReserve = 2500;

    tinydinos tdContract = tinydinos(0xd9b78A2F1dAFc8Bb9c60961790d2beefEBEE56f4);
    
    mapping(address => uint256) private walletMinted;
    mapping(address => bool) private walletClaimed;

    bool public saleIsActive = true;

    // Metadata
    string _contractURI = "https://blockydinos.xyz/dino/blockydinos.json";
    string _baseTokenURI = "https://blockydinos.xyz/metadata/";
    mapping(uint256 => bytes32) public dinoDNA;

    // Events
    event SaleActivation(bool isActive);
  


    constructor() ERC721A("blocky dinos", "bd") {
        _safeMint(msg.sender, 1);
    }

    function canClaim(address claimer) public view returns(bool) {
        return tdContract.balanceOf(claimer) > 0 && !walletClaimed[claimer];
    }

    function claim() external {
        require(canClaim(msg.sender), "error");

        walletClaimed[msg.sender] = true;
        if(tdClaimReserve > 0) {
            tdClaimReserve--;
        }
        _safeMint(msg.sender, 1);
    }

    function mint(uint256 count) external payable {
        require(saleIsActive, "SALE_INACTIVE");
        require(walletMinted[msg.sender] + count <= maxPurchase , "this would exceed mint max allowance");

        require(
            totalSupply() + count + tdClaimReserve <= maxSupply,
            "this would exceed max mints"
        );
        require(
            mintPrice * count <= msg.value,
            "INCORRECT_ETHER_VALUE"
        );

        walletMinted[msg.sender] += count;
        _safeMint(msg.sender, count);
    }

    function _tokenMinted(
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual override {
        for(uint256 i = 0;i < quantity;i++) {
            dinoDNA[startTokenId + i] = keccak256(abi.encodePacked(block.timestamp, startTokenId + i));
        }
    }

    function toggleSaleStatus() external onlyOwner {
        saleIsActive = !saleIsActive;
        emit SaleActivation(saleIsActive);
    }

    function setMintPrice(uint256 _mintPrice) external onlyOwner {
        mintPrice = _mintPrice;
    }

    function setMaxPurchase(uint256 _maxPurchase) external onlyOwner {
        maxPurchase = _maxPurchase;
    }

    function setClaimReserve(uint256 _claimReserve) external onlyOwner {
        tdClaimReserve = _claimReserve;
    }

    function withdraw() external onlyOwner {
        uint256 totalBalance = address(this).balance;
        uint256 daoTransfer = totalBalance / 2;
        uint256 remaining = totalBalance - daoTransfer;

        (bool rdSent, ) = payable(rawrDAO).call{value: daoTransfer}("");
        require(rdSent, "withdraw failed");
        (bool oSent, ) = payable(owner()).call{value: remaining}("");
        require(oSent, "withdraw failed");
    }


    function getWalletOfOwner(address owner) external view returns (uint256[] memory) {
        unchecked {
            uint256[] memory a = new uint256[](balanceOf(owner));
            uint256 end = _currentIndex;
            uint256 tokenIdsIdx;
            address currOwnershipAddr;
            for (uint256 i; i < end; i++) {
                TokenOwnership memory ownership = _ownerships[i];
                if (ownership.burned) {
                    continue;
                }
                if (ownership.addr != address(0)) {
                    currOwnershipAddr = ownership.addr;
                }
                if (currOwnershipAddr == owner) {
                    a[tokenIdsIdx++] = i;
                }
            }
            return a;
        }
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setContractURI(string memory mContractURI) external onlyOwner {
        _contractURI = mContractURI;
    }

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

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(super.tokenURI(tokenId), "/", dnaString(tokenId)));
    }

    function dnaString(uint256 tokenId) public view returns (string memory) {
        return Strings.toHexString(dinoDNA[tokenId]);
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    function _startTokenId() internal view virtual override returns (uint256){
        return 1;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerIndexOutOfBounds","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"claimer","type":"address"}],"name":"canClaim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"dinoDNA","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"dnaString","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rawrDAO","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","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":"_claimReserve","type":"uint256"}],"name":"setClaimReserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"mContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPurchase","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tdClaimReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052662386f26fc10000600955600a8055612710600b556109c4600c5573d9b78a2f1dafc8bb9c60961790d2beefebee56f4600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001601060006101000a81548160ff0219169083151502179055506040518060600160405280602d815260200162005716602d913960119080519060200190620000c092919062000929565b50604051806060016040528060218152602001620056f56021913960129080519060200190620000f292919062000929565b503480156200010057600080fd5b506040518060400160405280600c81526020017f626c6f636b792064696e6f7300000000000000000000000000000000000000008152506040518060400160405280600281526020017f626400000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200018592919062000929565b5080600390805190602001906200019e92919062000929565b50620001af620001f060201b60201c565b6000819055505050620001d7620001cb620001f960201b60201c565b6200020160201b60201c565b620001ea336001620002c760201b60201c565b62000d59565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002e9828260405180602001604052806000815250620002ed60201b60201c565b5050565b6200030283838360016200030760201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16141562000375576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415620003b1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b620003c660008683876200071560201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156200059e57506200059d8773ffffffffffffffffffffffffffffffffffffffff166200071b60201b620023ce1760201c565b5b1562000671575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200061c60008884806001019550886200072e60201b60201c565b62000653576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415620005a55782600054146200066b57600080fd5b620006de565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141562000672575b816000819055505050620006f98185620008a060201b60201c565b6200070e60008683876200092360201b60201c565b5050505050565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200075c620001f960201b60201c565b8786866040518563ffffffff1660e01b815260040162000780949392919062000add565b602060405180830381600087803b1580156200079b57600080fd5b505af1925050508015620007cf57506040513d601f19601f82011682018060405250810190620007cc919062000b93565b60015b6200084d573d806000811462000802576040519150601f19603f3d011682016040523d82523d6000602084013e62000807565b606091505b5060008151141562000845576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60005b818110156200091e57428184620008bb919062000bf4565b604051602001620008ce92919062000c76565b60405160208183030381529060405280519060200120601360008386620008f6919062000bf4565b8152602001908152602001600020819055508080620009159062000ca6565b915050620008a3565b505050565b50505050565b828054620009379062000d23565b90600052602060002090601f0160209004810192826200095b5760008555620009a7565b82601f106200097657805160ff1916838001178555620009a7565b82800160010185558215620009a7579182015b82811115620009a657825182559160200191906001019062000989565b5b509050620009b69190620009ba565b5090565b5b80821115620009d5576000816000905550600101620009bb565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a0682620009d9565b9050919050565b62000a1881620009f9565b82525050565b6000819050919050565b62000a338162000a1e565b82525050565b600081519050919050565b600082825260208201905092915050565b60005b8381101562000a7557808201518184015260208101905062000a58565b8381111562000a85576000848401525b50505050565b6000601f19601f8301169050919050565b600062000aa98262000a39565b62000ab5818562000a44565b935062000ac781856020860162000a55565b62000ad28162000a8b565b840191505092915050565b600060808201905062000af4600083018762000a0d565b62000b03602083018662000a0d565b62000b12604083018562000a28565b818103606083015262000b26818462000a9c565b905095945050505050565b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000b6d8162000b36565b811462000b7957600080fd5b50565b60008151905062000b8d8162000b62565b92915050565b60006020828403121562000bac5762000bab62000b31565b5b600062000bbc8482850162000b7c565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000c018262000a1e565b915062000c0e8362000a1e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c465762000c4562000bc5565b5b828201905092915050565b6000819050919050565b62000c7062000c6a8262000a1e565b62000c51565b82525050565b600062000c84828562000c5b565b60208201915062000c96828462000c5b565b6020820191508190509392505050565b600062000cb38262000a1e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000ce95762000ce862000bc5565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000d3c57607f821691505b6020821081141562000d535762000d5262000cf4565b5b50919050565b61498c8062000d696000396000f3fe60806040526004361061023b5760003560e01c806375e115891161012e578063be75973a116100ab578063e8a3d4851161006f578063e8a3d48514610888578063e985e9c5146108b3578063eb8d2444146108f0578063f2fde38b1461091b578063f4a0a528146109445761023b565b8063be75973a1461078f578063bea90bd4146107b8578063bf3506c1146107e3578063c87b56dd14610820578063d5abeb011461085d5761023b565b8063977b055b116100f2578063977b055b146106b9578063a0712d68146106e4578063a22cb46514610700578063a8ab8a9614610729578063b88d4fde146107665761023b565b806375e11589146105d25780638462151c146105fd5780638da5cb5b1461063a578063938e3d7b1461066557806395d89b411461068e5761023b565b806342842e0e116101bc5780636352211e116101805780636352211e146104ed5780636817c76c1461052a57806370a08231146105555780637118974214610592578063715018a6146105bb5761023b565b806342842e0e1461040a5780634e71d92d146104335780634f6ccce71461044a57806355f804b314610487578063627fdeab146104b05761023b565b806318160ddd1161020357806318160ddd1461032557806323b872dd146103505780632f745c59146103795780633c5ed7e5146103b65780633ccfd60b146103f35761023b565b806301ffc9a714610240578063049c5c491461027d57806306fdde0314610294578063081812fc146102bf578063095ea7b3146102fc575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906138af565b61096d565b60405161027491906138f7565b60405180910390f35b34801561028957600080fd5b50610292610ab7565b005b3480156102a057600080fd5b506102a9610ba5565b6040516102b691906139ab565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613a03565b610c37565b6040516102f39190613a71565b60405180910390f35b34801561030857600080fd5b50610323600480360381019061031e9190613ab8565b610cb3565b005b34801561033157600080fd5b5061033a610dbe565b6040516103479190613b07565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613b22565b610dd5565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613ab8565b610de5565b6040516103ad9190613b07565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613a03565b610fe5565b6040516103ea9190613b8e565b60405180910390f35b3480156103ff57600080fd5b50610408610ffd565b005b34801561041657600080fd5b50610431600480360381019061042c9190613b22565b611219565b005b34801561043f57600080fd5b50610448611239565b005b34801561045657600080fd5b50610471600480360381019061046c9190613a03565b61130a565b60405161047e9190613b07565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613cde565b611326565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613d27565b6113bc565b6040516104e49190613e12565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613a03565b6115b3565b6040516105219190613a71565b60405180910390f35b34801561053657600080fd5b5061053f6115c9565b60405161054c9190613b07565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613d27565b6115cf565b6040516105899190613b07565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613a03565b61169f565b005b3480156105c757600080fd5b506105d0611725565b005b3480156105de57600080fd5b506105e76117ad565b6040516105f49190613b07565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613d27565b6117b3565b6040516106319190613e12565b60405180910390f35b34801561064657600080fd5b5061064f6119c6565b60405161065c9190613a71565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613cde565b6119f0565b005b34801561069a57600080fd5b506106a3611a86565b6040516106b091906139ab565b60405180910390f35b3480156106c557600080fd5b506106ce611b18565b6040516106db9190613b07565b60405180910390f35b6106fe60048036038101906106f99190613a03565b611b1e565b005b34801561070c57600080fd5b5061072760048036038101906107229190613e60565b611d13565b005b34801561073557600080fd5b50610750600480360381019061074b9190613a03565b611e8b565b60405161075d91906139ab565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613f41565b611eb0565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613a03565b611f2c565b005b3480156107c457600080fd5b506107cd611fb2565b6040516107da9190613a71565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613d27565b611fca565b60405161081791906138f7565b60405180910390f35b34801561082c57600080fd5b5061084760048036038101906108429190613a03565b6120d6565b60405161085491906139ab565b60405180910390f35b34801561086957600080fd5b50610872612111565b60405161087f9190613b07565b60405180910390f35b34801561089457600080fd5b5061089d612117565b6040516108aa91906139ab565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613fc4565b6121a9565b6040516108e791906138f7565b60405180910390f35b3480156108fc57600080fd5b5061090561223d565b60405161091291906138f7565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613d27565b612250565b005b34801561095057600080fd5b5061096b60048036038101906109669190613a03565b612348565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab05750610aaf826123e1565b5b9050919050565b610abf61244b565b73ffffffffffffffffffffffffffffffffffffffff16610add6119c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614050565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f601060009054906101000a900460ff16604051610b9b91906138f7565b60405180910390a1565b606060028054610bb49061409f565b80601f0160208091040260200160405190810160405280929190818152602001828054610be09061409f565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000610c4282612453565b610c78576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cbe826115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d26576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d4561244b565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d775750610d7581610d7061244b565b6121a9565b155b15610dae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db98383836124a1565b505050565b6000610dc8612553565b6001546000540303905090565b610de083838361255c565b505050565b600080600090506000805490506000610dfc61375d565b6000610e06612553565b90505b83811015610fac57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115610ee357610fa1565b8773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161415610f2c57600192508480600101955050610f7f565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161415610f79578215610f745784806001019550505b610f7e565b600092505b5b828015610f8e57506001850387145b15610fa0578095505050505050610fdf565b5b806001019050610e09565b506040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b60136020528060005260406000206000915090505481565b61100561244b565b73ffffffffffffffffffffffffffffffffffffffff166110236119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614050565b60405180910390fd5b6000479050600060028261108d919061412f565b90506000818361109d9190614160565b9050600073aba96619b891ad24ffcafa3e05630f968b21e89a73ffffffffffffffffffffffffffffffffffffffff16836040516110d9906141c5565b60006040518083038185875af1925050503d8060008114611116576040519150601f19603f3d011682016040523d82523d6000602084013e61111b565b606091505b505090508061115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690614226565b60405180910390fd5b60006111696119c6565b73ffffffffffffffffffffffffffffffffffffffff168360405161118c906141c5565b60006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b5050905080611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614226565b60405180910390fd5b5050505050565b61123483838360405180602001604052806000815250611eb0565b505050565b61124233611fca565b611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890614292565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c5411156112fd57600c60008154809291906112f7906142b2565b91905055505b611308336001612a12565b565b6000611314612553565b8261131f9190614160565b9050919050565b61132e61244b565b73ffffffffffffffffffffffffffffffffffffffff1661134c6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990614050565b60405180910390fd5b80601290805190602001906113b89291906137a0565b5050565b606060006113c9836115cf565b67ffffffffffffffff8111156113e2576113e1613bb3565b5b6040519080825280602002602001820160405280156114105781602001602082028036833780820191505090505b50905060008054905060008060005b838110156115a6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156114fc5750611599565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461153c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611597578186858060010196508151811061158a576115896142dc565b5b6020026020010181815250505b505b808060010191505061141f565b5083945050505050919050565b60006115be82612a30565b600001519050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116a761244b565b73ffffffffffffffffffffffffffffffffffffffff166116c56119c6565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290614050565b60405180910390fd5b80600a8190555050565b61172d61244b565b73ffffffffffffffffffffffffffffffffffffffff1661174b6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614050565b60405180910390fd5b6117ab6000612cbf565b565b600c5481565b606060006117c0836115cf565b905060008054905060008060008467ffffffffffffffff8111156117e7576117e6613bb3565b5b6040519080825280602002602001820160405280156118155781602001602082028036833780820191505090505b5090506000611822612553565b90505b848110156119b8576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561190257506119ad565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461194257806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561199d57818386806001019750815181106119905761198f6142dc565b5b6020026020010181815250505b868514156119ab57506119b8565b505b806001019050611825565b508095505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119f861244b565b73ffffffffffffffffffffffffffffffffffffffff16611a166119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614050565b60405180910390fd5b8060119080519060200190611a829291906137a0565b5050565b606060038054611a959061409f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac19061409f565b8015611b0e5780601f10611ae357610100808354040283529160200191611b0e565b820191906000526020600020905b815481529060010190602001808311611af157829003601f168201915b5050505050905090565b600a5481565b601060009054906101000a900460ff16611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614357565b60405180910390fd5b600a5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bbb9190614377565b1115611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061443f565b60405180910390fd5b600b54600c5482611c0b610dbe565b611c159190614377565b611c1f9190614377565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c57906144ab565b60405180910390fd5b3481600954611c6f91906144cb565b1115611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790614571565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cff9190614377565b92505081905550611d103382612a12565b50565b611d1b61244b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d80576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d8d61244b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3a61244b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e7f91906138f7565b60405180910390a35050565b6060611ea96013600084815260200190815260200160002054612d85565b9050919050565b611ebb84848461255c565b611eda8373ffffffffffffffffffffffffffffffffffffffff166123ce565b8015611eef5750611eed84848484612efc565b155b15611f26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611f3461244b565b73ffffffffffffffffffffffffffffffffffffffff16611f526119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f90614050565b60405180910390fd5b80600c8190555050565b73aba96619b891ad24ffcafa3e05630f968b21e89a81565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016120289190613a71565b60206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207891906145a6565b1180156120cf5750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b60606120e18261305c565b6120ea83611e8b565b6040516020016120fb92919061465b565b6040516020818303038152906040529050919050565b600b5481565b6060601180546121269061409f565b80601f01602080910402602001604051908101604052809291908181526020018280546121529061409f565b801561219f5780601f106121745761010080835404028352916020019161219f565b820191906000526020600020905b81548152906001019060200180831161218257829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61225861244b565b73ffffffffffffffffffffffffffffffffffffffff166122766119c6565b73ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c390614050565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906146fc565b60405180910390fd5b61234581612cbf565b50565b61235061244b565b73ffffffffffffffffffffffffffffffffffffffff1661236e6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614050565b60405180910390fd5b8060098190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008161245e612553565b1115801561246d575060005482105b801561249a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061256782612a30565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125d2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125f361244b565b73ffffffffffffffffffffffffffffffffffffffff16148061262257506126218561261c61244b565b6121a9565b5b80612667575061263061244b565b73ffffffffffffffffffffffffffffffffffffffff1661264f84610c37565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126a0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612707576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271485858560016130fb565b612720600084876124a1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129a057600054821461299f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a0b8585856001613101565b5050505050565b612a2c828260405180602001604052806000815250613107565b5050565b612a3861375d565b600082905080612a46612553565b11158015612a55575060005481105b15612c88576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612c8657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b6a578092505050612cba565b5b600115612c8557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c80578092505050612cba565b612b6b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060008260001c90506000602090506000816002612da491906144cb565b67ffffffffffffffff811115612dbd57612dbc613bb3565b5b6040519080825280601f01601f191660200182016040528015612def5781602001600182028036833780820191505090505b5090506000826002612e0191906144cb565b90505b6000811115612ead577f3031323334353637383961626364656600000000000000000000000000000000600f851660108110612e4357612e426142dc565b5b1a60f81b82600183612e559190614160565b81518110612e6657612e656142dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600484901c935080612ea6906142b2565b9050612e04565b5060008314612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890614768565b60405180910390fd5b809350505050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f2261244b565b8786866040518563ffffffff1660e01b8152600401612f4494939291906147dd565b602060405180830381600087803b158015612f5e57600080fd5b505af1925050508015612f8f57506040513d601f19601f82011682018060405250810190612f8c919061483e565b60015b613009573d8060008114612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b50600081511415613001576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061306782612453565b61309d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130a7613119565b90506000815114156130c857604051806020016040528060008152506130f3565b806130d2846131ab565b6040516020016130e392919061486b565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b613114838383600161330c565b505050565b6060601280546131289061409f565b80601f01602080910402602001604051908101604052809291908181526020018280546131549061409f565b80156131a15780601f10613176576101008083540402835291602001916131a1565b820191906000526020600020905b81548152906001019060200180831161318457829003601f168201915b5050505050905090565b606060008214156131f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613307565b600082905060005b6000821461322557808061320e9061488f565b915050600a8261321e919061412f565b91506131fb565b60008167ffffffffffffffff81111561324157613240613bb3565b5b6040519080825280601f01601f1916602001820160405280156132735781602001600182028036833780820191505090505b5090505b600085146133005760018261328c9190614160565b9150600a8561329b91906148d8565b60306132a79190614377565b60f81b8183815181106132bd576132bc6142dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f9919061412f565b9450613277565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613379576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156133b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133c160008683876130fb565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561358b575061358a8773ffffffffffffffffffffffffffffffffffffffff166123ce565b5b15613651575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136006000888480600101955088612efc565b613636576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561359157826000541461364c57600080fd5b6136bd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613652575b8160008190555050506136d081856136e4565b6136dd6000868387613101565b5050505050565b60005b81811015613758574281846136fc9190614377565b60405160200161370d92919061492a565b604051602081830303815290604052805190602001206013600083866137339190614377565b81526020019081526020016000208190555080806137509061488f565b9150506136e7565b505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546137ac9061409f565b90600052602060002090601f0160209004810192826137ce5760008555613815565b82601f106137e757805160ff1916838001178555613815565b82800160010185558215613815579182015b828111156138145782518255916020019190600101906137f9565b5b5090506138229190613826565b5090565b5b8082111561383f576000816000905550600101613827565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61388c81613857565b811461389757600080fd5b50565b6000813590506138a981613883565b92915050565b6000602082840312156138c5576138c461384d565b5b60006138d38482850161389a565b91505092915050565b60008115159050919050565b6138f1816138dc565b82525050565b600060208201905061390c60008301846138e8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394c578082015181840152602081019050613931565b8381111561395b576000848401525b50505050565b6000601f19601f8301169050919050565b600061397d82613912565b613987818561391d565b935061399781856020860161392e565b6139a081613961565b840191505092915050565b600060208201905081810360008301526139c58184613972565b905092915050565b6000819050919050565b6139e0816139cd565b81146139eb57600080fd5b50565b6000813590506139fd816139d7565b92915050565b600060208284031215613a1957613a1861384d565b5b6000613a27848285016139ee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b82525050565b6000602082019050613a866000830184613a62565b92915050565b613a9581613a50565b8114613aa057600080fd5b50565b600081359050613ab281613a8c565b92915050565b60008060408385031215613acf57613ace61384d565b5b6000613add85828601613aa3565b9250506020613aee858286016139ee565b9150509250929050565b613b01816139cd565b82525050565b6000602082019050613b1c6000830184613af8565b92915050565b600080600060608486031215613b3b57613b3a61384d565b5b6000613b4986828701613aa3565b9350506020613b5a86828701613aa3565b9250506040613b6b868287016139ee565b9150509250925092565b6000819050919050565b613b8881613b75565b82525050565b6000602082019050613ba36000830184613b7f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613beb82613961565b810181811067ffffffffffffffff82111715613c0a57613c09613bb3565b5b80604052505050565b6000613c1d613843565b9050613c298282613be2565b919050565b600067ffffffffffffffff821115613c4957613c48613bb3565b5b613c5282613961565b9050602081019050919050565b82818337600083830152505050565b6000613c81613c7c84613c2e565b613c13565b905082815260208101848484011115613c9d57613c9c613bae565b5b613ca8848285613c5f565b509392505050565b600082601f830112613cc557613cc4613ba9565b5b8135613cd5848260208601613c6e565b91505092915050565b600060208284031215613cf457613cf361384d565b5b600082013567ffffffffffffffff811115613d1257613d11613852565b5b613d1e84828501613cb0565b91505092915050565b600060208284031215613d3d57613d3c61384d565b5b6000613d4b84828501613aa3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d89816139cd565b82525050565b6000613d9b8383613d80565b60208301905092915050565b6000602082019050919050565b6000613dbf82613d54565b613dc98185613d5f565b9350613dd483613d70565b8060005b83811015613e05578151613dec8882613d8f565b9750613df783613da7565b925050600181019050613dd8565b5085935050505092915050565b60006020820190508181036000830152613e2c8184613db4565b905092915050565b613e3d816138dc565b8114613e4857600080fd5b50565b600081359050613e5a81613e34565b92915050565b60008060408385031215613e7757613e7661384d565b5b6000613e8585828601613aa3565b9250506020613e9685828601613e4b565b9150509250929050565b600067ffffffffffffffff821115613ebb57613eba613bb3565b5b613ec482613961565b9050602081019050919050565b6000613ee4613edf84613ea0565b613c13565b905082815260208101848484011115613f0057613eff613bae565b5b613f0b848285613c5f565b509392505050565b600082601f830112613f2857613f27613ba9565b5b8135613f38848260208601613ed1565b91505092915050565b60008060008060808587031215613f5b57613f5a61384d565b5b6000613f6987828801613aa3565b9450506020613f7a87828801613aa3565b9350506040613f8b878288016139ee565b925050606085013567ffffffffffffffff811115613fac57613fab613852565b5b613fb887828801613f13565b91505092959194509250565b60008060408385031215613fdb57613fda61384d565b5b6000613fe985828601613aa3565b9250506020613ffa85828601613aa3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061403a60208361391d565b915061404582614004565b602082019050919050565b600060208201905081810360008301526140698161402d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140b757607f821691505b602082108114156140cb576140ca614070565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061413a826139cd565b9150614145836139cd565b925082614155576141546140d1565b5b828204905092915050565b600061416b826139cd565b9150614176836139cd565b92508282101561418957614188614100565b5b828203905092915050565b600081905092915050565b50565b60006141af600083614194565b91506141ba8261419f565b600082019050919050565b60006141d0826141a2565b9150819050919050565b7f7769746864726177206661696c65640000000000000000000000000000000000600082015250565b6000614210600f8361391d565b915061421b826141da565b602082019050919050565b6000602082019050818103600083015261423f81614203565b9050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b600061427c60058361391d565b915061428782614246565b602082019050919050565b600060208201905081810360008301526142ab8161426f565b9050919050565b60006142bd826139cd565b915060008214156142d1576142d0614100565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b6000614341600d8361391d565b915061434c8261430b565b602082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b6000614382826139cd565b915061438d836139cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c2576143c1614100565b5b828201905092915050565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061442960248361391d565b9150614434826143cd565b604082019050919050565b600060208201905081810360008301526144588161441c565b9050919050565b7f7468697320776f756c6420657863656564206d6178206d696e74730000000000600082015250565b6000614495601b8361391d565b91506144a08261445f565b602082019050919050565b600060208201905081810360008301526144c481614488565b9050919050565b60006144d6826139cd565b91506144e1836139cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451a57614519614100565b5b828202905092915050565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b600061455b60158361391d565b915061456682614525565b602082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b6000815190506145a0816139d7565b92915050565b6000602082840312156145bc576145bb61384d565b5b60006145ca84828501614591565b91505092915050565b600081905092915050565b60006145e982613912565b6145f381856145d3565b935061460381856020860161392e565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146456001836145d3565b91506146508261460f565b600182019050919050565b600061466782856145de565b915061467282614638565b915061467e82846145de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146e660268361391d565b91506146f18261468a565b604082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061475260208361391d565b915061475d8261471c565b602082019050919050565b6000602082019050818103600083015261478181614745565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147af82614788565b6147b98185614793565b93506147c981856020860161392e565b6147d281613961565b840191505092915050565b60006080820190506147f26000830187613a62565b6147ff6020830186613a62565b61480c6040830185613af8565b818103606083015261481e81846147a4565b905095945050505050565b60008151905061483881613883565b92915050565b6000602082840312156148545761485361384d565b5b600061486284828501614829565b91505092915050565b600061487782856145de565b915061488382846145de565b91508190509392505050565b600061489a826139cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cd576148cc614100565b5b600182019050919050565b60006148e3826139cd565b91506148ee836139cd565b9250826148fe576148fd6140d1565b5b828206905092915050565b6000819050919050565b61492461491f826139cd565b614909565b82525050565b60006149368285614913565b6020820191506149468284614913565b602082019150819050939250505056fea264697066735822122095eed56b37b8cada2695ef62d9d9b95d4749087a6256b70a30968c7c27725f1f64736f6c6343000809003368747470733a2f2f626c6f636b7964696e6f732e78797a2f6d657461646174612f68747470733a2f2f626c6f636b7964696e6f732e78797a2f64696e6f2f626c6f636b7964696e6f732e6a736f6e

Deployed Bytecode

0x60806040526004361061023b5760003560e01c806375e115891161012e578063be75973a116100ab578063e8a3d4851161006f578063e8a3d48514610888578063e985e9c5146108b3578063eb8d2444146108f0578063f2fde38b1461091b578063f4a0a528146109445761023b565b8063be75973a1461078f578063bea90bd4146107b8578063bf3506c1146107e3578063c87b56dd14610820578063d5abeb011461085d5761023b565b8063977b055b116100f2578063977b055b146106b9578063a0712d68146106e4578063a22cb46514610700578063a8ab8a9614610729578063b88d4fde146107665761023b565b806375e11589146105d25780638462151c146105fd5780638da5cb5b1461063a578063938e3d7b1461066557806395d89b411461068e5761023b565b806342842e0e116101bc5780636352211e116101805780636352211e146104ed5780636817c76c1461052a57806370a08231146105555780637118974214610592578063715018a6146105bb5761023b565b806342842e0e1461040a5780634e71d92d146104335780634f6ccce71461044a57806355f804b314610487578063627fdeab146104b05761023b565b806318160ddd1161020357806318160ddd1461032557806323b872dd146103505780632f745c59146103795780633c5ed7e5146103b65780633ccfd60b146103f35761023b565b806301ffc9a714610240578063049c5c491461027d57806306fdde0314610294578063081812fc146102bf578063095ea7b3146102fc575b600080fd5b34801561024c57600080fd5b50610267600480360381019061026291906138af565b61096d565b60405161027491906138f7565b60405180910390f35b34801561028957600080fd5b50610292610ab7565b005b3480156102a057600080fd5b506102a9610ba5565b6040516102b691906139ab565b60405180910390f35b3480156102cb57600080fd5b506102e660048036038101906102e19190613a03565b610c37565b6040516102f39190613a71565b60405180910390f35b34801561030857600080fd5b50610323600480360381019061031e9190613ab8565b610cb3565b005b34801561033157600080fd5b5061033a610dbe565b6040516103479190613b07565b60405180910390f35b34801561035c57600080fd5b5061037760048036038101906103729190613b22565b610dd5565b005b34801561038557600080fd5b506103a0600480360381019061039b9190613ab8565b610de5565b6040516103ad9190613b07565b60405180910390f35b3480156103c257600080fd5b506103dd60048036038101906103d89190613a03565b610fe5565b6040516103ea9190613b8e565b60405180910390f35b3480156103ff57600080fd5b50610408610ffd565b005b34801561041657600080fd5b50610431600480360381019061042c9190613b22565b611219565b005b34801561043f57600080fd5b50610448611239565b005b34801561045657600080fd5b50610471600480360381019061046c9190613a03565b61130a565b60405161047e9190613b07565b60405180910390f35b34801561049357600080fd5b506104ae60048036038101906104a99190613cde565b611326565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613d27565b6113bc565b6040516104e49190613e12565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613a03565b6115b3565b6040516105219190613a71565b60405180910390f35b34801561053657600080fd5b5061053f6115c9565b60405161054c9190613b07565b60405180910390f35b34801561056157600080fd5b5061057c60048036038101906105779190613d27565b6115cf565b6040516105899190613b07565b60405180910390f35b34801561059e57600080fd5b506105b960048036038101906105b49190613a03565b61169f565b005b3480156105c757600080fd5b506105d0611725565b005b3480156105de57600080fd5b506105e76117ad565b6040516105f49190613b07565b60405180910390f35b34801561060957600080fd5b50610624600480360381019061061f9190613d27565b6117b3565b6040516106319190613e12565b60405180910390f35b34801561064657600080fd5b5061064f6119c6565b60405161065c9190613a71565b60405180910390f35b34801561067157600080fd5b5061068c60048036038101906106879190613cde565b6119f0565b005b34801561069a57600080fd5b506106a3611a86565b6040516106b091906139ab565b60405180910390f35b3480156106c557600080fd5b506106ce611b18565b6040516106db9190613b07565b60405180910390f35b6106fe60048036038101906106f99190613a03565b611b1e565b005b34801561070c57600080fd5b5061072760048036038101906107229190613e60565b611d13565b005b34801561073557600080fd5b50610750600480360381019061074b9190613a03565b611e8b565b60405161075d91906139ab565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613f41565b611eb0565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613a03565b611f2c565b005b3480156107c457600080fd5b506107cd611fb2565b6040516107da9190613a71565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613d27565b611fca565b60405161081791906138f7565b60405180910390f35b34801561082c57600080fd5b5061084760048036038101906108429190613a03565b6120d6565b60405161085491906139ab565b60405180910390f35b34801561086957600080fd5b50610872612111565b60405161087f9190613b07565b60405180910390f35b34801561089457600080fd5b5061089d612117565b6040516108aa91906139ab565b60405180910390f35b3480156108bf57600080fd5b506108da60048036038101906108d59190613fc4565b6121a9565b6040516108e791906138f7565b60405180910390f35b3480156108fc57600080fd5b5061090561223d565b60405161091291906138f7565b60405180910390f35b34801561092757600080fd5b50610942600480360381019061093d9190613d27565b612250565b005b34801561095057600080fd5b5061096b60048036038101906109669190613a03565b612348565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a3857507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610aa057507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610ab05750610aaf826123e1565b5b9050919050565b610abf61244b565b73ffffffffffffffffffffffffffffffffffffffff16610add6119c6565b73ffffffffffffffffffffffffffffffffffffffff1614610b33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2a90614050565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f601060009054906101000a900460ff16604051610b9b91906138f7565b60405180910390a1565b606060028054610bb49061409f565b80601f0160208091040260200160405190810160405280929190818152602001828054610be09061409f565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000610c4282612453565b610c78576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610cbe826115b3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610d26576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d4561244b565b73ffffffffffffffffffffffffffffffffffffffff1614158015610d775750610d7581610d7061244b565b6121a9565b155b15610dae576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610db98383836124a1565b505050565b6000610dc8612553565b6001546000540303905090565b610de083838361255c565b505050565b600080600090506000805490506000610dfc61375d565b6000610e06612553565b90505b83811015610fac57600460008281526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150816040015115610ee357610fa1565b8773ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161415610f2c57600192508480600101955050610f7f565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff161415610f79578215610f745784806001019550505b610f7e565b600092505b5b828015610f8e57506001850387145b15610fa0578095505050505050610fdf565b5b806001019050610e09565b506040517f0ddac30e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b92915050565b60136020528060005260406000206000915090505481565b61100561244b565b73ffffffffffffffffffffffffffffffffffffffff166110236119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090614050565b60405180910390fd5b6000479050600060028261108d919061412f565b90506000818361109d9190614160565b9050600073aba96619b891ad24ffcafa3e05630f968b21e89a73ffffffffffffffffffffffffffffffffffffffff16836040516110d9906141c5565b60006040518083038185875af1925050503d8060008114611116576040519150601f19603f3d011682016040523d82523d6000602084013e61111b565b606091505b505090508061115f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115690614226565b60405180910390fd5b60006111696119c6565b73ffffffffffffffffffffffffffffffffffffffff168360405161118c906141c5565b60006040518083038185875af1925050503d80600081146111c9576040519150601f19603f3d011682016040523d82523d6000602084013e6111ce565b606091505b5050905080611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120990614226565b60405180910390fd5b5050505050565b61123483838360405180602001604052806000815250611eb0565b505050565b61124233611fca565b611281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127890614292565b60405180910390fd5b6001600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600c5411156112fd57600c60008154809291906112f7906142b2565b91905055505b611308336001612a12565b565b6000611314612553565b8261131f9190614160565b9050919050565b61132e61244b565b73ffffffffffffffffffffffffffffffffffffffff1661134c6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146113a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139990614050565b60405180910390fd5b80601290805190602001906113b89291906137a0565b5050565b606060006113c9836115cf565b67ffffffffffffffff8111156113e2576113e1613bb3565b5b6040519080825280602002602001820160405280156114105781602001602082028036833780820191505090505b50905060008054905060008060005b838110156115a6576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151156114fc5750611599565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461153c57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611597578186858060010196508151811061158a576115896142dc565b5b6020026020010181815250505b505b808060010191505061141f565b5083945050505050919050565b60006115be82612a30565b600001519050919050565b60095481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611637576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6116a761244b565b73ffffffffffffffffffffffffffffffffffffffff166116c56119c6565b73ffffffffffffffffffffffffffffffffffffffff161461171b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171290614050565b60405180910390fd5b80600a8190555050565b61172d61244b565b73ffffffffffffffffffffffffffffffffffffffff1661174b6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146117a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179890614050565b60405180910390fd5b6117ab6000612cbf565b565b600c5481565b606060006117c0836115cf565b905060008054905060008060008467ffffffffffffffff8111156117e7576117e6613bb3565b5b6040519080825280602002602001820160405280156118155781602001602082028036833780820191505090505b5090506000611822612553565b90505b848110156119b8576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001511561190257506119ad565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461194257806000015193505b8873ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561199d57818386806001019750815181106119905761198f6142dc565b5b6020026020010181815250505b868514156119ab57506119b8565b505b806001019050611825565b508095505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6119f861244b565b73ffffffffffffffffffffffffffffffffffffffff16611a166119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611a6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6390614050565b60405180910390fd5b8060119080519060200190611a829291906137a0565b5050565b606060038054611a959061409f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ac19061409f565b8015611b0e5780601f10611ae357610100808354040283529160200191611b0e565b820191906000526020600020905b815481529060010190602001808311611af157829003601f168201915b5050505050905090565b600a5481565b601060009054906101000a900460ff16611b6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6490614357565b60405180910390fd5b600a5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bbb9190614377565b1115611bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bf39061443f565b60405180910390fd5b600b54600c5482611c0b610dbe565b611c159190614377565b611c1f9190614377565b1115611c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c57906144ab565b60405180910390fd5b3481600954611c6f91906144cb565b1115611cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca790614571565b60405180910390fd5b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cff9190614377565b92505081905550611d103382612a12565b50565b611d1b61244b565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d80576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611d8d61244b565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611e3a61244b565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611e7f91906138f7565b60405180910390a35050565b6060611ea96013600084815260200190815260200160002054612d85565b9050919050565b611ebb84848461255c565b611eda8373ffffffffffffffffffffffffffffffffffffffff166123ce565b8015611eef5750611eed84848484612efc565b155b15611f26576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b611f3461244b565b73ffffffffffffffffffffffffffffffffffffffff16611f526119c6565b73ffffffffffffffffffffffffffffffffffffffff1614611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f90614050565b60405180910390fd5b80600c8190555050565b73aba96619b891ad24ffcafa3e05630f968b21e89a81565b600080600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016120289190613a71565b60206040518083038186803b15801561204057600080fd5b505afa158015612054573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061207891906145a6565b1180156120cf5750600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16155b9050919050565b60606120e18261305c565b6120ea83611e8b565b6040516020016120fb92919061465b565b6040516020818303038152906040529050919050565b600b5481565b6060601180546121269061409f565b80601f01602080910402602001604051908101604052809291908181526020018280546121529061409f565b801561219f5780601f106121745761010080835404028352916020019161219f565b820191906000526020600020905b81548152906001019060200180831161218257829003601f168201915b5050505050905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61225861244b565b73ffffffffffffffffffffffffffffffffffffffff166122766119c6565b73ffffffffffffffffffffffffffffffffffffffff16146122cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c390614050565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561233c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612333906146fc565b60405180910390fd5b61234581612cbf565b50565b61235061244b565b73ffffffffffffffffffffffffffffffffffffffff1661236e6119c6565b73ffffffffffffffffffffffffffffffffffffffff16146123c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123bb90614050565b60405180910390fd5b8060098190555050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008161245e612553565b1115801561246d575060005482105b801561249a575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061256782612a30565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146125d2576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166125f361244b565b73ffffffffffffffffffffffffffffffffffffffff16148061262257506126218561261c61244b565b6121a9565b5b80612667575061263061244b565b73ffffffffffffffffffffffffffffffffffffffff1661264f84610c37565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806126a0576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612707576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61271485858560016130fb565b612720600084876124a1565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614156129a057600054821461299f57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a0b8585856001613101565b5050505050565b612a2c828260405180602001604052806000815250613107565b5050565b612a3861375d565b600082905080612a46612553565b11158015612a55575060005481105b15612c88576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151612c8657600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b6a578092505050612cba565b5b600115612c8557818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612c80578092505050612cba565b612b6b565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b606060008260001c90506000602090506000816002612da491906144cb565b67ffffffffffffffff811115612dbd57612dbc613bb3565b5b6040519080825280601f01601f191660200182016040528015612def5781602001600182028036833780820191505090505b5090506000826002612e0191906144cb565b90505b6000811115612ead577f3031323334353637383961626364656600000000000000000000000000000000600f851660108110612e4357612e426142dc565b5b1a60f81b82600183612e559190614160565b81518110612e6657612e656142dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600484901c935080612ea6906142b2565b9050612e04565b5060008314612ef1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ee890614768565b60405180910390fd5b809350505050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f2261244b565b8786866040518563ffffffff1660e01b8152600401612f4494939291906147dd565b602060405180830381600087803b158015612f5e57600080fd5b505af1925050508015612f8f57506040513d601f19601f82011682018060405250810190612f8c919061483e565b60015b613009573d8060008114612fbf576040519150601f19603f3d011682016040523d82523d6000602084013e612fc4565b606091505b50600081511415613001576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606061306782612453565b61309d576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006130a7613119565b90506000815114156130c857604051806020016040528060008152506130f3565b806130d2846131ab565b6040516020016130e392919061486b565b6040516020818303038152906040525b915050919050565b50505050565b50505050565b613114838383600161330c565b505050565b6060601280546131289061409f565b80601f01602080910402602001604051908101604052809291908181526020018280546131549061409f565b80156131a15780601f10613176576101008083540402835291602001916131a1565b820191906000526020600020905b81548152906001019060200180831161318457829003601f168201915b5050505050905090565b606060008214156131f3576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613307565b600082905060005b6000821461322557808061320e9061488f565b915050600a8261321e919061412f565b91506131fb565b60008167ffffffffffffffff81111561324157613240613bb3565b5b6040519080825280601f01601f1916602001820160405280156132735781602001600182028036833780820191505090505b5090505b600085146133005760018261328c9190614160565b9150600a8561329b91906148d8565b60306132a79190614377565b60f81b8183815181106132bd576132bc6142dc565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856132f9919061412f565b9450613277565b8093505050505b919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613379576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156133b4576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6133c160008683876130fb565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561358b575061358a8773ffffffffffffffffffffffffffffffffffffffff166123ce565b5b15613651575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46136006000888480600101955088612efc565b613636576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561359157826000541461364c57600080fd5b6136bd565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415613652575b8160008190555050506136d081856136e4565b6136dd6000868387613101565b5050505050565b60005b81811015613758574281846136fc9190614377565b60405160200161370d92919061492a565b604051602081830303815290604052805190602001206013600083866137339190614377565b81526020019081526020016000208190555080806137509061488f565b9150506136e7565b505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b8280546137ac9061409f565b90600052602060002090601f0160209004810192826137ce5760008555613815565b82601f106137e757805160ff1916838001178555613815565b82800160010185558215613815579182015b828111156138145782518255916020019190600101906137f9565b5b5090506138229190613826565b5090565b5b8082111561383f576000816000905550600101613827565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61388c81613857565b811461389757600080fd5b50565b6000813590506138a981613883565b92915050565b6000602082840312156138c5576138c461384d565b5b60006138d38482850161389a565b91505092915050565b60008115159050919050565b6138f1816138dc565b82525050565b600060208201905061390c60008301846138e8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561394c578082015181840152602081019050613931565b8381111561395b576000848401525b50505050565b6000601f19601f8301169050919050565b600061397d82613912565b613987818561391d565b935061399781856020860161392e565b6139a081613961565b840191505092915050565b600060208201905081810360008301526139c58184613972565b905092915050565b6000819050919050565b6139e0816139cd565b81146139eb57600080fd5b50565b6000813590506139fd816139d7565b92915050565b600060208284031215613a1957613a1861384d565b5b6000613a27848285016139ee565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613a5b82613a30565b9050919050565b613a6b81613a50565b82525050565b6000602082019050613a866000830184613a62565b92915050565b613a9581613a50565b8114613aa057600080fd5b50565b600081359050613ab281613a8c565b92915050565b60008060408385031215613acf57613ace61384d565b5b6000613add85828601613aa3565b9250506020613aee858286016139ee565b9150509250929050565b613b01816139cd565b82525050565b6000602082019050613b1c6000830184613af8565b92915050565b600080600060608486031215613b3b57613b3a61384d565b5b6000613b4986828701613aa3565b9350506020613b5a86828701613aa3565b9250506040613b6b868287016139ee565b9150509250925092565b6000819050919050565b613b8881613b75565b82525050565b6000602082019050613ba36000830184613b7f565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613beb82613961565b810181811067ffffffffffffffff82111715613c0a57613c09613bb3565b5b80604052505050565b6000613c1d613843565b9050613c298282613be2565b919050565b600067ffffffffffffffff821115613c4957613c48613bb3565b5b613c5282613961565b9050602081019050919050565b82818337600083830152505050565b6000613c81613c7c84613c2e565b613c13565b905082815260208101848484011115613c9d57613c9c613bae565b5b613ca8848285613c5f565b509392505050565b600082601f830112613cc557613cc4613ba9565b5b8135613cd5848260208601613c6e565b91505092915050565b600060208284031215613cf457613cf361384d565b5b600082013567ffffffffffffffff811115613d1257613d11613852565b5b613d1e84828501613cb0565b91505092915050565b600060208284031215613d3d57613d3c61384d565b5b6000613d4b84828501613aa3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613d89816139cd565b82525050565b6000613d9b8383613d80565b60208301905092915050565b6000602082019050919050565b6000613dbf82613d54565b613dc98185613d5f565b9350613dd483613d70565b8060005b83811015613e05578151613dec8882613d8f565b9750613df783613da7565b925050600181019050613dd8565b5085935050505092915050565b60006020820190508181036000830152613e2c8184613db4565b905092915050565b613e3d816138dc565b8114613e4857600080fd5b50565b600081359050613e5a81613e34565b92915050565b60008060408385031215613e7757613e7661384d565b5b6000613e8585828601613aa3565b9250506020613e9685828601613e4b565b9150509250929050565b600067ffffffffffffffff821115613ebb57613eba613bb3565b5b613ec482613961565b9050602081019050919050565b6000613ee4613edf84613ea0565b613c13565b905082815260208101848484011115613f0057613eff613bae565b5b613f0b848285613c5f565b509392505050565b600082601f830112613f2857613f27613ba9565b5b8135613f38848260208601613ed1565b91505092915050565b60008060008060808587031215613f5b57613f5a61384d565b5b6000613f6987828801613aa3565b9450506020613f7a87828801613aa3565b9350506040613f8b878288016139ee565b925050606085013567ffffffffffffffff811115613fac57613fab613852565b5b613fb887828801613f13565b91505092959194509250565b60008060408385031215613fdb57613fda61384d565b5b6000613fe985828601613aa3565b9250506020613ffa85828601613aa3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061403a60208361391d565b915061404582614004565b602082019050919050565b600060208201905081810360008301526140698161402d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806140b757607f821691505b602082108114156140cb576140ca614070565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061413a826139cd565b9150614145836139cd565b925082614155576141546140d1565b5b828204905092915050565b600061416b826139cd565b9150614176836139cd565b92508282101561418957614188614100565b5b828203905092915050565b600081905092915050565b50565b60006141af600083614194565b91506141ba8261419f565b600082019050919050565b60006141d0826141a2565b9150819050919050565b7f7769746864726177206661696c65640000000000000000000000000000000000600082015250565b6000614210600f8361391d565b915061421b826141da565b602082019050919050565b6000602082019050818103600083015261423f81614203565b9050919050565b7f6572726f72000000000000000000000000000000000000000000000000000000600082015250565b600061427c60058361391d565b915061428782614246565b602082019050919050565b600060208201905081810360008301526142ab8161426f565b9050919050565b60006142bd826139cd565b915060008214156142d1576142d0614100565b5b600182039050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b6000614341600d8361391d565b915061434c8261430b565b602082019050919050565b6000602082019050818103600083015261437081614334565b9050919050565b6000614382826139cd565b915061438d836139cd565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143c2576143c1614100565b5b828201905092915050565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b600061442960248361391d565b9150614434826143cd565b604082019050919050565b600060208201905081810360008301526144588161441c565b9050919050565b7f7468697320776f756c6420657863656564206d6178206d696e74730000000000600082015250565b6000614495601b8361391d565b91506144a08261445f565b602082019050919050565b600060208201905081810360008301526144c481614488565b9050919050565b60006144d6826139cd565b91506144e1836139cd565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561451a57614519614100565b5b828202905092915050565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b600061455b60158361391d565b915061456682614525565b602082019050919050565b6000602082019050818103600083015261458a8161454e565b9050919050565b6000815190506145a0816139d7565b92915050565b6000602082840312156145bc576145bb61384d565b5b60006145ca84828501614591565b91505092915050565b600081905092915050565b60006145e982613912565b6145f381856145d3565b935061460381856020860161392e565b80840191505092915050565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146456001836145d3565b91506146508261460f565b600182019050919050565b600061466782856145de565b915061467282614638565b915061467e82846145de565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006146e660268361391d565b91506146f18261468a565b604082019050919050565b60006020820190508181036000830152614715816146d9565b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b600061475260208361391d565b915061475d8261471c565b602082019050919050565b6000602082019050818103600083015261478181614745565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006147af82614788565b6147b98185614793565b93506147c981856020860161392e565b6147d281613961565b840191505092915050565b60006080820190506147f26000830187613a62565b6147ff6020830186613a62565b61480c6040830185613af8565b818103606083015261481e81846147a4565b905095945050505050565b60008151905061483881613883565b92915050565b6000602082840312156148545761485361384d565b5b600061486284828501614829565b91505092915050565b600061487782856145de565b915061488382846145de565b91508190509392505050565b600061489a826139cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148cd576148cc614100565b5b600182019050919050565b60006148e3826139cd565b91506148ee836139cd565b9250826148fe576148fd6140d1565b5b828206905092915050565b6000819050919050565b61492461491f826139cd565b614909565b82525050565b60006149368285614913565b6020820191506149468284614913565b602082019150819050939250505056fea264697066735822122095eed56b37b8cada2695ef62d9d9b95d4749087a6256b70a30968c7c27725f1f64736f6c63430008090033

Deployed Bytecode Sourcemap

50448:4850:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29325:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52652:138;;;;;;;;;;;;;:::i;:::-;;35293:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36796:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36359:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28565:312;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37661:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31140:977;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51190:42;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53150:444;;;;;;;;;;;;;:::i;:::-;;37902:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51556:239;;;;;;;;;;;;;:::i;:::-;;32298:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54400:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53604:788;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35093:133;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50627:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29761:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52908:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24799:103;;;;;;;;;;;;;:::i;:::-;;50748:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32534:1174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24148:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54512:117;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35462:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50671:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51803:549;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37072:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54947:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38158:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53026:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50516:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51401:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54759:180;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50709:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55090:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37430:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50992:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25057:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52798:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29325:372;29427:4;29479:25;29464:40;;;:11;:40;;;;:105;;;;29536:33;29521:48;;;:11;:48;;;;29464:105;:172;;;;29601:35;29586:50;;;:11;:50;;;;29464:172;:225;;;;29653:36;29677:11;29653:23;:36::i;:::-;29464:225;29444:245;;29325:372;;;:::o;52652:138::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52726:12:::1;;;;;;;;;;;52725:13;52710:12;;:28;;;;;;;;;;;;;;;;;;52754;52769:12;;;;;;;;;;;52754:28;;;;;;:::i;:::-;;;;;;;;52652:138::o:0;35293:100::-;35347:13;35380:5;35373:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35293:100;:::o;36796:204::-;36864:7;36889:16;36897:7;36889;:16::i;:::-;36884:64;;36914:34;;;;;;;;;;;;;;36884:64;36968:15;:24;36984:7;36968:24;;;;;;;;;;;;;;;;;;;;;36961:31;;36796:204;;;:::o;36359:371::-;36432:13;36448:24;36464:7;36448:15;:24::i;:::-;36432:40;;36493:5;36487:11;;:2;:11;;;36483:48;;;36507:24;;;;;;;;;;;;;;36483:48;36564:5;36548:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;36574:37;36591:5;36598:12;:10;:12::i;:::-;36574:16;:37::i;:::-;36573:38;36548:63;36544:138;;;36635:35;;;;;;;;;;;;;;36544:138;36694:28;36703:2;36707:7;36716:5;36694:8;:28::i;:::-;36421:309;36359:371;;:::o;28565:312::-;28618:7;28843:15;:13;:15::i;:::-;28828:12;;28812:13;;:28;:46;28805:53;;28565:312;:::o;37661:170::-;37795:28;37805:4;37811:2;37815:7;37795:9;:28::i;:::-;37661:170;;;:::o;31140:977::-;31231:7;31251:17;31271:1;31251:21;;31283:18;31304:13;;31283:34;;31328:13;31361:31;;:::i;:::-;31434:9;31446:15;:13;:15::i;:::-;31434:27;;31429:629;31467:10;31463:1;:14;31429:629;;;31515:11;:14;31527:1;31515:14;;;;;;;;;;;31503:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31552:9;:16;;;31548:73;;;31593:8;;31548:73;31660:5;31642:23;;:9;:14;;;:23;;;31639:293;;;31701:4;31690:15;;31729:11;;;;;;;31639:293;;;31795:1;31769:28;;:9;:14;;;:28;;;31766:166;;;31825:8;31822:24;;;31835:11;;;;;;;31822:24;31766:166;;;31906:5;31895:16;;31766:166;31639:293;31953:8;:36;;;;;31987:1;31975:9;:13;31965:5;:24;31953:36;31950:93;;;32021:1;32014:8;;;;;;;;;31950:93;31429:629;31479:3;;;;;31429:629;;;;32086:23;;;;;;;;;;;;;;31140:977;;;;;:::o;51190:42::-;;;;;;;;;;;;;;;;;:::o;53150:444::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53200:20:::1;53223:21;53200:44;;53255:19;53292:1;53277:12;:16;;;;:::i;:::-;53255:38;;53304:17;53339:11;53324:12;:26;;;;:::i;:::-;53304:46;;53364:11;50550:42;53381:21;;53410:11;53381:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53363:63;;;53445:6;53437:34;;;;;;;;;;;;:::i;:::-;;;;;;;;;53483:10;53507:7;:5;:7::i;:::-;53499:21;;53528:9;53499:43;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53482:60;;;53561:5;53553:33;;;;;;;;;;;;:::i;:::-;;;;;;;;;53189:405;;;;;53150:444::o:0;37902:185::-;38040:39;38057:4;38063:2;38067:7;38040:39;;;;;;;;;;;;:16;:39::i;:::-;37902:185;;;:::o;51556:239::-;51601:20;51610:10;51601:8;:20::i;:::-;51593:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51672:4;51644:13;:25;51658:10;51644:25;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;51707:1;51690:14;;:18;51687:66;;;51725:14;;:16;;;;;;;;;:::i;:::-;;;;;;51687:66;51763:24;51773:10;51785:1;51763:9;:24::i;:::-;51556:239::o;32298:128::-;32367:7;32402:15;:13;:15::i;:::-;32394:5;:23;;;;:::i;:::-;32387:30;;32298:128;;;:::o;54400:104::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54489:7:::1;54473:13;:23;;;;;;;;;;;;:::i;:::-;;54400:104:::0;:::o;53604:788::-;53668:16;53722:18;53757:16;53767:5;53757:9;:16::i;:::-;53743:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53722:52;;53789:11;53803:13;;53789:27;;53831:19;53865:25;53910:9;53905:446;53925:3;53921:1;:7;53905:446;;;53954:31;53988:11;:14;54000:1;53988:14;;;;;;;;;;;53954:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54025:9;:16;;;54021:73;;;54066:8;;;54021:73;54142:1;54116:28;;:9;:14;;;:28;;;54112:111;;54189:9;:14;;;54169:34;;54112:111;54266:5;54245:26;;:17;:26;;;54241:95;;;54315:1;54296;54298:13;;;;;;54296:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;54241:95;53935:416;53905:446;53930:3;;;;;;;53905:446;;;;54372:1;54365:8;;;;;;53604:788;;;:::o;35093:133::-;35165:7;35192:21;35205:7;35192:12;:21::i;:::-;:26;;;35185:33;;35093:133;;;:::o;50627:37::-;;;;:::o;29761:214::-;29833:7;29874:1;29857:19;;:5;:19;;;29853:60;;;29885:28;;;;;;;;;;;;;;29853:60;29939:12;:19;29952:5;29939:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;29931:36;;29924:43;;29761:214;;;:::o;52908:110::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52998:12:::1;52984:11;:26;;;;52908:110:::0;:::o;24799:103::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;24864:30:::1;24891:1;24864:18;:30::i;:::-;24799:103::o:0;50748:36::-;;;;:::o;32534:1174::-;32593:16;32622:21;32646:16;32656:5;32646:9;:16::i;:::-;32622:40;;32673:18;32694:13;;32673:34;;32718:19;32748:25;32786:21;32824:13;32810:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32786:52;;32881:9;32893:15;:13;:15::i;:::-;32881:27;;32876:790;32914:10;32910:1;:14;32876:790;;;32950:31;32984:11;:14;32996:1;32984:14;;;;;;;;;;;32950:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33023:9;:16;;;33019:73;;;33064:8;;;33019:73;33194:1;33168:28;;:9;:14;;;:28;;;33164:111;;33241:9;:14;;;33221:34;;33164:111;33396:5;33375:26;;:17;:26;;;33371:98;;;33448:1;33426:4;33431:13;;;;;;33426:19;;;;;;;;:::i;:::-;;;;;;;:23;;;;;33371:98;33588:13;33573:11;:28;33569:82;;;33626:5;;;33569:82;32931:735;32876:790;32926:3;;;;;32876:790;;;;33696:4;33689:11;;;;;;;32534:1174;;;:::o;24148:87::-;24194:7;24221:6;;;;;;;;;;;24214:13;;24148:87;:::o;54512:117::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54609:12:::1;54594;:27;;;;;;;;;;;;:::i;:::-;;54512:117:::0;:::o;35462:104::-;35518:13;35551:7;35544:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35462:104;:::o;50671:31::-;;;;:::o;51803:549::-;51868:12;;;;;;;;;;;51860:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;51953:11;;51944:5;51917:12;:24;51930:10;51917:24;;;;;;;;;;;;;;;;:32;;;;:::i;:::-;:47;;51909:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;52083:9;;52065:14;;52057:5;52041:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:38;;;;:::i;:::-;:51;;52019:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;52201:9;52192:5;52180:9;;:17;;;;:::i;:::-;:30;;52158:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;52300:5;52272:12;:24;52285:10;52272:24;;;;;;;;;;;;;;;;:33;;;;;;;:::i;:::-;;;;;;;;52316:28;52326:10;52338:5;52316:9;:28::i;:::-;51803:549;:::o;37072:287::-;37183:12;:10;:12::i;:::-;37171:24;;:8;:24;;;37167:54;;;37204:17;;;;;;;;;;;;;;37167:54;37279:8;37234:18;:32;37253:12;:10;:12::i;:::-;37234:32;;;;;;;;;;;;;;;:42;37267:8;37234:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;37332:8;37303:48;;37318:12;:10;:12::i;:::-;37303:48;;;37342:8;37303:48;;;;;;:::i;:::-;;;;;;;;37072:287;;:::o;54947:135::-;55004:13;55037:37;55057:7;:16;55065:7;55057:16;;;;;;;;;;;;55037:19;:37::i;:::-;55030:44;;54947:135;;;:::o;38158:369::-;38325:28;38335:4;38341:2;38345:7;38325:9;:28::i;:::-;38368:15;:2;:13;;;:15::i;:::-;:76;;;;;38388:56;38419:4;38425:2;38429:7;38438:5;38388:30;:56::i;:::-;38387:57;38368:76;38364:156;;;38468:40;;;;;;;;;;;;;;38364:156;38158:369;;;;:::o;53026:116::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53121:13:::1;53104:14;:30;;;;53026:116:::0;:::o;50516:76::-;50550:42;50516:76;:::o;51401:147::-;51456:4;51512:1;51480:10;;;;;;;;;;;:20;;;51501:7;51480:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:33;:60;;;;;51518:13;:22;51532:7;51518:22;;;;;;;;;;;;;;;;;;;;;;;;;51517:23;51480:60;51473:67;;51401:147;;;:::o;54759:180::-;54824:13;54881:23;54896:7;54881:14;:23::i;:::-;54911:18;54921:7;54911:9;:18::i;:::-;54864:66;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54850:81;;54759:180;;;:::o;50709:32::-;;;;:::o;55090:97::-;55134:13;55167:12;55160:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55090:97;:::o;37430:164::-;37527:4;37551:18;:25;37570:5;37551:25;;;;;;;;;;;;;;;:35;37577:8;37551:35;;;;;;;;;;;;;;;;;;;;;;;;;37544:42;;37430:164;;;;:::o;50992:31::-;;;;;;;;;;;;;:::o;25057:201::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;25166:1:::1;25146:22;;:8;:22;;;;25138:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25222:28;25241:8;25222:18;:28::i;:::-;25057:201:::0;:::o;52798:102::-;24379:12;:10;:12::i;:::-;24368:23;;:7;:5;:7::i;:::-;:23;;;24360:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52882:10:::1;52870:9;:22;;;;52798:102:::0;:::o;11825:387::-;11885:4;12093:12;12160:7;12148:20;12140:28;;12203:1;12196:4;:8;12189:15;;;11825:387;;;:::o;23061:157::-;23146:4;23185:25;23170:40;;;:11;:40;;;;23163:47;;23061:157;;;:::o;19698:98::-;19751:7;19778:10;19771:17;;19698:98;:::o;38782:187::-;38839:4;38882:7;38863:15;:13;:15::i;:::-;:26;;:53;;;;;38903:13;;38893:7;:23;38863:53;:98;;;;;38934:11;:20;38946:7;38934:20;;;;;;;;;;;:27;;;;;;;;;;;;38933:28;38863:98;38856:105;;38782:187;;;:::o;46999:196::-;47141:2;47114:15;:24;47130:7;47114:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47179:7;47175:2;47159:28;;47168:5;47159:28;;;;;;;;;;;;46999:196;;;:::o;55195:100::-;55260:7;55286:1;55279:8;;55195:100;:::o;41942:2130::-;42057:35;42095:21;42108:7;42095:12;:21::i;:::-;42057:59;;42155:4;42133:26;;:13;:18;;;:26;;;42129:67;;42168:28;;;;;;;;;;;;;;42129:67;42209:22;42251:4;42235:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;42272:36;42289:4;42295:12;:10;:12::i;:::-;42272:16;:36::i;:::-;42235:73;:126;;;;42349:12;:10;:12::i;:::-;42325:36;;:20;42337:7;42325:11;:20::i;:::-;:36;;;42235:126;42209:153;;42380:17;42375:66;;42406:35;;;;;;;;;;;;;;42375:66;42470:1;42456:16;;:2;:16;;;42452:52;;;42481:23;;;;;;;;;;;;;;42452:52;42517:43;42539:4;42545:2;42549:7;42558:1;42517:21;:43::i;:::-;42625:35;42642:1;42646:7;42655:4;42625:8;:35::i;:::-;42986:1;42956:12;:18;42969:4;42956:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43030:1;43002:12;:16;43015:2;43002:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43048:31;43082:11;:20;43094:7;43082:20;;;;;;;;;;;43048:54;;43133:2;43117:8;:13;;;:18;;;;;;;;;;;;;;;;;;43183:15;43150:8;:23;;;:49;;;;;;;;;;;;;;;;;;43451:19;43483:1;43473:7;:11;43451:33;;43499:31;43533:11;:24;43545:11;43533:24;;;;;;;;;;;43499:58;;43601:1;43576:27;;:8;:13;;;;;;;;;;;;:27;;;43572:384;;;43786:13;;43771:11;:28;43767:174;;43840:4;43824:8;:13;;;:20;;;;;;;;;;;;;;;;;;43893:13;:28;;;43867:8;:23;;;:54;;;;;;;;;;;;;;;;;;43767:174;43572:384;42931:1036;;;44003:7;43999:2;43984:27;;43993:4;43984:27;;;;;;;;;;;;44022:42;44043:4;44049:2;44053:7;44062:1;44022:20;:42::i;:::-;42046:2026;;41942:2130;;;:::o;38977:104::-;39046:27;39056:2;39060:8;39046:27;;;;;;;;;;;;:9;:27::i;:::-;38977:104;;:::o;33914:1117::-;33984:21;;:::i;:::-;34018:12;34033:7;34018:22;;34101:4;34082:15;:13;:15::i;:::-;:23;;:47;;;;;34116:13;;34109:4;:20;34082:47;34078:886;;;34150:31;34184:11;:17;34196:4;34184:17;;;;;;;;;;;34150:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34225:9;:16;;;34220:729;;34296:1;34270:28;;:9;:14;;;:28;;;34266:101;;34334:9;34327:16;;;;;;34266:101;34669:261;34676:4;34669:261;;;34709:6;;;;;;;;34754:11;:17;34766:4;34754:17;;;;;;;;;;;34742:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34828:1;34802:28;;:9;:14;;;:28;;;34798:109;;34870:9;34863:16;;;;;;34798:109;34669:261;;;34220:729;34131:833;34078:886;34992:31;;;;;;;;;;;;;;33914:1117;;;;:::o;25418:191::-;25492:16;25511:6;;;;;;;;;;;25492:25;;25537:8;25528:6;;:17;;;;;;;;;;;;;;;;;;25592:8;25561:40;;25582:8;25561:40;;;;;;;;;;;;25481:128;25418:191;:::o;21904:452::-;21963:13;21989:14;22014:5;22006:14;;21989:31;;22031:14;22048:2;22031:19;;22061;22097:6;22093:1;:10;;;;:::i;:::-;22083:21;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22061:43;;22120:9;22136:6;22132:1;:10;;;;:::i;:::-;22120:22;;22115:135;22148:1;22144;:5;22115:135;;;22185:12;22207:3;22198:6;:12;22185:26;;;;;;;:::i;:::-;;;;;22171:6;22180:1;22178;:3;;;;:::i;:::-;22171:11;;;;;;;;:::i;:::-;;;;;:40;;;;;;;;;;;22237:1;22226:12;;;;;22151:3;;;;:::i;:::-;;;22115:135;;;;22278:1;22268:6;:11;22260:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;22341:6;22327:21;;;;;21904:452;;;:::o;47687:667::-;47850:4;47887:2;47871:36;;;47908:12;:10;:12::i;:::-;47922:4;47928:7;47937:5;47871:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;47867:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48122:1;48105:6;:13;:18;48101:235;;;48151:40;;;;;;;;;;;;;;48101:235;48294:6;48288:13;48279:6;48275:2;48271:15;48264:38;47867:480;48000:45;;;47990:55;;;:6;:55;;;;47983:62;;;47687:667;;;;;;:::o;35637:318::-;35710:13;35741:16;35749:7;35741;:16::i;:::-;35736:59;;35766:29;;;;;;;;;;;;;;35736:59;35808:21;35832:10;:8;:10::i;:::-;35808:34;;35885:1;35866:7;35860:21;:26;;:87;;;;;;;;;;;;;;;;;35913:7;35922:18;:7;:16;:18::i;:::-;35896:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35860:87;35853:94;;;35637:318;;;:::o;49002:159::-;;;;;:::o;49820:158::-;;;;;:::o;39444:163::-;39567:32;39573:2;39577:8;39587:5;39594:4;39567:5;:32::i;:::-;39444:163;;;:::o;54637:114::-;54697:13;54730;54723:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54637:114;:::o;20140:723::-;20196:13;20426:1;20417:5;:10;20413:53;;;20444:10;;;;;;;;;;;;;;;;;;;;;20413:53;20476:12;20491:5;20476:20;;20507:14;20532:78;20547:1;20539:4;:9;20532:78;;20565:8;;;;;:::i;:::-;;;;20596:2;20588:10;;;;;:::i;:::-;;;20532:78;;;20620:19;20652:6;20642:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20620:39;;20670:154;20686:1;20677:5;:10;20670:154;;20714:1;20704:11;;;;;:::i;:::-;;;20781:2;20773:5;:10;;;;:::i;:::-;20760:2;:24;;;;:::i;:::-;20747:39;;20730:6;20737;20730:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;20810:2;20801:11;;;;;:::i;:::-;;;20670:154;;;20848:6;20834:21;;;;;20140:723;;;;:::o;39866:1822::-;40005:20;40028:13;;40005:36;;40070:1;40056:16;;:2;:16;;;40052:48;;;40081:19;;;;;;;;;;;;;;40052:48;40127:1;40115:8;:13;40111:44;;;40137:18;;;;;;;;;;;;;;40111:44;40168:61;40198:1;40202:2;40206:12;40220:8;40168:21;:61::i;:::-;40541:8;40506:12;:16;40519:2;40506:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40605:8;40565:12;:16;40578:2;40565:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40664:2;40631:11;:25;40643:12;40631:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;40731:15;40681:11;:25;40693:12;40681:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;40764:20;40787:12;40764:35;;40814:11;40843:8;40828:12;:23;40814:37;;40872:4;:23;;;;;40880:15;:2;:13;;;:15::i;:::-;40872:23;40868:641;;;40916:314;40972:12;40968:2;40947:38;;40964:1;40947:38;;;;;;;;;;;;41013:69;41052:1;41056:2;41060:14;;;;;;41076:5;41013:30;:69::i;:::-;41008:174;;41118:40;;;;;;;;;;;;;;41008:174;41225:3;41209:12;:19;;40916:314;;41311:12;41294:13;;:29;41290:43;;41325:8;;;41290:43;40868:641;;;41374:120;41430:14;;;;;;41426:2;41405:40;;41422:1;41405:40;;;;;;;;;;;;41489:3;41473:12;:19;;41374:120;;40868:641;41539:12;41523:13;:28;;;;40481:1082;;41573:36;41586:12;41600:8;41573:12;:36::i;:::-;41620:60;41649:1;41653:2;41657:12;41671:8;41620:20;:60::i;:::-;39994:1694;39866:1822;;;;:::o;52360:284::-;52488:9;52484:153;52506:8;52502:1;:12;52484:153;;;52590:15;52622:1;52607:12;:16;;;;:::i;:::-;52573:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52563:62;;;;;;52535:7;:25;52558:1;52543:12;:16;;;;:::i;:::-;52535:25;;;;;;;;;;;:90;;;;52515:3;;;;;:::i;:::-;;;;52484:153;;;;52360:284;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:118::-;6085:24;6103:5;6085:24;:::i;:::-;6080:3;6073:37;5998:118;;:::o;6122:222::-;6215:4;6253:2;6242:9;6238:18;6230:26;;6266:71;6334:1;6323:9;6319:17;6310:6;6266:71;:::i;:::-;6122:222;;;;:::o;6350:117::-;6459:1;6456;6449:12;6473:117;6582:1;6579;6572:12;6596:180;6644:77;6641:1;6634:88;6741:4;6738:1;6731:15;6765:4;6762:1;6755:15;6782:281;6865:27;6887:4;6865:27;:::i;:::-;6857:6;6853:40;6995:6;6983:10;6980:22;6959:18;6947:10;6944:34;6941:62;6938:88;;;7006:18;;:::i;:::-;6938:88;7046:10;7042:2;7035:22;6825:238;6782:281;;:::o;7069:129::-;7103:6;7130:20;;:::i;:::-;7120:30;;7159:33;7187:4;7179:6;7159:33;:::i;:::-;7069:129;;;:::o;7204:308::-;7266:4;7356:18;7348:6;7345:30;7342:56;;;7378:18;;:::i;:::-;7342:56;7416:29;7438:6;7416:29;:::i;:::-;7408:37;;7500:4;7494;7490:15;7482:23;;7204:308;;;:::o;7518:154::-;7602:6;7597:3;7592;7579:30;7664:1;7655:6;7650:3;7646:16;7639:27;7518:154;;;:::o;7678:412::-;7756:5;7781:66;7797:49;7839:6;7797:49;:::i;:::-;7781:66;:::i;:::-;7772:75;;7870:6;7863:5;7856:21;7908:4;7901:5;7897:16;7946:3;7937:6;7932:3;7928:16;7925:25;7922:112;;;7953:79;;:::i;:::-;7922:112;8043:41;8077:6;8072:3;8067;8043:41;:::i;:::-;7762:328;7678:412;;;;;:::o;8110:340::-;8166:5;8215:3;8208:4;8200:6;8196:17;8192:27;8182:122;;8223:79;;:::i;:::-;8182:122;8340:6;8327:20;8365:79;8440:3;8432:6;8425:4;8417:6;8413:17;8365:79;:::i;:::-;8356:88;;8172:278;8110:340;;;;:::o;8456:509::-;8525:6;8574:2;8562:9;8553:7;8549:23;8545:32;8542:119;;;8580:79;;:::i;:::-;8542:119;8728:1;8717:9;8713:17;8700:31;8758:18;8750:6;8747:30;8744:117;;;8780:79;;:::i;:::-;8744:117;8885:63;8940:7;8931:6;8920:9;8916:22;8885:63;:::i;:::-;8875:73;;8671:287;8456:509;;;;:::o;8971:329::-;9030:6;9079:2;9067:9;9058:7;9054:23;9050:32;9047:119;;;9085:79;;:::i;:::-;9047:119;9205:1;9230:53;9275:7;9266:6;9255:9;9251:22;9230:53;:::i;:::-;9220:63;;9176:117;8971:329;;;;:::o;9306:114::-;9373:6;9407:5;9401:12;9391:22;;9306:114;;;:::o;9426:184::-;9525:11;9559:6;9554:3;9547:19;9599:4;9594:3;9590:14;9575:29;;9426:184;;;;:::o;9616:132::-;9683:4;9706:3;9698:11;;9736:4;9731:3;9727:14;9719:22;;9616:132;;;:::o;9754:108::-;9831:24;9849:5;9831:24;:::i;:::-;9826:3;9819:37;9754:108;;:::o;9868:179::-;9937:10;9958:46;10000:3;9992:6;9958:46;:::i;:::-;10036:4;10031:3;10027:14;10013:28;;9868:179;;;;:::o;10053:113::-;10123:4;10155;10150:3;10146:14;10138:22;;10053:113;;;:::o;10202:732::-;10321:3;10350:54;10398:5;10350:54;:::i;:::-;10420:86;10499:6;10494:3;10420:86;:::i;:::-;10413:93;;10530:56;10580:5;10530:56;:::i;:::-;10609:7;10640:1;10625:284;10650:6;10647:1;10644:13;10625:284;;;10726:6;10720:13;10753:63;10812:3;10797:13;10753:63;:::i;:::-;10746:70;;10839:60;10892:6;10839:60;:::i;:::-;10829:70;;10685:224;10672:1;10669;10665:9;10660:14;;10625:284;;;10629:14;10925:3;10918:10;;10326:608;;;10202:732;;;;:::o;10940:373::-;11083:4;11121:2;11110:9;11106:18;11098:26;;11170:9;11164:4;11160:20;11156:1;11145:9;11141:17;11134:47;11198:108;11301:4;11292:6;11198:108;:::i;:::-;11190:116;;10940:373;;;;:::o;11319:116::-;11389:21;11404:5;11389:21;:::i;:::-;11382:5;11379:32;11369:60;;11425:1;11422;11415:12;11369:60;11319:116;:::o;11441:133::-;11484:5;11522:6;11509:20;11500:29;;11538:30;11562:5;11538:30;:::i;:::-;11441:133;;;;:::o;11580:468::-;11645:6;11653;11702:2;11690:9;11681:7;11677:23;11673:32;11670:119;;;11708:79;;:::i;:::-;11670:119;11828:1;11853:53;11898:7;11889:6;11878:9;11874:22;11853:53;:::i;:::-;11843:63;;11799:117;11955:2;11981:50;12023:7;12014:6;12003:9;11999:22;11981:50;:::i;:::-;11971:60;;11926:115;11580:468;;;;;:::o;12054:307::-;12115:4;12205:18;12197:6;12194:30;12191:56;;;12227:18;;:::i;:::-;12191:56;12265:29;12287:6;12265:29;:::i;:::-;12257:37;;12349:4;12343;12339:15;12331:23;;12054:307;;;:::o;12367:410::-;12444:5;12469:65;12485:48;12526:6;12485:48;:::i;:::-;12469:65;:::i;:::-;12460:74;;12557:6;12550:5;12543:21;12595:4;12588:5;12584:16;12633:3;12624:6;12619:3;12615:16;12612:25;12609:112;;;12640:79;;:::i;:::-;12609:112;12730:41;12764:6;12759:3;12754;12730:41;:::i;:::-;12450:327;12367:410;;;;;:::o;12796:338::-;12851:5;12900:3;12893:4;12885:6;12881:17;12877:27;12867:122;;12908:79;;:::i;:::-;12867:122;13025:6;13012:20;13050:78;13124:3;13116:6;13109:4;13101:6;13097:17;13050:78;:::i;:::-;13041:87;;12857:277;12796:338;;;;:::o;13140:943::-;13235:6;13243;13251;13259;13308:3;13296:9;13287:7;13283:23;13279:33;13276:120;;;13315:79;;:::i;:::-;13276:120;13435:1;13460:53;13505:7;13496:6;13485:9;13481:22;13460:53;:::i;:::-;13450:63;;13406:117;13562:2;13588:53;13633:7;13624:6;13613:9;13609:22;13588:53;:::i;:::-;13578:63;;13533:118;13690:2;13716:53;13761:7;13752:6;13741:9;13737:22;13716:53;:::i;:::-;13706:63;;13661:118;13846:2;13835:9;13831:18;13818:32;13877:18;13869:6;13866:30;13863:117;;;13899:79;;:::i;:::-;13863:117;14004:62;14058:7;14049:6;14038:9;14034:22;14004:62;:::i;:::-;13994:72;;13789:287;13140:943;;;;;;;:::o;14089:474::-;14157:6;14165;14214:2;14202:9;14193:7;14189:23;14185:32;14182:119;;;14220:79;;:::i;:::-;14182:119;14340:1;14365:53;14410:7;14401:6;14390:9;14386:22;14365:53;:::i;:::-;14355:63;;14311:117;14467:2;14493:53;14538:7;14529:6;14518:9;14514:22;14493:53;:::i;:::-;14483:63;;14438:118;14089:474;;;;;:::o;14569:182::-;14709:34;14705:1;14697:6;14693:14;14686:58;14569:182;:::o;14757:366::-;14899:3;14920:67;14984:2;14979:3;14920:67;:::i;:::-;14913:74;;14996:93;15085:3;14996:93;:::i;:::-;15114:2;15109:3;15105:12;15098:19;;14757:366;;;:::o;15129:419::-;15295:4;15333:2;15322:9;15318:18;15310:26;;15382:9;15376:4;15372:20;15368:1;15357:9;15353:17;15346:47;15410:131;15536:4;15410:131;:::i;:::-;15402:139;;15129:419;;;:::o;15554:180::-;15602:77;15599:1;15592:88;15699:4;15696:1;15689:15;15723:4;15720:1;15713:15;15740:320;15784:6;15821:1;15815:4;15811:12;15801:22;;15868:1;15862:4;15858:12;15889:18;15879:81;;15945:4;15937:6;15933:17;15923:27;;15879:81;16007:2;15999:6;15996:14;15976:18;15973:38;15970:84;;;16026:18;;:::i;:::-;15970:84;15791:269;15740:320;;;:::o;16066:180::-;16114:77;16111:1;16104:88;16211:4;16208:1;16201:15;16235:4;16232:1;16225:15;16252:180;16300:77;16297:1;16290:88;16397:4;16394:1;16387:15;16421:4;16418:1;16411:15;16438:185;16478:1;16495:20;16513:1;16495:20;:::i;:::-;16490:25;;16529:20;16547:1;16529:20;:::i;:::-;16524:25;;16568:1;16558:35;;16573:18;;:::i;:::-;16558:35;16615:1;16612;16608:9;16603:14;;16438:185;;;;:::o;16629:191::-;16669:4;16689:20;16707:1;16689:20;:::i;:::-;16684:25;;16723:20;16741:1;16723:20;:::i;:::-;16718:25;;16762:1;16759;16756:8;16753:34;;;16767:18;;:::i;:::-;16753:34;16812:1;16809;16805:9;16797:17;;16629:191;;;;:::o;16826:147::-;16927:11;16964:3;16949:18;;16826:147;;;;:::o;16979:114::-;;:::o;17099:398::-;17258:3;17279:83;17360:1;17355:3;17279:83;:::i;:::-;17272:90;;17371:93;17460:3;17371:93;:::i;:::-;17489:1;17484:3;17480:11;17473:18;;17099:398;;;:::o;17503:379::-;17687:3;17709:147;17852:3;17709:147;:::i;:::-;17702:154;;17873:3;17866:10;;17503:379;;;:::o;17888:165::-;18028:17;18024:1;18016:6;18012:14;18005:41;17888:165;:::o;18059:366::-;18201:3;18222:67;18286:2;18281:3;18222:67;:::i;:::-;18215:74;;18298:93;18387:3;18298:93;:::i;:::-;18416:2;18411:3;18407:12;18400:19;;18059:366;;;:::o;18431:419::-;18597:4;18635:2;18624:9;18620:18;18612:26;;18684:9;18678:4;18674:20;18670:1;18659:9;18655:17;18648:47;18712:131;18838:4;18712:131;:::i;:::-;18704:139;;18431:419;;;:::o;18856:155::-;18996:7;18992:1;18984:6;18980:14;18973:31;18856:155;:::o;19017:365::-;19159:3;19180:66;19244:1;19239:3;19180:66;:::i;:::-;19173:73;;19255:93;19344:3;19255:93;:::i;:::-;19373:2;19368:3;19364:12;19357:19;;19017:365;;;:::o;19388:419::-;19554:4;19592:2;19581:9;19577:18;19569:26;;19641:9;19635:4;19631:20;19627:1;19616:9;19612:17;19605:47;19669:131;19795:4;19669:131;:::i;:::-;19661:139;;19388:419;;;:::o;19813:171::-;19852:3;19875:24;19893:5;19875:24;:::i;:::-;19866:33;;19921:4;19914:5;19911:15;19908:41;;;19929:18;;:::i;:::-;19908:41;19976:1;19969:5;19965:13;19958:20;;19813:171;;;:::o;19990:180::-;20038:77;20035:1;20028:88;20135:4;20132:1;20125:15;20159:4;20156:1;20149:15;20176:163;20316:15;20312:1;20304:6;20300:14;20293:39;20176:163;:::o;20345:366::-;20487:3;20508:67;20572:2;20567:3;20508:67;:::i;:::-;20501:74;;20584:93;20673:3;20584:93;:::i;:::-;20702:2;20697:3;20693:12;20686:19;;20345:366;;;:::o;20717:419::-;20883:4;20921:2;20910:9;20906:18;20898:26;;20970:9;20964:4;20960:20;20956:1;20945:9;20941:17;20934:47;20998:131;21124:4;20998:131;:::i;:::-;20990:139;;20717:419;;;:::o;21142:305::-;21182:3;21201:20;21219:1;21201:20;:::i;:::-;21196:25;;21235:20;21253:1;21235:20;:::i;:::-;21230:25;;21389:1;21321:66;21317:74;21314:1;21311:81;21308:107;;;21395:18;;:::i;:::-;21308:107;21439:1;21436;21432:9;21425:16;;21142:305;;;;:::o;21453:223::-;21593:34;21589:1;21581:6;21577:14;21570:58;21662:6;21657:2;21649:6;21645:15;21638:31;21453:223;:::o;21682:366::-;21824:3;21845:67;21909:2;21904:3;21845:67;:::i;:::-;21838:74;;21921:93;22010:3;21921:93;:::i;:::-;22039:2;22034:3;22030:12;22023:19;;21682:366;;;:::o;22054:419::-;22220:4;22258:2;22247:9;22243:18;22235:26;;22307:9;22301:4;22297:20;22293:1;22282:9;22278:17;22271:47;22335:131;22461:4;22335:131;:::i;:::-;22327:139;;22054:419;;;:::o;22479:177::-;22619:29;22615:1;22607:6;22603:14;22596:53;22479:177;:::o;22662:366::-;22804:3;22825:67;22889:2;22884:3;22825:67;:::i;:::-;22818:74;;22901:93;22990:3;22901:93;:::i;:::-;23019:2;23014:3;23010:12;23003:19;;22662:366;;;:::o;23034:419::-;23200:4;23238:2;23227:9;23223:18;23215:26;;23287:9;23281:4;23277:20;23273:1;23262:9;23258:17;23251:47;23315:131;23441:4;23315:131;:::i;:::-;23307:139;;23034:419;;;:::o;23459:348::-;23499:7;23522:20;23540:1;23522:20;:::i;:::-;23517:25;;23556:20;23574:1;23556:20;:::i;:::-;23551:25;;23744:1;23676:66;23672:74;23669:1;23666:81;23661:1;23654:9;23647:17;23643:105;23640:131;;;23751:18;;:::i;:::-;23640:131;23799:1;23796;23792:9;23781:20;;23459:348;;;;:::o;23813:171::-;23953:23;23949:1;23941:6;23937:14;23930:47;23813:171;:::o;23990:366::-;24132:3;24153:67;24217:2;24212:3;24153:67;:::i;:::-;24146:74;;24229:93;24318:3;24229:93;:::i;:::-;24347:2;24342:3;24338:12;24331:19;;23990:366;;;:::o;24362:419::-;24528:4;24566:2;24555:9;24551:18;24543:26;;24615:9;24609:4;24605:20;24601:1;24590:9;24586:17;24579:47;24643:131;24769:4;24643:131;:::i;:::-;24635:139;;24362:419;;;:::o;24787:143::-;24844:5;24875:6;24869:13;24860:22;;24891:33;24918:5;24891:33;:::i;:::-;24787:143;;;;:::o;24936:351::-;25006:6;25055:2;25043:9;25034:7;25030:23;25026:32;25023:119;;;25061:79;;:::i;:::-;25023:119;25181:1;25206:64;25262:7;25253:6;25242:9;25238:22;25206:64;:::i;:::-;25196:74;;25152:128;24936:351;;;;:::o;25293:148::-;25395:11;25432:3;25417:18;;25293:148;;;;:::o;25447:377::-;25553:3;25581:39;25614:5;25581:39;:::i;:::-;25636:89;25718:6;25713:3;25636:89;:::i;:::-;25629:96;;25734:52;25779:6;25774:3;25767:4;25760:5;25756:16;25734:52;:::i;:::-;25811:6;25806:3;25802:16;25795:23;;25557:267;25447:377;;;;:::o;25830:151::-;25970:3;25966:1;25958:6;25954:14;25947:27;25830:151;:::o;25987:400::-;26147:3;26168:84;26250:1;26245:3;26168:84;:::i;:::-;26161:91;;26261:93;26350:3;26261:93;:::i;:::-;26379:1;26374:3;26370:11;26363:18;;25987:400;;;:::o;26393:701::-;26674:3;26696:95;26787:3;26778:6;26696:95;:::i;:::-;26689:102;;26808:148;26952:3;26808:148;:::i;:::-;26801:155;;26973:95;27064:3;27055:6;26973:95;:::i;:::-;26966:102;;27085:3;27078:10;;26393:701;;;;;:::o;27100:225::-;27240:34;27236:1;27228:6;27224:14;27217:58;27309:8;27304:2;27296:6;27292:15;27285:33;27100:225;:::o;27331:366::-;27473:3;27494:67;27558:2;27553:3;27494:67;:::i;:::-;27487:74;;27570:93;27659:3;27570:93;:::i;:::-;27688:2;27683:3;27679:12;27672:19;;27331:366;;;:::o;27703:419::-;27869:4;27907:2;27896:9;27892:18;27884:26;;27956:9;27950:4;27946:20;27942:1;27931:9;27927:17;27920:47;27984:131;28110:4;27984:131;:::i;:::-;27976:139;;27703:419;;;:::o;28128:182::-;28268:34;28264:1;28256:6;28252:14;28245:58;28128:182;:::o;28316:366::-;28458:3;28479:67;28543:2;28538:3;28479:67;:::i;:::-;28472:74;;28555:93;28644:3;28555:93;:::i;:::-;28673:2;28668:3;28664:12;28657:19;;28316:366;;;:::o;28688:419::-;28854:4;28892:2;28881:9;28877:18;28869:26;;28941:9;28935:4;28931:20;28927:1;28916:9;28912:17;28905:47;28969:131;29095:4;28969:131;:::i;:::-;28961:139;;28688:419;;;:::o;29113:98::-;29164:6;29198:5;29192:12;29182:22;;29113:98;;;:::o;29217:168::-;29300:11;29334:6;29329:3;29322:19;29374:4;29369:3;29365:14;29350:29;;29217:168;;;;:::o;29391:360::-;29477:3;29505:38;29537:5;29505:38;:::i;:::-;29559:70;29622:6;29617:3;29559:70;:::i;:::-;29552:77;;29638:52;29683:6;29678:3;29671:4;29664:5;29660:16;29638:52;:::i;:::-;29715:29;29737:6;29715:29;:::i;:::-;29710:3;29706:39;29699:46;;29481:270;29391:360;;;;:::o;29757:640::-;29952:4;29990:3;29979:9;29975:19;29967:27;;30004:71;30072:1;30061:9;30057:17;30048:6;30004:71;:::i;:::-;30085:72;30153:2;30142:9;30138:18;30129:6;30085:72;:::i;:::-;30167;30235:2;30224:9;30220:18;30211:6;30167:72;:::i;:::-;30286:9;30280:4;30276:20;30271:2;30260:9;30256:18;30249:48;30314:76;30385:4;30376:6;30314:76;:::i;:::-;30306:84;;29757:640;;;;;;;:::o;30403:141::-;30459:5;30490:6;30484:13;30475:22;;30506:32;30532:5;30506:32;:::i;:::-;30403:141;;;;:::o;30550:349::-;30619:6;30668:2;30656:9;30647:7;30643:23;30639:32;30636:119;;;30674:79;;:::i;:::-;30636:119;30794:1;30819:63;30874:7;30865:6;30854:9;30850:22;30819:63;:::i;:::-;30809:73;;30765:127;30550:349;;;;:::o;30905:435::-;31085:3;31107:95;31198:3;31189:6;31107:95;:::i;:::-;31100:102;;31219:95;31310:3;31301:6;31219:95;:::i;:::-;31212:102;;31331:3;31324:10;;30905:435;;;;;:::o;31346:233::-;31385:3;31408:24;31426:5;31408:24;:::i;:::-;31399:33;;31454:66;31447:5;31444:77;31441:103;;;31524:18;;:::i;:::-;31441:103;31571:1;31564:5;31560:13;31553:20;;31346:233;;;:::o;31585:176::-;31617:1;31634:20;31652:1;31634:20;:::i;:::-;31629:25;;31668:20;31686:1;31668:20;:::i;:::-;31663:25;;31707:1;31697:35;;31712:18;;:::i;:::-;31697:35;31753:1;31750;31746:9;31741:14;;31585:176;;;;:::o;31767:79::-;31806:7;31835:5;31824:16;;31767:79;;;:::o;31852:157::-;31957:45;31977:24;31995:5;31977:24;:::i;:::-;31957:45;:::i;:::-;31952:3;31945:58;31852:157;;:::o;32015:397::-;32155:3;32170:75;32241:3;32232:6;32170:75;:::i;:::-;32270:2;32265:3;32261:12;32254:19;;32283:75;32354:3;32345:6;32283:75;:::i;:::-;32383:2;32378:3;32374:12;32367:19;;32403:3;32396:10;;32015:397;;;;;:::o

Swarm Source

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