ETH Price: $3,387.04 (-1.74%)
Gas: 1 Gwei

Token

Official Monster NFT (MONC)
 

Overview

Max Total Supply

127 MONC

Holders

89

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mergealpha.eth
Balance
4 MONC
0x43298a6c0f1ab6558cc30c4233499b27762b1a91
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:
MonsterCompanion

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-03-13
*/

// SPDX-License-Identifier: GPL-3.0
// File: @openzeppelin/contracts/utils/Strings.sol

pragma solidity ^0.8.9;

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.9;

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

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



pragma solidity ^0.8.9;

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

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



pragma solidity ^0.8.9;


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

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



pragma solidity ^0.8.9;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.9;


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


pragma solidity >=0.8.9;
// to enable certain compiler features



contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;
    
    //Mapping para atribuirle un URI para cada token
    mapping(uint256 => string) internal id_to_URI;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {  }

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

pragma solidity ^0.8.9;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}


pragma solidity ^0.8.9;

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

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

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


// Creator: Chiru Labs

pragma solidity ^0.8.9;

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

    struct TokenOwnership {
        address addr;
        uint64 startTimestamp;
    }

    struct AddressData {
        uint128 balance;
        uint128 numberMinted;
    }

    uint256 internal currentIndex;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view override returns (uint256) {
        require(index < totalSupply(), 'ERC721A: global index out of bounds');
        return index;
    }

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

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

        revert('ERC721A: unable to get token of owner by index');
    }

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

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

    function _numberMinted(address owner) internal view returns (uint256) {
        require(owner != address(0), 'ERC721A: number minted query for the zero address');
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; curr--) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (ownership.addr != address(0)) {
                    return ownership;
                }
            }
        }

        revert('ERC721A: unable to determine the owner of token');
    }

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

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

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

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

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

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

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

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

        _approve(to, tokenId, owner);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 override {
        _transfer(from, to, tokenId);
        require(
            _checkOnERC721Received(from, to, tokenId, _data),
            'ERC721A: transfer to non ERC721Receiver implementer'
        );
    }

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

    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;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

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

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    require(
                        _checkOnERC721Received(address(0), to, updatedIndex, _data),
                        'ERC721A: transfer to non ERC721Receiver implementer'
                    );
                }

                updatedIndex++;
            }

            currentIndex = updatedIndex;
        }

        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        require(isApprovedOrOwner, 'ERC721A: transfer caller is not owner nor approved');

        require(prevOwnership.addr == from, 'ERC721A: transfer from incorrect owner');
        require(to != address(0), 'ERC721A: transfer to the zero address');

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     *
     * 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`.
     */
    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.
     *
     * 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` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)



pragma solidity ^0.8.9;

contract MonsterCompanion is ERC721A, Ownable,ReentrancyGuard {
    using Strings for uint256;

    //amount of tokens that have been minted so far, in total and in presale
    uint256 private numberOfTotalTokens;
    
    //declares the maximum amount of tokens that can be minted, total and in presale
    uint256 private maxTotalTokens = 4999;
    
    //initial part of the URI for the metadata
    string private _currentBaseURI;
        
    //cost of mints depending on state of sale    
    uint private mintCost_ = 0.09 ether;
    
    //maximum amount of mints per wallet
    uint public maxMint = 2;
    
    //dummy address that we use to sign the mint transaction to make sure it is valid
    address private dummy = 0x80E4929c869102140E69550BBECC20bEd61B080c;
	address public constant account1 = 0x999646F0EB27D984E8ADB3F2906c6580B31B9151;
    //amount of mints that each address has executed
    mapping(address => uint256) public mintsPerAddress;
    
    //current state of sale
    enum State {NoSale, Presale, PublicSale}

    //defines the uri for when the NFTs have not been yet revealed
    string public unrevealedURI;
    
    //marks the timestamp of when the respective sales open
    uint256 public presaleLaunchTime;
    uint256 public publicSaleLaunchTime;
    uint256 public revealTime;
    
    //declaring initial values for variables
    constructor() ERC721A("Official Monster NFT", "MONC"){
        unrevealedURI = "ipfs://.../";
    }
    
    //in case somebody accidentaly sends funds or transaction to contract
    receive() payable external {}
    fallback() payable external {
        revert();
    }
    
    //visualize baseURI
    function _baseURI() internal view virtual override returns (string memory) {
        return _currentBaseURI;
    }
    
    //change baseURI in case needed for IPFS
    function changeBaseURI(string memory baseURI_) public onlyOwner {
        _currentBaseURI = baseURI_;
    }
    
    function changeUnrevealedURI(string memory unrevealedURI_) public onlyOwner {
        unrevealedURI = unrevealedURI_;
    }
    
    //gets the tokenID of NFT to be minted
    /*function tokenId() internal view returns(uint256) {
        return numberOfTotalTokens + 1;
    }*/
    
    modifier onlyValidAccess(uint8 _v, bytes32 _r, bytes32 _s) {
        require( isValidAccessMessage(msg.sender,_v,_r,_s), 'Invalid Signature' );
        _;
    }
 
    /* 
    * @dev Verifies if message was signed by owner to give access to _add for this contract.
    *      Assumes Geth signature prefix.
    * @param _add Address of agent with access
    * @param _v ECDSA signature parameter v.
    * @param _r ECDSA signature parameters r.
    * @param _s ECDSA signature parameters s.
    * @return Validity of access message for a given address.
    */
    function isValidAccessMessage(address _add, uint8 _v, bytes32 _r, bytes32 _s) view public returns (bool) {
        bytes32 hash = keccak256(abi.encodePacked(address(this), _add));
        return dummy == ecrecover(keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)), _v, _r, _s);
    }
    
    //mint a @param number of NFTs in presale
    function presaleMint(uint256 number, uint8 _v, bytes32 _r, bytes32 _s) onlyValidAccess(_v,  _r, _s) public payable nonReentrant {
        State saleState_ = saleState();
        require(saleState_ != State.NoSale, "Sale in not open yet!");
		require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(saleState_ != State.PublicSale, "Presale has closed, Check out Public Sale!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Maximum 2 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.15 ether each NFT)");
            _safeMint(msg.sender, number);
            mintsPerAddress[msg.sender] += number;

    }

    //mint a @param number of NFTs in public sale
    function publicSaleMint(uint256 number) public payable nonReentrant{
        State saleState_ = saleState();
        require(saleState_ == State.PublicSale, "Public Sale in not open yet!");
		require(msg.sender == tx.origin, "No transaction from smart contracts!");
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
        require(mintsPerAddress[msg.sender] + number <= maxMint, "Maximum 2 Mints per Address allowed!");
        require(msg.value >= mintCost() * number, "Not sufficient Ether to mint this amount of NFTs (Cost = 0.15 ether for each NFT)");
            _safeMint(msg.sender, number);
            mintsPerAddress[msg.sender] += number;
    }
    
    //reserved NFTs for creator
    function reservedMints(uint256 number, address recipient) public onlyOwner {
        require(totalSupply() + number <= maxTotalTokens, "Not enough NFTs left to mint..");
            _safeMint(recipient, number);
            mintsPerAddress[recipient] += number;
    }

    function tokenURI(uint256 tokenId_) public view virtual override returns (string memory) {
        require(_exists(tokenId_), "ERC721Metadata: URI query for nonexistent token");
        
        //check to see that 24 hours have passed since beginning of publicsale launch
        if (revealTime == 0) {
            return unrevealedURI;
        }
        
        else {
            string memory baseURI = _baseURI();
            return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId_.toString(), '.json')) : "";
        }    
    }
    
    //begins the minting of the NFTs
    function switchToPresale() public onlyOwner{
        State saleState_ = saleState();
        require(saleState_ == State.NoSale, "Presale has already opened!");
        presaleLaunchTime = block.timestamp;
    }
    
    //begins the public sale
    function switchToPublicSale() public onlyOwner {
        State saleState_ = saleState();
        require(saleState_ != State.PublicSale, "Public Sale is already live!");
        require(saleState_ != State.NoSale, "Cannot change to Public Sale if there has not been a Presale!");
        
        publicSaleLaunchTime = block.timestamp;
    }
    
    //se the current account balance
    function accountBalance() public onlyOwner view returns(uint) {
        return address(this).balance;
    }
    
    //change the dummy account used for signing transactions
    function changeDummy(address _dummy) public onlyOwner {
        dummy = _dummy;
    }
    
    //see the total amount of tokens that have been minted
    /*function totalSupply() public view override returns(uint) {
        return numberOfTotalTokens;
    }*/
    
    //get the funds from the minting of the NFTs
    function retrieveFunds() public onlyOwner nonReentrant{
        uint256 balance = accountBalance();
        require(balance > 0, "No funds to retrieve!");
		uint acc1Cut = 4000000000000000000;		
		 _withdraw(payable(account1), acc1Cut);
        _withdraw(payable(owner()), balance - acc1Cut); //to avoid dust eth
        
    }

    function _withdraw(address payable account, uint256 amount) internal {
        (bool sent, ) = account.call{value: amount}("");
        require(sent, "Failed to send Ether");
    }

    //see the current state of the sale
    function saleState() public view returns(State){
        if (presaleLaunchTime == 0) {
            return State.NoSale;
        }
        else if (publicSaleLaunchTime == 0) {
            return State.Presale;
        }
        else {
            return State.PublicSale;
        }
    }

    //get the current price to mint
    function mintCost() public view returns(uint256) {
        return mintCost_;
    }

    //change the current price to mint
    function changeMintCost(uint newCost) public onlyOwner {
        mintCost_ = newCost;
    }

    //reveal the NFTs
    function reveal() public onlyOwner {
        revealTime = block.timestamp;
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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"},{"stateMutability":"payable","type":"fallback"},{"inputs":[],"name":"account1","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"accountBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"changeBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_dummy","type":"address"}],"name":"changeDummy","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newCost","type":"uint256"}],"name":"changeMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"unrevealedURI_","type":"string"}],"name":"changeUnrevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_add","type":"address"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"isValidAccessMessage","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintsPerAddress","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":"presaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"uint8","name":"_v","type":"uint8"},{"internalType":"bytes32","name":"_r","type":"bytes32"},{"internalType":"bytes32","name":"_s","type":"bytes32"}],"name":"presaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"publicSaleLaunchTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"publicSaleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"},{"internalType":"address","name":"recipient","type":"address"}],"name":"reservedMints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"retrieveFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealTime","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":"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":"saleState","outputs":[{"internalType":"enum MonsterCompanion.State","name":"","type":"uint8"}],"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":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"switchToPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"switchToPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId_","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unrevealedURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"stateMutability":"payable","type":"receive"}]

6080604052611387600a5567013fbe85edc90000600c556002600d557380e4929c869102140e69550bbecc20bed61b080c600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200007d57600080fd5b506040518060400160405280601481526020017f4f6666696369616c204d6f6e73746572204e46540000000000000000000000008152506040518060400160405280600481526020017f4d4f4e430000000000000000000000000000000000000000000000000000000081525081600190805190602001906200010292919062000268565b5080600290805190602001906200011b92919062000268565b5050506200013e620001326200019a60201b60201c565b620001a260201b60201c565b60016008819055506040518060400160405280600b81526020017f697066733a2f2f2e2e2e2f000000000000000000000000000000000000000000815250601090805190602001906200019392919062000268565b506200037d565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002769062000347565b90600052602060002090601f0160209004810192826200029a5760008555620002e6565b82601f10620002b557805160ff1916838001178555620002e6565b82800160010185558215620002e6579182015b82811115620002e5578251825591602001919060010190620002c8565b5b509050620002f59190620002f9565b5090565b5b8082111562000314576000816000905550600101620002fa565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200036057607f821691505b6020821081141562000377576200037662000318565b5b50919050565b6159a9806200038d6000396000f3fe60806040526004361061024a5760003560e01c80637501f74111610139578063ba829d71116100b6578063dcd4e7321161007a578063dcd4e7321461087a578063e985e9c514610896578063eab41782146108d3578063ecfd0a56146108ea578063f2fde38b14610915578063ff9849941461093e57610251565b8063ba829d7114610793578063bdb4b848146107be578063c4d8b9df146107e9578063c87b56dd14610812578063cd5fe7251461084f57610251565b8063a475b5dd116100fd578063a475b5dd146106e3578063b0a1c1c4146106fa578063b3ab66b014610725578063b620e97514610741578063b88d4fde1461076a57610251565b80637501f741146106105780637f1921ef1461063b5780638da5cb5b1461066457806395d89b411461068f578063a22cb465146106ba57610251565b806332624114116101c757806361b20d8c1161018b57806361b20d8c1461053d5780636352211e146105545780637035bf181461059157806370a08231146105bc578063715018a6146105f957610251565b8063326241141461044657806339a0c6f91461048357806342842e0e146104ac5780634f6ccce7146104d5578063603f4d521461051257610251565b806318160ddd1161020e57806318160ddd1461034d5780631a17fe5e1461037857806323b872dd146103a35780632f745c59146103cc5780633023eba61461040957610251565b80630191a6571461025657806301ffc9a71461027f57806306fdde03146102bc578063081812fc146102e7578063095ea7b31461032457610251565b3661025157005b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613954565b610955565b005b34801561028b57600080fd5b506102a660048036038101906102a191906139d9565b610a15565b6040516102b39190613a21565b60405180910390f35b3480156102c857600080fd5b506102d1610b5f565b6040516102de9190613ad5565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613b2d565b610bf1565b60405161031b9190613b69565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613b84565b610c76565b005b34801561035957600080fd5b50610362610d8f565b60405161036f9190613bd3565b60405180910390f35b34801561038457600080fd5b5061038d610d98565b60405161039a9190613bd3565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613bee565b610d9e565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613b84565b610dae565b6040516104009190613bd3565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190613954565b610fa0565b60405161043d9190613bd3565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613cb0565b610fb8565b60405161047a9190613a21565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613e4c565b6110b6565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613bee565b61114c565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613b2d565b61116c565b6040516105099190613bd3565b60405180910390f35b34801561051e57600080fd5b506105276111bf565b6040516105349190613f0c565b60405180910390f35b34801561054957600080fd5b506105526111f0565b005b34801561056057600080fd5b5061057b60048036038101906105769190613b2d565b61135c565b6040516105889190613b69565b60405180910390f35b34801561059d57600080fd5b506105a6611372565b6040516105b39190613ad5565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613954565b611400565b6040516105f09190613bd3565b60405180910390f35b34801561060557600080fd5b5061060e6114e9565b005b34801561061c57600080fd5b50610625611571565b6040516106329190613bd3565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613b2d565b611577565b005b34801561067057600080fd5b506106796115fd565b6040516106869190613b69565b60405180910390f35b34801561069b57600080fd5b506106a4611627565b6040516106b19190613ad5565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613f53565b6116b9565b005b3480156106ef57600080fd5b506106f861183a565b005b34801561070657600080fd5b5061070f6118bf565b60405161071c9190613bd3565b60405180910390f35b61073f600480360381019061073a9190613b2d565b611943565b005b34801561074d57600080fd5b5061076860048036038101906107639190613f93565b611c18565b005b34801561077657600080fd5b50610791600480360381019061078c9190614074565b611d4f565b005b34801561079f57600080fd5b506107a8611dab565b6040516107b59190613bd3565b60405180910390f35b3480156107ca57600080fd5b506107d3611db1565b6040516107e09190613bd3565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613e4c565b611dbb565b005b34801561081e57600080fd5b5061083960048036038101906108349190613b2d565b611e51565b6040516108469190613ad5565b60405180910390f35b34801561085b57600080fd5b50610864611f96565b6040516108719190613bd3565b60405180910390f35b610894600480360381019061088f91906140f7565b611f9c565b005b3480156108a257600080fd5b506108bd60048036038101906108b8919061415e565b61232e565b6040516108ca9190613a21565b60405180910390f35b3480156108df57600080fd5b506108e86123c2565b005b3480156108f657600080fd5b506108ff6124bb565b60405161090c9190613b69565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190613954565b6124d3565b005b34801561094a57600080fd5b506109536125cb565b005b61095d61272c565b73ffffffffffffffffffffffffffffffffffffffff1661097b6115fd565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906141ea565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b585750610b5782612734565b5b9050919050565b606060018054610b6e90614239565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9a90614239565b8015610be75780601f10610bbc57610100808354040283529160200191610be7565b820191906000526020600020905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b6000610bfc8261279e565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c32906142dd565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c818261135c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce99061436f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1161272c565b73ffffffffffffffffffffffffffffffffffffffff161480610d405750610d3f81610d3a61272c565b61232e565b5b610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690614401565b60405180910390fd5b610d8a8383836127ab565b505050565b60008054905090565b60125481565b610da983838361285d565b505050565b6000610db983611400565b8210610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614493565b60405180910390fd5b6000610e04610d8f565b905060008060005b83811015610f5e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610efe57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f505786841415610f47578195505050505050610f9a565b83806001019450505b508080600101915050610e0c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614525565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610fce92919061458d565b604051602081830303815290604052805190602001209050600181604051602001610ff99190614631565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161102f9493929190614675565b6020604051602081039080840390855afa158015611051573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110be61272c565b73ffffffffffffffffffffffffffffffffffffffff166110dc6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906141ea565b60405180910390fd5b80600b9080519060200190611148929190613805565b5050565b61116783838360405180602001604052806000815250611d4f565b505050565b6000611176610d8f565b82106111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061472c565b60405180910390fd5b819050919050565b60008060115414156111d457600090506111ed565b600060125414156111e857600190506111ed565b600290505b90565b6111f861272c565b73ffffffffffffffffffffffffffffffffffffffff166112166115fd565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906141ea565b60405180910390fd5b600260085414156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990614798565b60405180910390fd5b600260088190555060006112c46118bf565b905060008111611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614804565b60405180910390fd5b6000673782dace9d900000905061133473999646f0eb27d984e8adb3f2906c6580b31b915182612d9d565b61135061133f6115fd565b828461134b9190614853565b612d9d565b50506001600881905550565b600061136782612e4e565b600001519050919050565b6010805461137f90614239565b80601f01602080910402602001604051908101604052809291908181526020018280546113ab90614239565b80156113f85780601f106113cd576101008083540402835291602001916113f8565b820191906000526020600020905b8154815290600101906020018083116113db57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906148f9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114f161272c565b73ffffffffffffffffffffffffffffffffffffffff1661150f6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906141ea565b60405180910390fd5b61156f6000612fe8565b565b600d5481565b61157f61272c565b73ffffffffffffffffffffffffffffffffffffffff1661159d6115fd565b73ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea906141ea565b60405180910390fd5b80600c8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461163690614239565b80601f016020809104026020016040519081016040528092919081815260200182805461166290614239565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b5050505050905090565b6116c161272c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172690614965565b60405180910390fd5b806006600061173c61272c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e961272c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182e9190613a21565b60405180910390a35050565b61184261272c565b73ffffffffffffffffffffffffffffffffffffffff166118606115fd565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906141ea565b60405180910390fd5b42601381905550565b60006118c961272c565b73ffffffffffffffffffffffffffffffffffffffff166118e76115fd565b73ffffffffffffffffffffffffffffffffffffffff161461193d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611934906141ea565b60405180910390fd5b47905090565b60026008541415611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614798565b60405180910390fd5b6002600881905550600061199b6111bf565b90506002808111156119b0576119af613e95565b5b8160028111156119c3576119c2613e95565b5b14611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906149d1565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614a63565b60405180910390fd5b600a5482611a7d610d8f565b611a879190614a83565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614b25565b60405180910390fd5b600d5482600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b169190614a83565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614bb7565b60405180910390fd5b81611b60611db1565b611b6a9190614bd7565b341015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390614cc9565b60405180910390fd5b611bb633836130ae565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c059190614a83565b9250508190555050600160088190555050565b611c2061272c565b73ffffffffffffffffffffffffffffffffffffffff16611c3e6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b906141ea565b60405180910390fd5b600a5482611ca0610d8f565b611caa9190614a83565b1115611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614b25565b60405180910390fd5b611cf581836130ae565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d449190614a83565b925050819055505050565b611d5a84848461285d565b611d66848484846130cc565b611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90614d5b565b60405180910390fd5b50505050565b60135481565b6000600c54905090565b611dc361272c565b73ffffffffffffffffffffffffffffffffffffffff16611de16115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906141ea565b60405180910390fd5b8060109080519060200190611e4d929190613805565b5050565b6060611e5c8261279e565b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290614ded565b60405180910390fd5b60006013541415611f385760108054611eb390614239565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90614239565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b50505050509050611f91565b6000611f42613263565b90506000815111611f625760405180602001604052806000815250611f8d565b80611f6c846132f5565b604051602001611f7d929190614e8a565b6040516020818303038152906040525b9150505b919050565b60115481565b828282611fab33848484610fb8565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614f05565b60405180910390fd5b60026008541415612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614798565b60405180910390fd5b600260088190555060006120426111bf565b90506000600281111561205857612057613e95565b5b81600281111561206b5761206a613e95565b5b14156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390614f71565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614a63565b60405180910390fd5b60028081111561212d5761212c613e95565b5b8160028111156121405761213f613e95565b5b1415612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615003565b60405180910390fd5b600a548861218d610d8f565b6121979190614a83565b11156121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90614b25565b60405180910390fd5b600d5488600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122269190614a83565b1115612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614bb7565b60405180910390fd5b87612270611db1565b61227a9190614bd7565b3410156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906150bb565b60405180910390fd5b6122c633896130ae565b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123159190614a83565b9250508190555050600160088190555050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123ca61272c565b73ffffffffffffffffffffffffffffffffffffffff166123e86115fd565b73ffffffffffffffffffffffffffffffffffffffff161461243e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612435906141ea565b60405180910390fd5b60006124486111bf565b90506000600281111561245e5761245d613e95565b5b81600281111561247157612470613e95565b5b146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890615127565b60405180910390fd5b4260118190555050565b73999646f0eb27d984e8adb3f2906c6580b31b915181565b6124db61272c565b73ffffffffffffffffffffffffffffffffffffffff166124f96115fd565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612546906141ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b6906151b9565b60405180910390fd5b6125c881612fe8565b50565b6125d361272c565b73ffffffffffffffffffffffffffffffffffffffff166125f16115fd565b73ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906141ea565b60405180910390fd5b60006126516111bf565b905060028081111561266657612665613e95565b5b81600281111561267957612678613e95565b5b14156126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190615225565b60405180910390fd5b600060028111156126ce576126cd613e95565b5b8160028111156126e1576126e0613e95565b5b1415612722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612719906152b7565b60405180910390fd5b4260128190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061286882612e4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661288f61272c565b73ffffffffffffffffffffffffffffffffffffffff1614806128eb57506128b461272c565b73ffffffffffffffffffffffffffffffffffffffff166128d384610bf1565b73ffffffffffffffffffffffffffffffffffffffff16145b806129075750612906826000015161290161272c565b61232e565b5b905080612949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294090615349565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b2906153db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061546d565b60405180910390fd5b612a388585856001613456565b612a4860008484600001516127ab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d2d57612c8c8161279e565b15612d2c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d96858585600161345c565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612dc3906154be565b60006040518083038185875af1925050503d8060008114612e00576040519150601f19603f3d011682016040523d82523d6000602084013e612e05565b606091505b5050905080612e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e409061551f565b60405180910390fd5b505050565b612e5661388b565b612e5f8261279e565b612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906155b1565b60405180910390fd5b60008290505b60008110612fa7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f98578092505050612fe3565b50808060019003915050612ea4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90615643565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130c8828260405180602001604052806000815250613462565b5050565b60006130ed8473ffffffffffffffffffffffffffffffffffffffff16613474565b15613256578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311661272c565b8786866040518563ffffffff1660e01b815260040161313894939291906156b8565b602060405180830381600087803b15801561315257600080fd5b505af192505050801561318357506040513d601f19601f820116820180604052508101906131809190615719565b60015b613206573d80600081146131b3576040519150601f19603f3d011682016040523d82523d6000602084013e6131b8565b606091505b506000815114156131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590614d5b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061325b565b600190505b949350505050565b6060600b805461327290614239565b80601f016020809104026020016040519081016040528092919081815260200182805461329e90614239565b80156132eb5780601f106132c0576101008083540402835291602001916132eb565b820191906000526020600020905b8154815290600101906020018083116132ce57829003601f168201915b5050505050905090565b6060600082141561333d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613451565b600082905060005b6000821461336f57808061335890615746565b915050600a8261336891906157be565b9150613345565b60008167ffffffffffffffff81111561338b5761338a613d21565b5b6040519080825280601f01601f1916602001820160405280156133bd5781602001600182028036833780820191505090505b5090505b6000851461344a576001826133d69190614853565b9150600a856133e591906157ef565b60306133f19190614a83565b60f81b81838151811061340757613406615820565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561344391906157be565b94506133c1565b8093505050505b919050565b50505050565b50505050565b61346f8383836001613487565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f4906158c1565b60405180910390fd5b6000841415613541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353890615953565b60405180910390fd5b61354e6000868387613456565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156137e857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156137d35761379360008884886130cc565b6137d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c990614d5b565b60405180910390fd5b5b8180600101925050808060010191505061371c565b5080600081905550506137fe600086838761345c565b5050505050565b82805461381190614239565b90600052602060002090601f016020900481019282613833576000855561387a565b82601f1061384c57805160ff191683800117855561387a565b8280016001018555821561387a579182015b8281111561387957825182559160200191906001019061385e565b5b50905061388791906138c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156138de5760008160009055506001016138c6565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613921826138f6565b9050919050565b61393181613916565b811461393c57600080fd5b50565b60008135905061394e81613928565b92915050565b60006020828403121561396a576139696138ec565b5b60006139788482850161393f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139b681613981565b81146139c157600080fd5b50565b6000813590506139d3816139ad565b92915050565b6000602082840312156139ef576139ee6138ec565b5b60006139fd848285016139c4565b91505092915050565b60008115159050919050565b613a1b81613a06565b82525050565b6000602082019050613a366000830184613a12565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a76578082015181840152602081019050613a5b565b83811115613a85576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aa782613a3c565b613ab18185613a47565b9350613ac1818560208601613a58565b613aca81613a8b565b840191505092915050565b60006020820190508181036000830152613aef8184613a9c565b905092915050565b6000819050919050565b613b0a81613af7565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b600060208284031215613b4357613b426138ec565b5b6000613b5184828501613b18565b91505092915050565b613b6381613916565b82525050565b6000602082019050613b7e6000830184613b5a565b92915050565b60008060408385031215613b9b57613b9a6138ec565b5b6000613ba98582860161393f565b9250506020613bba85828601613b18565b9150509250929050565b613bcd81613af7565b82525050565b6000602082019050613be86000830184613bc4565b92915050565b600080600060608486031215613c0757613c066138ec565b5b6000613c158682870161393f565b9350506020613c268682870161393f565b9250506040613c3786828701613b18565b9150509250925092565b600060ff82169050919050565b613c5781613c41565b8114613c6257600080fd5b50565b600081359050613c7481613c4e565b92915050565b6000819050919050565b613c8d81613c7a565b8114613c9857600080fd5b50565b600081359050613caa81613c84565b92915050565b60008060008060808587031215613cca57613cc96138ec565b5b6000613cd88782880161393f565b9450506020613ce987828801613c65565b9350506040613cfa87828801613c9b565b9250506060613d0b87828801613c9b565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5982613a8b565b810181811067ffffffffffffffff82111715613d7857613d77613d21565b5b80604052505050565b6000613d8b6138e2565b9050613d978282613d50565b919050565b600067ffffffffffffffff821115613db757613db6613d21565b5b613dc082613a8b565b9050602081019050919050565b82818337600083830152505050565b6000613def613dea84613d9c565b613d81565b905082815260208101848484011115613e0b57613e0a613d1c565b5b613e16848285613dcd565b509392505050565b600082601f830112613e3357613e32613d17565b5b8135613e43848260208601613ddc565b91505092915050565b600060208284031215613e6257613e616138ec565b5b600082013567ffffffffffffffff811115613e8057613e7f6138f1565b5b613e8c84828501613e1e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613ed557613ed4613e95565b5b50565b6000819050613ee682613ec4565b919050565b6000613ef682613ed8565b9050919050565b613f0681613eeb565b82525050565b6000602082019050613f216000830184613efd565b92915050565b613f3081613a06565b8114613f3b57600080fd5b50565b600081359050613f4d81613f27565b92915050565b60008060408385031215613f6a57613f696138ec565b5b6000613f788582860161393f565b9250506020613f8985828601613f3e565b9150509250929050565b60008060408385031215613faa57613fa96138ec565b5b6000613fb885828601613b18565b9250506020613fc98582860161393f565b9150509250929050565b600067ffffffffffffffff821115613fee57613fed613d21565b5b613ff782613a8b565b9050602081019050919050565b600061401761401284613fd3565b613d81565b90508281526020810184848401111561403357614032613d1c565b5b61403e848285613dcd565b509392505050565b600082601f83011261405b5761405a613d17565b5b813561406b848260208601614004565b91505092915050565b6000806000806080858703121561408e5761408d6138ec565b5b600061409c8782880161393f565b94505060206140ad8782880161393f565b93505060406140be87828801613b18565b925050606085013567ffffffffffffffff8111156140df576140de6138f1565b5b6140eb87828801614046565b91505092959194509250565b60008060008060808587031215614111576141106138ec565b5b600061411f87828801613b18565b945050602061413087828801613c65565b935050604061414187828801613c9b565b925050606061415287828801613c9b565b91505092959194509250565b60008060408385031215614175576141746138ec565b5b60006141838582860161393f565b92505060206141948582860161393f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141d4602083613a47565b91506141df8261419e565b602082019050919050565b60006020820190508181036000830152614203816141c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425157607f821691505b602082108114156142655761426461420a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006142c7602d83613a47565b91506142d28261426b565b604082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614359602283613a47565b9150614364826142fd565b604082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006143eb603983613a47565b91506143f68261438f565b604082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061447d602283613a47565b915061448882614421565b604082019050919050565b600060208201905081810360008301526144ac81614470565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061450f602e83613a47565b915061451a826144b3565b604082019050919050565b6000602082019050818103600083015261453e81614502565b9050919050565b60008160601b9050919050565b600061455d82614545565b9050919050565b600061456f82614552565b9050919050565b61458761458282613916565b614564565b82525050565b60006145998285614576565b6014820191506145a98284614576565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006145fa601c836145b9565b9150614605826145c4565b601c82019050919050565b6000819050919050565b61462b61462682613c7a565b614610565b82525050565b600061463c826145ed565b9150614648828461461a565b60208201915081905092915050565b61466081613c7a565b82525050565b61466f81613c41565b82525050565b600060808201905061468a6000830187614657565b6146976020830186614666565b6146a46040830185614657565b6146b16060830184614657565b95945050505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614716602383613a47565b9150614721826146ba565b604082019050919050565b6000602082019050818103600083015261474581614709565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614782601f83613a47565b915061478d8261474c565b602082019050919050565b600060208201905081810360008301526147b181614775565b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b60006147ee601583613a47565b91506147f9826147b8565b602082019050919050565b6000602082019050818103600083015261481d816147e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485e82613af7565b915061486983613af7565b92508282101561487c5761487b614824565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006148e3602b83613a47565b91506148ee82614887565b604082019050919050565b60006020820190508181036000830152614912816148d6565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061494f601a83613a47565b915061495a82614919565b602082019050919050565b6000602082019050818103600083015261497e81614942565b9050919050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b60006149bb601c83613a47565b91506149c682614985565b602082019050919050565b600060208201905081810360008301526149ea816149ae565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b6000614a4d602483613a47565b9150614a58826149f1565b604082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b6000614a8e82613af7565b9150614a9983613af7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ace57614acd614824565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614b0f601e83613a47565b9150614b1a82614ad9565b602082019050919050565b60006020820190508181036000830152614b3e81614b02565b9050919050565b7f4d6178696d756d2032204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000614ba1602483613a47565b9150614bac82614b45565b604082019050919050565b60006020820190508181036000830152614bd081614b94565b9050919050565b6000614be282613af7565b9150614bed83613af7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2657614c25614824565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b6000614cb3605183613a47565b9150614cbe82614c31565b606082019050919050565b60006020820190508181036000830152614ce281614ca6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614d45603383613a47565b9150614d5082614ce9565b604082019050919050565b60006020820190508181036000830152614d7481614d38565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614dd7602f83613a47565b9150614de282614d7b565b604082019050919050565b60006020820190508181036000830152614e0681614dca565b9050919050565b6000614e1882613a3c565b614e2281856145b9565b9350614e32818560208601613a58565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e746005836145b9565b9150614e7f82614e3e565b600582019050919050565b6000614e968285614e0d565b9150614ea28284614e0d565b9150614ead82614e67565b91508190509392505050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000614eef601183613a47565b9150614efa82614eb9565b602082019050919050565b60006020820190508181036000830152614f1e81614ee2565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614f5b601583613a47565b9150614f6682614f25565b602082019050919050565b60006020820190508181036000830152614f8a81614f4e565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614fed602a83613a47565b9150614ff882614f91565b604082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b60006150a5604d83613a47565b91506150b082615023565b606082019050919050565b600060208201905081810360008301526150d481615098565b9050919050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000615111601b83613a47565b915061511c826150db565b602082019050919050565b6000602082019050818103600083015261514081615104565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151a3602683613a47565b91506151ae82615147565b604082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b600061520f601c83613a47565b915061521a826151d9565b602082019050919050565b6000602082019050818103600083015261523e81615202565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006152a1603d83613a47565b91506152ac82615245565b604082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615333603283613a47565b915061533e826152d7565b604082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006153c5602683613a47565b91506153d082615369565b604082019050919050565b600060208201905081810360008301526153f4816153b8565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615457602583613a47565b9150615462826153fb565b604082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b600081905092915050565b50565b60006154a860008361548d565b91506154b382615498565b600082019050919050565b60006154c98261549b565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000615509601483613a47565b9150615514826154d3565b602082019050919050565b60006020820190508181036000830152615538816154fc565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061559b602a83613a47565b91506155a68261553f565b604082019050919050565b600060208201905081810360008301526155ca8161558e565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061562d602f83613a47565b9150615638826155d1565b604082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061568a82615663565b615694818561566e565b93506156a4818560208601613a58565b6156ad81613a8b565b840191505092915050565b60006080820190506156cd6000830187613b5a565b6156da6020830186613b5a565b6156e76040830185613bc4565b81810360608301526156f9818461567f565b905095945050505050565b600081519050615713816139ad565b92915050565b60006020828403121561572f5761572e6138ec565b5b600061573d84828501615704565b91505092915050565b600061575182613af7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561578457615783614824565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157c982613af7565b91506157d483613af7565b9250826157e4576157e361578f565b5b828204905092915050565b60006157fa82613af7565b915061580583613af7565b9250826158155761581461578f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006158ab602183613a47565b91506158b68261584f565b604082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061593d602883613a47565b9150615948826158e1565b604082019050919050565b6000602082019050818103600083015261596c81615930565b905091905056fea2646970667358221220a7ff354863080cc3917046e0ed4ae1a5f9773ce63a4d2c1d7a9810a576785b5464736f6c63430008090033

Deployed Bytecode

0x60806040526004361061024a5760003560e01c80637501f74111610139578063ba829d71116100b6578063dcd4e7321161007a578063dcd4e7321461087a578063e985e9c514610896578063eab41782146108d3578063ecfd0a56146108ea578063f2fde38b14610915578063ff9849941461093e57610251565b8063ba829d7114610793578063bdb4b848146107be578063c4d8b9df146107e9578063c87b56dd14610812578063cd5fe7251461084f57610251565b8063a475b5dd116100fd578063a475b5dd146106e3578063b0a1c1c4146106fa578063b3ab66b014610725578063b620e97514610741578063b88d4fde1461076a57610251565b80637501f741146106105780637f1921ef1461063b5780638da5cb5b1461066457806395d89b411461068f578063a22cb465146106ba57610251565b806332624114116101c757806361b20d8c1161018b57806361b20d8c1461053d5780636352211e146105545780637035bf181461059157806370a08231146105bc578063715018a6146105f957610251565b8063326241141461044657806339a0c6f91461048357806342842e0e146104ac5780634f6ccce7146104d5578063603f4d521461051257610251565b806318160ddd1161020e57806318160ddd1461034d5780631a17fe5e1461037857806323b872dd146103a35780632f745c59146103cc5780633023eba61461040957610251565b80630191a6571461025657806301ffc9a71461027f57806306fdde03146102bc578063081812fc146102e7578063095ea7b31461032457610251565b3661025157005b600080fd5b34801561026257600080fd5b5061027d60048036038101906102789190613954565b610955565b005b34801561028b57600080fd5b506102a660048036038101906102a191906139d9565b610a15565b6040516102b39190613a21565b60405180910390f35b3480156102c857600080fd5b506102d1610b5f565b6040516102de9190613ad5565b60405180910390f35b3480156102f357600080fd5b5061030e60048036038101906103099190613b2d565b610bf1565b60405161031b9190613b69565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190613b84565b610c76565b005b34801561035957600080fd5b50610362610d8f565b60405161036f9190613bd3565b60405180910390f35b34801561038457600080fd5b5061038d610d98565b60405161039a9190613bd3565b60405180910390f35b3480156103af57600080fd5b506103ca60048036038101906103c59190613bee565b610d9e565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190613b84565b610dae565b6040516104009190613bd3565b60405180910390f35b34801561041557600080fd5b50610430600480360381019061042b9190613954565b610fa0565b60405161043d9190613bd3565b60405180910390f35b34801561045257600080fd5b5061046d60048036038101906104689190613cb0565b610fb8565b60405161047a9190613a21565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190613e4c565b6110b6565b005b3480156104b857600080fd5b506104d360048036038101906104ce9190613bee565b61114c565b005b3480156104e157600080fd5b506104fc60048036038101906104f79190613b2d565b61116c565b6040516105099190613bd3565b60405180910390f35b34801561051e57600080fd5b506105276111bf565b6040516105349190613f0c565b60405180910390f35b34801561054957600080fd5b506105526111f0565b005b34801561056057600080fd5b5061057b60048036038101906105769190613b2d565b61135c565b6040516105889190613b69565b60405180910390f35b34801561059d57600080fd5b506105a6611372565b6040516105b39190613ad5565b60405180910390f35b3480156105c857600080fd5b506105e360048036038101906105de9190613954565b611400565b6040516105f09190613bd3565b60405180910390f35b34801561060557600080fd5b5061060e6114e9565b005b34801561061c57600080fd5b50610625611571565b6040516106329190613bd3565b60405180910390f35b34801561064757600080fd5b50610662600480360381019061065d9190613b2d565b611577565b005b34801561067057600080fd5b506106796115fd565b6040516106869190613b69565b60405180910390f35b34801561069b57600080fd5b506106a4611627565b6040516106b19190613ad5565b60405180910390f35b3480156106c657600080fd5b506106e160048036038101906106dc9190613f53565b6116b9565b005b3480156106ef57600080fd5b506106f861183a565b005b34801561070657600080fd5b5061070f6118bf565b60405161071c9190613bd3565b60405180910390f35b61073f600480360381019061073a9190613b2d565b611943565b005b34801561074d57600080fd5b5061076860048036038101906107639190613f93565b611c18565b005b34801561077657600080fd5b50610791600480360381019061078c9190614074565b611d4f565b005b34801561079f57600080fd5b506107a8611dab565b6040516107b59190613bd3565b60405180910390f35b3480156107ca57600080fd5b506107d3611db1565b6040516107e09190613bd3565b60405180910390f35b3480156107f557600080fd5b50610810600480360381019061080b9190613e4c565b611dbb565b005b34801561081e57600080fd5b5061083960048036038101906108349190613b2d565b611e51565b6040516108469190613ad5565b60405180910390f35b34801561085b57600080fd5b50610864611f96565b6040516108719190613bd3565b60405180910390f35b610894600480360381019061088f91906140f7565b611f9c565b005b3480156108a257600080fd5b506108bd60048036038101906108b8919061415e565b61232e565b6040516108ca9190613a21565b60405180910390f35b3480156108df57600080fd5b506108e86123c2565b005b3480156108f657600080fd5b506108ff6124bb565b60405161090c9190613b69565b60405180910390f35b34801561092157600080fd5b5061093c60048036038101906109379190613954565b6124d3565b005b34801561094a57600080fd5b506109536125cb565b005b61095d61272c565b73ffffffffffffffffffffffffffffffffffffffff1661097b6115fd565b73ffffffffffffffffffffffffffffffffffffffff16146109d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c8906141ea565b60405180910390fd5b80600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae057507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b4857507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b585750610b5782612734565b5b9050919050565b606060018054610b6e90614239565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9a90614239565b8015610be75780601f10610bbc57610100808354040283529160200191610be7565b820191906000526020600020905b815481529060010190602001808311610bca57829003601f168201915b5050505050905090565b6000610bfc8261279e565b610c3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c32906142dd565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c818261135c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610cf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce99061436f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610d1161272c565b73ffffffffffffffffffffffffffffffffffffffff161480610d405750610d3f81610d3a61272c565b61232e565b5b610d7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7690614401565b60405180910390fd5b610d8a8383836127ab565b505050565b60008054905090565b60125481565b610da983838361285d565b505050565b6000610db983611400565b8210610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190614493565b60405180910390fd5b6000610e04610d8f565b905060008060005b83811015610f5e576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610efe57806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f505786841415610f47578195505050505050610f9a565b83806001019450505b508080600101915050610e0c565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614525565b60405180910390fd5b92915050565b600f6020528060005260406000206000915090505481565b6000803086604051602001610fce92919061458d565b604051602081830303815290604052805190602001209050600181604051602001610ff99190614631565b604051602081830303815290604052805190602001208686866040516000815260200160405260405161102f9493929190614675565b6020604051602081039080840390855afa158015611051573d6000803e3d6000fd5b5050506020604051035173ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614915050949350505050565b6110be61272c565b73ffffffffffffffffffffffffffffffffffffffff166110dc6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611129906141ea565b60405180910390fd5b80600b9080519060200190611148929190613805565b5050565b61116783838360405180602001604052806000815250611d4f565b505050565b6000611176610d8f565b82106111b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ae9061472c565b60405180910390fd5b819050919050565b60008060115414156111d457600090506111ed565b600060125414156111e857600190506111ed565b600290505b90565b6111f861272c565b73ffffffffffffffffffffffffffffffffffffffff166112166115fd565b73ffffffffffffffffffffffffffffffffffffffff161461126c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611263906141ea565b60405180910390fd5b600260085414156112b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a990614798565b60405180910390fd5b600260088190555060006112c46118bf565b905060008111611309576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130090614804565b60405180910390fd5b6000673782dace9d900000905061133473999646f0eb27d984e8adb3f2906c6580b31b915182612d9d565b61135061133f6115fd565b828461134b9190614853565b612d9d565b50506001600881905550565b600061136782612e4e565b600001519050919050565b6010805461137f90614239565b80601f01602080910402602001604051908101604052809291908181526020018280546113ab90614239565b80156113f85780601f106113cd576101008083540402835291602001916113f8565b820191906000526020600020905b8154815290600101906020018083116113db57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611471576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611468906148f9565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b6114f161272c565b73ffffffffffffffffffffffffffffffffffffffff1661150f6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611565576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155c906141ea565b60405180910390fd5b61156f6000612fe8565b565b600d5481565b61157f61272c565b73ffffffffffffffffffffffffffffffffffffffff1661159d6115fd565b73ffffffffffffffffffffffffffffffffffffffff16146115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea906141ea565b60405180910390fd5b80600c8190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461163690614239565b80601f016020809104026020016040519081016040528092919081815260200182805461166290614239565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b5050505050905090565b6116c161272c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561172f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172690614965565b60405180910390fd5b806006600061173c61272c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117e961272c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161182e9190613a21565b60405180910390a35050565b61184261272c565b73ffffffffffffffffffffffffffffffffffffffff166118606115fd565b73ffffffffffffffffffffffffffffffffffffffff16146118b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118ad906141ea565b60405180910390fd5b42601381905550565b60006118c961272c565b73ffffffffffffffffffffffffffffffffffffffff166118e76115fd565b73ffffffffffffffffffffffffffffffffffffffff161461193d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611934906141ea565b60405180910390fd5b47905090565b60026008541415611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198090614798565b60405180910390fd5b6002600881905550600061199b6111bf565b90506002808111156119b0576119af613e95565b5b8160028111156119c3576119c2613e95565b5b14611a03576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119fa906149d1565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6890614a63565b60405180910390fd5b600a5482611a7d610d8f565b611a879190614a83565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf90614b25565b60405180910390fd5b600d5482600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611b169190614a83565b1115611b57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4e90614bb7565b60405180910390fd5b81611b60611db1565b611b6a9190614bd7565b341015611bac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ba390614cc9565b60405180910390fd5b611bb633836130ae565b81600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c059190614a83565b9250508190555050600160088190555050565b611c2061272c565b73ffffffffffffffffffffffffffffffffffffffff16611c3e6115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c8b906141ea565b60405180910390fd5b600a5482611ca0610d8f565b611caa9190614a83565b1115611ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce290614b25565b60405180910390fd5b611cf581836130ae565b81600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d449190614a83565b925050819055505050565b611d5a84848461285d565b611d66848484846130cc565b611da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9c90614d5b565b60405180910390fd5b50505050565b60135481565b6000600c54905090565b611dc361272c565b73ffffffffffffffffffffffffffffffffffffffff16611de16115fd565b73ffffffffffffffffffffffffffffffffffffffff1614611e37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2e906141ea565b60405180910390fd5b8060109080519060200190611e4d929190613805565b5050565b6060611e5c8261279e565b611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9290614ded565b60405180910390fd5b60006013541415611f385760108054611eb390614239565b80601f0160208091040260200160405190810160405280929190818152602001828054611edf90614239565b8015611f2c5780601f10611f0157610100808354040283529160200191611f2c565b820191906000526020600020905b815481529060010190602001808311611f0f57829003601f168201915b50505050509050611f91565b6000611f42613263565b90506000815111611f625760405180602001604052806000815250611f8d565b80611f6c846132f5565b604051602001611f7d929190614e8a565b6040516020818303038152906040525b9150505b919050565b60115481565b828282611fab33848484610fb8565b611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe190614f05565b60405180910390fd5b60026008541415612030576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202790614798565b60405180910390fd5b600260088190555060006120426111bf565b90506000600281111561205857612057613e95565b5b81600281111561206b5761206a613e95565b5b14156120ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a390614f71565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461211a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161211190614a63565b60405180910390fd5b60028081111561212d5761212c613e95565b5b8160028111156121405761213f613e95565b5b1415612181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161217890615003565b60405180910390fd5b600a548861218d610d8f565b6121979190614a83565b11156121d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cf90614b25565b60405180910390fd5b600d5488600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122269190614a83565b1115612267576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225e90614bb7565b60405180910390fd5b87612270611db1565b61227a9190614bd7565b3410156122bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b3906150bb565b60405180910390fd5b6122c633896130ae565b87600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123159190614a83565b9250508190555050600160088190555050505050505050565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6123ca61272c565b73ffffffffffffffffffffffffffffffffffffffff166123e86115fd565b73ffffffffffffffffffffffffffffffffffffffff161461243e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612435906141ea565b60405180910390fd5b60006124486111bf565b90506000600281111561245e5761245d613e95565b5b81600281111561247157612470613e95565b5b146124b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a890615127565b60405180910390fd5b4260118190555050565b73999646f0eb27d984e8adb3f2906c6580b31b915181565b6124db61272c565b73ffffffffffffffffffffffffffffffffffffffff166124f96115fd565b73ffffffffffffffffffffffffffffffffffffffff161461254f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612546906141ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156125bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b6906151b9565b60405180910390fd5b6125c881612fe8565b50565b6125d361272c565b73ffffffffffffffffffffffffffffffffffffffff166125f16115fd565b73ffffffffffffffffffffffffffffffffffffffff1614612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e906141ea565b60405180910390fd5b60006126516111bf565b905060028081111561266657612665613e95565b5b81600281111561267957612678613e95565b5b14156126ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126b190615225565b60405180910390fd5b600060028111156126ce576126cd613e95565b5b8160028111156126e1576126e0613e95565b5b1415612722576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612719906152b7565b60405180910390fd5b4260128190555050565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600061286882612e4e565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff1661288f61272c565b73ffffffffffffffffffffffffffffffffffffffff1614806128eb57506128b461272c565b73ffffffffffffffffffffffffffffffffffffffff166128d384610bf1565b73ffffffffffffffffffffffffffffffffffffffff16145b806129075750612906826000015161290161272c565b61232e565b5b905080612949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294090615349565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146129bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b2906153db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a229061546d565b60405180910390fd5b612a388585856001613456565b612a4860008484600001516127ab565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612d2d57612c8c8161279e565b15612d2c5782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d96858585600161345c565b5050505050565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051612dc3906154be565b60006040518083038185875af1925050503d8060008114612e00576040519150601f19603f3d011682016040523d82523d6000602084013e612e05565b606091505b5050905080612e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e409061551f565b60405180910390fd5b505050565b612e5661388b565b612e5f8261279e565b612e9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e95906155b1565b60405180910390fd5b60008290505b60008110612fa7576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612f98578092505050612fe3565b50808060019003915050612ea4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fda90615643565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6130c8828260405180602001604052806000815250613462565b5050565b60006130ed8473ffffffffffffffffffffffffffffffffffffffff16613474565b15613256578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261311661272c565b8786866040518563ffffffff1660e01b815260040161313894939291906156b8565b602060405180830381600087803b15801561315257600080fd5b505af192505050801561318357506040513d601f19601f820116820180604052508101906131809190615719565b60015b613206573d80600081146131b3576040519150601f19603f3d011682016040523d82523d6000602084013e6131b8565b606091505b506000815114156131fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131f590614d5b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061325b565b600190505b949350505050565b6060600b805461327290614239565b80601f016020809104026020016040519081016040528092919081815260200182805461329e90614239565b80156132eb5780601f106132c0576101008083540402835291602001916132eb565b820191906000526020600020905b8154815290600101906020018083116132ce57829003601f168201915b5050505050905090565b6060600082141561333d576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613451565b600082905060005b6000821461336f57808061335890615746565b915050600a8261336891906157be565b9150613345565b60008167ffffffffffffffff81111561338b5761338a613d21565b5b6040519080825280601f01601f1916602001820160405280156133bd5781602001600182028036833780820191505090505b5090505b6000851461344a576001826133d69190614853565b9150600a856133e591906157ef565b60306133f19190614a83565b60f81b81838151811061340757613406615820565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561344391906157be565b94506133c1565b8093505050505b919050565b50505050565b50505050565b61346f8383836001613487565b505050565b600080823b905060008111915050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156134fd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134f4906158c1565b60405180910390fd5b6000841415613541576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161353890615953565b60405180910390fd5b61354e6000868387613456565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156137e857818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156137d35761379360008884886130cc565b6137d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016137c990614d5b565b60405180910390fd5b5b8180600101925050808060010191505061371c565b5080600081905550506137fe600086838761345c565b5050505050565b82805461381190614239565b90600052602060002090601f016020900481019282613833576000855561387a565b82601f1061384c57805160ff191683800117855561387a565b8280016001018555821561387a579182015b8281111561387957825182559160200191906001019061385e565b5b50905061388791906138c5565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156138de5760008160009055506001016138c6565b5090565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613921826138f6565b9050919050565b61393181613916565b811461393c57600080fd5b50565b60008135905061394e81613928565b92915050565b60006020828403121561396a576139696138ec565b5b60006139788482850161393f565b91505092915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6139b681613981565b81146139c157600080fd5b50565b6000813590506139d3816139ad565b92915050565b6000602082840312156139ef576139ee6138ec565b5b60006139fd848285016139c4565b91505092915050565b60008115159050919050565b613a1b81613a06565b82525050565b6000602082019050613a366000830184613a12565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613a76578082015181840152602081019050613a5b565b83811115613a85576000848401525b50505050565b6000601f19601f8301169050919050565b6000613aa782613a3c565b613ab18185613a47565b9350613ac1818560208601613a58565b613aca81613a8b565b840191505092915050565b60006020820190508181036000830152613aef8184613a9c565b905092915050565b6000819050919050565b613b0a81613af7565b8114613b1557600080fd5b50565b600081359050613b2781613b01565b92915050565b600060208284031215613b4357613b426138ec565b5b6000613b5184828501613b18565b91505092915050565b613b6381613916565b82525050565b6000602082019050613b7e6000830184613b5a565b92915050565b60008060408385031215613b9b57613b9a6138ec565b5b6000613ba98582860161393f565b9250506020613bba85828601613b18565b9150509250929050565b613bcd81613af7565b82525050565b6000602082019050613be86000830184613bc4565b92915050565b600080600060608486031215613c0757613c066138ec565b5b6000613c158682870161393f565b9350506020613c268682870161393f565b9250506040613c3786828701613b18565b9150509250925092565b600060ff82169050919050565b613c5781613c41565b8114613c6257600080fd5b50565b600081359050613c7481613c4e565b92915050565b6000819050919050565b613c8d81613c7a565b8114613c9857600080fd5b50565b600081359050613caa81613c84565b92915050565b60008060008060808587031215613cca57613cc96138ec565b5b6000613cd88782880161393f565b9450506020613ce987828801613c65565b9350506040613cfa87828801613c9b565b9250506060613d0b87828801613c9b565b91505092959194509250565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613d5982613a8b565b810181811067ffffffffffffffff82111715613d7857613d77613d21565b5b80604052505050565b6000613d8b6138e2565b9050613d978282613d50565b919050565b600067ffffffffffffffff821115613db757613db6613d21565b5b613dc082613a8b565b9050602081019050919050565b82818337600083830152505050565b6000613def613dea84613d9c565b613d81565b905082815260208101848484011115613e0b57613e0a613d1c565b5b613e16848285613dcd565b509392505050565b600082601f830112613e3357613e32613d17565b5b8135613e43848260208601613ddc565b91505092915050565b600060208284031215613e6257613e616138ec565b5b600082013567ffffffffffffffff811115613e8057613e7f6138f1565b5b613e8c84828501613e1e565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b60038110613ed557613ed4613e95565b5b50565b6000819050613ee682613ec4565b919050565b6000613ef682613ed8565b9050919050565b613f0681613eeb565b82525050565b6000602082019050613f216000830184613efd565b92915050565b613f3081613a06565b8114613f3b57600080fd5b50565b600081359050613f4d81613f27565b92915050565b60008060408385031215613f6a57613f696138ec565b5b6000613f788582860161393f565b9250506020613f8985828601613f3e565b9150509250929050565b60008060408385031215613faa57613fa96138ec565b5b6000613fb885828601613b18565b9250506020613fc98582860161393f565b9150509250929050565b600067ffffffffffffffff821115613fee57613fed613d21565b5b613ff782613a8b565b9050602081019050919050565b600061401761401284613fd3565b613d81565b90508281526020810184848401111561403357614032613d1c565b5b61403e848285613dcd565b509392505050565b600082601f83011261405b5761405a613d17565b5b813561406b848260208601614004565b91505092915050565b6000806000806080858703121561408e5761408d6138ec565b5b600061409c8782880161393f565b94505060206140ad8782880161393f565b93505060406140be87828801613b18565b925050606085013567ffffffffffffffff8111156140df576140de6138f1565b5b6140eb87828801614046565b91505092959194509250565b60008060008060808587031215614111576141106138ec565b5b600061411f87828801613b18565b945050602061413087828801613c65565b935050604061414187828801613c9b565b925050606061415287828801613c9b565b91505092959194509250565b60008060408385031215614175576141746138ec565b5b60006141838582860161393f565b92505060206141948582860161393f565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006141d4602083613a47565b91506141df8261419e565b602082019050919050565b60006020820190508181036000830152614203816141c7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061425157607f821691505b602082108114156142655761426461420a565b5b50919050565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b60006142c7602d83613a47565b91506142d28261426b565b604082019050919050565b600060208201905081810360008301526142f6816142ba565b9050919050565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b6000614359602283613a47565b9150614364826142fd565b604082019050919050565b600060208201905081810360008301526143888161434c565b9050919050565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b60006143eb603983613a47565b91506143f68261438f565b604082019050919050565b6000602082019050818103600083015261441a816143de565b9050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b600061447d602283613a47565b915061448882614421565b604082019050919050565b600060208201905081810360008301526144ac81614470565b9050919050565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b600061450f602e83613a47565b915061451a826144b3565b604082019050919050565b6000602082019050818103600083015261453e81614502565b9050919050565b60008160601b9050919050565b600061455d82614545565b9050919050565b600061456f82614552565b9050919050565b61458761458282613916565b614564565b82525050565b60006145998285614576565b6014820191506145a98284614576565b6014820191508190509392505050565b600081905092915050565b7f19457468657265756d205369676e6564204d6573736167653a0a333200000000600082015250565b60006145fa601c836145b9565b9150614605826145c4565b601c82019050919050565b6000819050919050565b61462b61462682613c7a565b614610565b82525050565b600061463c826145ed565b9150614648828461461a565b60208201915081905092915050565b61466081613c7a565b82525050565b61466f81613c41565b82525050565b600060808201905061468a6000830187614657565b6146976020830186614666565b6146a46040830185614657565b6146b16060830184614657565b95945050505050565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b6000614716602383613a47565b9150614721826146ba565b604082019050919050565b6000602082019050818103600083015261474581614709565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614782601f83613a47565b915061478d8261474c565b602082019050919050565b600060208201905081810360008301526147b181614775565b9050919050565b7f4e6f2066756e647320746f207265747269657665210000000000000000000000600082015250565b60006147ee601583613a47565b91506147f9826147b8565b602082019050919050565b6000602082019050818103600083015261481d816147e1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061485e82613af7565b915061486983613af7565b92508282101561487c5761487b614824565b5b828203905092915050565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b60006148e3602b83613a47565b91506148ee82614887565b604082019050919050565b60006020820190508181036000830152614912816148d6565b9050919050565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b600061494f601a83613a47565b915061495a82614919565b602082019050919050565b6000602082019050818103600083015261497e81614942565b9050919050565b7f5075626c69632053616c6520696e206e6f74206f70656e207965742100000000600082015250565b60006149bb601c83613a47565b91506149c682614985565b602082019050919050565b600060208201905081810360008301526149ea816149ae565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b6000614a4d602483613a47565b9150614a58826149f1565b604082019050919050565b60006020820190508181036000830152614a7c81614a40565b9050919050565b6000614a8e82613af7565b9150614a9983613af7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614ace57614acd614824565b5b828201905092915050565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742e2e0000600082015250565b6000614b0f601e83613a47565b9150614b1a82614ad9565b602082019050919050565b60006020820190508181036000830152614b3e81614b02565b9050919050565b7f4d6178696d756d2032204d696e747320706572204164647265737320616c6c6f60008201527f7765642100000000000000000000000000000000000000000000000000000000602082015250565b6000614ba1602483613a47565b9150614bac82614b45565b604082019050919050565b60006020820190508181036000830152614bd081614b94565b9050919050565b6000614be282613af7565b9150614bed83613af7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614c2657614c25614824565b5b828202905092915050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f68657220666f722065616368204e465429000000000000000000000000000000604082015250565b6000614cb3605183613a47565b9150614cbe82614c31565b606082019050919050565b60006020820190508181036000830152614ce281614ca6565b9050919050565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b6000614d45603383613a47565b9150614d5082614ce9565b604082019050919050565b60006020820190508181036000830152614d7481614d38565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614dd7602f83613a47565b9150614de282614d7b565b604082019050919050565b60006020820190508181036000830152614e0681614dca565b9050919050565b6000614e1882613a3c565b614e2281856145b9565b9350614e32818560208601613a58565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614e746005836145b9565b9150614e7f82614e3e565b600582019050919050565b6000614e968285614e0d565b9150614ea28284614e0d565b9150614ead82614e67565b91508190509392505050565b7f496e76616c6964205369676e6174757265000000000000000000000000000000600082015250565b6000614eef601183613a47565b9150614efa82614eb9565b602082019050919050565b60006020820190508181036000830152614f1e81614ee2565b9050919050565b7f53616c6520696e206e6f74206f70656e20796574210000000000000000000000600082015250565b6000614f5b601583613a47565b9150614f6682614f25565b602082019050919050565b60006020820190508181036000830152614f8a81614f4e565b9050919050565b7f50726573616c652068617320636c6f7365642c20436865636b206f757420507560008201527f626c69632053616c652100000000000000000000000000000000000000000000602082015250565b6000614fed602a83613a47565b9150614ff882614f91565b604082019050919050565b6000602082019050818103600083015261501c81614fe0565b9050919050565b7f4e6f742073756666696369656e7420457468657220746f206d696e742074686960008201527f7320616d6f756e74206f66204e4654732028436f7374203d20302e313520657460208201527f6865722065616368204e46542900000000000000000000000000000000000000604082015250565b60006150a5604d83613a47565b91506150b082615023565b606082019050919050565b600060208201905081810360008301526150d481615098565b9050919050565b7f50726573616c652068617320616c7265616479206f70656e6564210000000000600082015250565b6000615111601b83613a47565b915061511c826150db565b602082019050919050565b6000602082019050818103600083015261514081615104565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006151a3602683613a47565b91506151ae82615147565b604082019050919050565b600060208201905081810360008301526151d281615196565b9050919050565b7f5075626c69632053616c6520697320616c7265616479206c6976652100000000600082015250565b600061520f601c83613a47565b915061521a826151d9565b602082019050919050565b6000602082019050818103600083015261523e81615202565b9050919050565b7f43616e6e6f74206368616e676520746f205075626c69632053616c652069662060008201527f746865726520686173206e6f74206265656e20612050726573616c6521000000602082015250565b60006152a1603d83613a47565b91506152ac82615245565b604082019050919050565b600060208201905081810360008301526152d081615294565b9050919050565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b6000615333603283613a47565b915061533e826152d7565b604082019050919050565b6000602082019050818103600083015261536281615326565b9050919050565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b60006153c5602683613a47565b91506153d082615369565b604082019050919050565b600060208201905081810360008301526153f4816153b8565b9050919050565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000615457602583613a47565b9150615462826153fb565b604082019050919050565b600060208201905081810360008301526154868161544a565b9050919050565b600081905092915050565b50565b60006154a860008361548d565b91506154b382615498565b600082019050919050565b60006154c98261549b565b9150819050919050565b7f4661696c656420746f2073656e64204574686572000000000000000000000000600082015250565b6000615509601483613a47565b9150615514826154d3565b602082019050919050565b60006020820190508181036000830152615538816154fc565b9050919050565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b600061559b602a83613a47565b91506155a68261553f565b604082019050919050565b600060208201905081810360008301526155ca8161558e565b9050919050565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b600061562d602f83613a47565b9150615638826155d1565b604082019050919050565b6000602082019050818103600083015261565c81615620565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061568a82615663565b615694818561566e565b93506156a4818560208601613a58565b6156ad81613a8b565b840191505092915050565b60006080820190506156cd6000830187613b5a565b6156da6020830186613b5a565b6156e76040830185613bc4565b81810360608301526156f9818461567f565b905095945050505050565b600081519050615713816139ad565b92915050565b60006020828403121561572f5761572e6138ec565b5b600061573d84828501615704565b91505092915050565b600061575182613af7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561578457615783614824565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006157c982613af7565b91506157d483613af7565b9250826157e4576157e361578f565b5b828204905092915050565b60006157fa82613af7565b915061580583613af7565b9250826158155761581461578f565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006158ab602183613a47565b91506158b68261584f565b604082019050919050565b600060208201905081810360008301526158da8161589e565b9050919050565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b600061593d602883613a47565b9150615948826158e1565b604082019050919050565b6000602082019050818103600083015261596c81615930565b905091905056fea2646970667358221220a7ff354863080cc3917046e0ed4ae1a5f9773ce63a4d2c1d7a9810a576785b5464736f6c63430008090033

Deployed Bytecode Sourcemap

54978:8243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56647:8;;;61634:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41710:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43596:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45158:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44679:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39959:108;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56259:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46034:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40631:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55911:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57868:306;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56874:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46275:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40144:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62536:297;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61962:334;;;;;;;;;;;;;:::i;:::-;;43405:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56119:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42146:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4591:94;;;;;;;;;;;;;:::i;:::-;;55580:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63010:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3940:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43765:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45444:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63134:82;;;;;;;;;;;;;:::i;:::-;;61451:109;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59145:709;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59899:271;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46531:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56301:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62878:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56995:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60178:568;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56220:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58233:853;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45803:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60796:215;;;;;;;;;;;;;:::i;:::-;;55773:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4840:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61053:348;;;;;;;;;;;;;:::i;:::-;;61634:87;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61707:6:::1;61699:5;;:14;;;;;;;;;;;;;;;;;;61634:87:::0;:::o;41710:372::-;41812:4;41864:25;41849:40;;;:11;:40;;;;:105;;;;41921:33;41906:48;;;:11;:48;;;;41849:105;:172;;;;41986:35;41971:50;;;:11;:50;;;;41849:172;:225;;;;42038:36;42062:11;42038:23;:36::i;:::-;41849:225;41829:245;;41710:372;;;:::o;43596:100::-;43650:13;43683:5;43676:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43596:100;:::o;45158:214::-;45226:7;45254:16;45262:7;45254;:16::i;:::-;45246:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45340:15;:24;45356:7;45340:24;;;;;;;;;;;;;;;;;;;;;45333:31;;45158:214;;;:::o;44679:413::-;44752:13;44768:24;44784:7;44768:15;:24::i;:::-;44752:40;;44817:5;44811:11;;:2;:11;;;;44803:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44912:5;44896:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;44921:37;44938:5;44945:12;:10;:12::i;:::-;44921:16;:37::i;:::-;44896:62;44874:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;45056:28;45065:2;45069:7;45078:5;45056:8;:28::i;:::-;44741:351;44679:413;;:::o;39959:108::-;40020:7;40047:12;;40040:19;;39959:108;:::o;56259:35::-;;;;:::o;46034:170::-;46168:28;46178:4;46184:2;46188:7;46168:9;:28::i;:::-;46034:170;;;:::o;40631:1007::-;40720:7;40756:16;40766:5;40756:9;:16::i;:::-;40748:5;:24;40740:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;40822:22;40847:13;:11;:13::i;:::-;40822:38;;40871:19;40901:25;41090:9;41085:466;41105:14;41101:1;:18;41085:466;;;41145:31;41179:11;:14;41191:1;41179:14;;;;;;;;;;;41145:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41242:1;41216:28;;:9;:14;;;:28;;;41212:111;;41289:9;:14;;;41269:34;;41212:111;41366:5;41345:26;;:17;:26;;;41341:195;;;41415:5;41400:11;:20;41396:85;;;41456:1;41449:8;;;;;;;;;41396:85;41503:13;;;;;;;41341:195;41126:425;41121:3;;;;;;;41085:466;;;;41574:56;;;;;;;;;;:::i;:::-;;;;;;;;40631:1007;;;;;:::o;55911:50::-;;;;;;;;;;;;;;;;;:::o;57868:306::-;57967:4;57984:12;58034:4;58041;58009:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57999:48;;;;;;57984:63;;58074:92;58147:4;58094:58;;;;;;;;:::i;:::-;;;;;;;;;;;;;58084:69;;;;;;58155:2;58159;58163;58074:92;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58065:101;;:5;;;;;;;;;;;:101;;;58058:108;;;57868:306;;;;;;:::o;56874:109::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56967:8:::1;56949:15;:26;;;;;;;;;;;;:::i;:::-;;56874:109:::0;:::o;46275:185::-;46413:39;46430:4;46436:2;46440:7;46413:39;;;;;;;;;;;;:16;:39::i;:::-;46275:185;;;:::o;40144:187::-;40211:7;40247:13;:11;:13::i;:::-;40239:5;:21;40231:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;40318:5;40311:12;;40144:187;;;:::o;62536:297::-;62577:5;62619:1;62598:17;;:22;62594:232;;;62644:12;62637:19;;;;62594:232;62711:1;62687:20;;:25;62683:143;;;62736:13;62729:20;;;;62683:143;62798:16;62791:23;;62536:297;;:::o;61962:334::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;62027:15:::2;62045:16;:14;:16::i;:::-;62027:34;;62090:1;62080:7;:11;62072:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;62122:12;62137:19;62122:34;;62164:37;55808:42;62193:7;62164:9;:37::i;:::-;62212:46;62230:7;:5;:7::i;:::-;62250;62240;:17;;;;:::i;:::-;62212:9;:46::i;:::-;62016:280;;36308:1:::1;37262:7;:22;;;;61962:334::o:0;43405:124::-;43469:7;43496:20;43508:7;43496:11;:20::i;:::-;:25;;;43489:32;;43405:124;;;:::o;56119:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;42146:221::-;42210:7;42255:1;42238:19;;:5;:19;;;;42230:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;42331:12;:19;42344:5;42331:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;42323:36;;42316:43;;42146:221;;;:::o;4591:94::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4656:21:::1;4674:1;4656:9;:21::i;:::-;4591:94::o:0;55580:23::-;;;;:::o;63010:93::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63088:7:::1;63076:9;:19;;;;63010:93:::0;:::o;3940:87::-;3986:7;4013:6;;;;;;;;;;;4006:13;;3940:87;:::o;43765:104::-;43821:13;43854:7;43847:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43765:104;:::o;45444:288::-;45551:12;:10;:12::i;:::-;45539:24;;:8;:24;;;;45531:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;45652:8;45607:18;:32;45626:12;:10;:12::i;:::-;45607:32;;;;;;;;;;;;;;;:42;45640:8;45607:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;45705:8;45676:48;;45691:12;:10;:12::i;:::-;45676:48;;;45715:8;45676:48;;;;;;:::i;:::-;;;;;;;;45444:288;;:::o;63134:82::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63193:15:::1;63180:10;:28;;;;63134:82::o:0;61451:109::-;61507:4;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61531:21:::1;61524:28;;61451:109:::0;:::o;59145:709::-;36352:1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;59223:16:::1;59242:11;:9;:11::i;:::-;59223:30;;59286:16;59272:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;59264:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;59362:9;59348:23;;:10;:23;;;59340:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;59457:14;;59447:6;59431:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;59423:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;59565:7;;59555:6;59525:15;:27;59541:10;59525:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;59517:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;59658:6;59645:10;:8;:10::i;:::-;:19;;;;:::i;:::-;59632:9;:32;;59624:126;;;;;;;;;;;;:::i;:::-;;;;;;;;;59765:29;59775:10;59787:6;59765:9;:29::i;:::-;59840:6;59809:15;:27;59825:10;59809:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;59212:642;36308:1:::0;37262:7;:22;;;;59145:709;:::o;59899:271::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60019:14:::1;;60009:6;59993:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;59985:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;60083:28;60093:9;60104:6;60083:9;:28::i;:::-;60156:6;60126:15;:26;60142:9;60126:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;59899:271:::0;;:::o;46531:355::-;46690:28;46700:4;46706:2;46710:7;46690:9;:28::i;:::-;46751:48;46774:4;46780:2;46784:7;46793:5;46751:22;:48::i;:::-;46729:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;46531:355;;;;:::o;56301:25::-;;;;:::o;62878:84::-;62918:7;62945:9;;62938:16;;62878:84;:::o;56995:125::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57098:14:::1;57082:13;:30;;;;;;;;;;;;:::i;:::-;;56995:125:::0;:::o;60178:568::-;60252:13;60286:17;60294:8;60286:7;:17::i;:::-;60278:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;60481:1;60467:10;;:15;60463:272;;;60506:13;60499:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60463:272;60571:21;60595:10;:8;:10::i;:::-;60571:34;;60651:1;60633:7;60627:21;:25;:96;;;;;;;;;;;;;;;;;60679:7;60688:19;:8;:17;:19::i;:::-;60662:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;60627:96;60620:103;;;60178:568;;;;:::o;56220:32::-;;;;:::o;58233:853::-;58320:2;58325;58329;57370:41;57391:10;57402:2;57405;57408;57370:20;:41::i;:::-;57361:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1:::1;36950:7;;:19;;36942:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;36352:1;37083:7;:18;;;;58372:16:::2;58391:11;:9;:11::i;:::-;58372:30;;58435:12;58421:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;58413:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;58500:9;58486:23;;:10;:23;;;58478:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;58583:16;58569:30:::0;::::2;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;58561:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;58691:14;;58681:6;58665:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:40;;58657:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;58799:7;;58789:6;58759:15;:27;58775:10;58759:27;;;;;;;;;;;;;;;;:36;;;;:::i;:::-;:47;;58751:96;;;;;;;;;;;;:::i;:::-;;;;;;;;;58892:6;58879:10;:8;:10::i;:::-;:19;;;;:::i;:::-;58866:9;:32;;58858:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;58995:29;59005:10;59017:6;58995:9;:29::i;:::-;59070:6;59039:15;:27;59055:10;59039:27;;;;;;;;;;;;;;;;:37;;;;;;;:::i;:::-;;;;;;;;58361:725;36308:1:::1;37262:7;:22;;;;58233:853:::0;;;;;;;:::o;45803:164::-;45900:4;45924:18;:25;45943:5;45924:25;;;;;;;;;;;;;;;:35;45950:8;45924:35;;;;;;;;;;;;;;;;;;;;;;;;;45917:42;;45803:164;;;;:::o;60796:215::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;60850:16:::1;60869:11;:9;:11::i;:::-;60850:30;;60913:12;60899:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;60891:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;60988:15;60968:17;:35;;;;60839:172;60796:215::o:0;55773:77::-;55808:42;55773:77;:::o;4840:192::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4949:1:::1;4929:22;;:8;:22;;;;4921:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5005:19;5015:8;5005:9;:19::i;:::-;4840:192:::0;:::o;61053:348::-;4171:12;:10;:12::i;:::-;4160:23;;:7;:5;:7::i;:::-;:23;;;4152:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;61111:16:::1;61130:11;:9;:11::i;:::-;61111:30;;61174:16;61160:30:::0;::::1;;;;;;;:::i;:::-;;:10;:30;;;;;;;;:::i;:::-;;;;61152:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;61256:12;61242:26;;;;;;;;:::i;:::-;;:10;:26;;;;;;;;:::i;:::-;;;;61234:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;61378:15;61355:20;:38;;;;61100:301;61053:348::o:0;2728:98::-;2781:7;2808:10;2801:17;;2728:98;:::o;15922:157::-;16007:4;16046:25;16031:40;;;:11;:40;;;;16024:47;;15922:157;;;:::o;47141:111::-;47198:4;47232:12;;47222:7;:22;47215:29;;47141:111;;;:::o;52061:196::-;52203:2;52176:15;:24;52192:7;52176:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;52241:7;52237:2;52221:28;;52230:5;52221:28;;;;;;;;;;;;52061:196;;;:::o;49941:2002::-;50056:35;50094:20;50106:7;50094:11;:20::i;:::-;50056:58;;50127:22;50169:13;:18;;;50153:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;50228:12;:10;:12::i;:::-;50204:36;;:20;50216:7;50204:11;:20::i;:::-;:36;;;50153:87;:154;;;;50257:50;50274:13;:18;;;50294:12;:10;:12::i;:::-;50257:16;:50::i;:::-;50153:154;50127:181;;50329:17;50321:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;50444:4;50422:26;;:13;:18;;;:26;;;50414:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;50524:1;50510:16;;:2;:16;;;;50502:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;50581:43;50603:4;50609:2;50613:7;50622:1;50581:21;:43::i;:::-;50689:49;50706:1;50710:7;50719:13;:18;;;50689:8;:49::i;:::-;51064:1;51034:12;:18;51047:4;51034:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51108:1;51080:12;:16;51093:2;51080:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51154:2;51126:11;:20;51138:7;51126:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;51216:15;51171:11;:20;51183:7;51171:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;51484:19;51516:1;51506:7;:11;51484:33;;51577:1;51536:43;;:11;:24;51548:11;51536:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;51532:295;;;51604:20;51612:11;51604:7;:20::i;:::-;51600:212;;;51681:13;:18;;;51649:11;:24;51661:11;51649:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;51764:13;:28;;;51722:11;:24;51734:11;51722:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;51600:212;51532:295;51009:829;51874:7;51870:2;51855:27;;51864:4;51855:27;;;;;;;;;;;;51893:42;51914:4;51920:2;51924:7;51933:1;51893:20;:42::i;:::-;50045:1898;;49941:2002;;;:::o;62304:183::-;62385:9;62400:7;:12;;62420:6;62400:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62384:47;;;62450:4;62442:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;62373:114;62304:183;;:::o;42806:537::-;42867:21;;:::i;:::-;42909:16;42917:7;42909;:16::i;:::-;42901:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;43015:12;43030:7;43015:22;;43010:245;43047:1;43039:4;:9;43010:245;;43077:31;43111:11;:17;43123:4;43111:17;;;;;;;;;;;43077:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43177:1;43151:28;;:9;:14;;;:28;;;43147:93;;43211:9;43204:16;;;;;;43147:93;43058:197;43050:6;;;;;;;;43010:245;;;;43278:57;;;;;;;;;;:::i;:::-;;;;;;;;42806:537;;;;:::o;5040:173::-;5096:16;5115:6;;;;;;;;;;;5096:25;;5141:8;5132:6;;:17;;;;;;;;;;;;;;;;;;5196:8;5165:40;;5186:8;5165:40;;;;;;;;;;;;5085:128;5040:173;:::o;47260:104::-;47329:27;47339:2;47343:8;47329:27;;;;;;;;;;;;:9;:27::i;:::-;47260:104;;:::o;52822:804::-;52977:4;52998:15;:2;:13;;;:15::i;:::-;52994:625;;;53050:2;53034:36;;;53071:12;:10;:12::i;:::-;53085:4;53091:7;53100:5;53034:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;53030:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53297:1;53280:6;:13;:18;53276:273;;;53323:61;;;;;;;;;;:::i;:::-;;;;;;;;53276:273;53499:6;53493:13;53484:6;53480:2;53476:15;53469:38;53030:534;53167:45;;;53157:55;;;:6;:55;;;;53150:62;;;;;52994:625;53603:4;53596:11;;52822:804;;;;;;;:::o;56700:116::-;56760:13;56793:15;56786:22;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56700:116;:::o;344:723::-;400:13;630:1;621:5;:10;617:53;;;648:10;;;;;;;;;;;;;;;;;;;;;617:53;680:12;695:5;680:20;;711:14;736:78;751:1;743:4;:9;736:78;;769:8;;;;;:::i;:::-;;;;800:2;792:10;;;;;:::i;:::-;;;736:78;;;824:19;856:6;846:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;824:39;;874:154;890:1;881:5;:10;874:154;;918:1;908:11;;;;;:::i;:::-;;;985:2;977:5;:10;;;;:::i;:::-;964:2;:24;;;;:::i;:::-;951:39;;934:6;941;934:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1014:2;1005:11;;;;;:::i;:::-;;;874:154;;;1052:6;1038:21;;;;;344:723;;;;:::o;54114:159::-;;;;;:::o;54685:158::-;;;;;:::o;47727:163::-;47850:32;47856:2;47860:8;47870:5;47877:4;47850:5;:32::i;:::-;47727:163;;;:::o;5986:387::-;6046:4;6254:12;6321:7;6309:20;6301:28;;6364:1;6357:4;:8;6350:15;;;5986:387;;;:::o;48149:1538::-;48288:20;48311:12;;48288:35;;48356:1;48342:16;;:2;:16;;;;48334:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48427:1;48415:8;:13;;48407:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48486:61;48516:1;48520:2;48524:12;48538:8;48486:21;:61::i;:::-;48861:8;48825:12;:16;48838:2;48825:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48926:8;48885:12;:16;48898:2;48885:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48985:2;48952:11;:25;48964:12;48952:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;49052:15;49002:11;:25;49014:12;49002:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;49085:20;49108:12;49085:35;;49142:9;49137:415;49157:8;49153:1;:12;49137:415;;;49221:12;49217:2;49196:38;;49213:1;49196:38;;;;;;;;;;;;49257:4;49253:249;;;49320:59;49351:1;49355:2;49359:12;49373:5;49320:22;:59::i;:::-;49286:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;49253:249;49522:14;;;;;;;49167:3;;;;;;;49137:415;;;;49583:12;49568;:27;;;;48800:807;49619:60;49648:1;49652:2;49656:12;49670:8;49619:20;:60::i;:::-;48277:1410;48149:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::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:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:329::-;900:6;949:2;937:9;928:7;924:23;920:32;917:119;;;955:79;;:::i;:::-;917:119;1075:1;1100:53;1145:7;1136:6;1125:9;1121:22;1100:53;:::i;:::-;1090:63;;1046:117;841:329;;;;:::o;1176:149::-;1212:7;1252:66;1245:5;1241:78;1230:89;;1176:149;;;:::o;1331:120::-;1403:23;1420:5;1403:23;:::i;:::-;1396:5;1393:34;1383:62;;1441:1;1438;1431:12;1383:62;1331:120;:::o;1457:137::-;1502:5;1540:6;1527:20;1518:29;;1556:32;1582:5;1556:32;:::i;:::-;1457:137;;;;:::o;1600:327::-;1658:6;1707:2;1695:9;1686:7;1682:23;1678:32;1675:119;;;1713:79;;:::i;:::-;1675:119;1833:1;1858:52;1902:7;1893:6;1882:9;1878:22;1858:52;:::i;:::-;1848:62;;1804:116;1600:327;;;;:::o;1933:90::-;1967:7;2010:5;2003:13;1996:21;1985:32;;1933:90;;;:::o;2029:109::-;2110:21;2125:5;2110:21;:::i;:::-;2105:3;2098:34;2029:109;;:::o;2144:210::-;2231:4;2269:2;2258:9;2254:18;2246:26;;2282:65;2344:1;2333:9;2329:17;2320:6;2282:65;:::i;:::-;2144:210;;;;:::o;2360:99::-;2412:6;2446:5;2440:12;2430:22;;2360:99;;;:::o;2465:169::-;2549:11;2583:6;2578:3;2571:19;2623:4;2618:3;2614:14;2599:29;;2465:169;;;;:::o;2640:307::-;2708:1;2718:113;2732:6;2729:1;2726:13;2718:113;;;2817:1;2812:3;2808:11;2802:18;2798:1;2793:3;2789:11;2782:39;2754:2;2751:1;2747:10;2742:15;;2718:113;;;2849:6;2846:1;2843:13;2840:101;;;2929:1;2920:6;2915:3;2911:16;2904:27;2840:101;2689:258;2640:307;;;:::o;2953:102::-;2994:6;3045:2;3041:7;3036:2;3029:5;3025:14;3021:28;3011:38;;2953:102;;;:::o;3061:364::-;3149:3;3177:39;3210:5;3177:39;:::i;:::-;3232:71;3296:6;3291:3;3232:71;:::i;:::-;3225:78;;3312:52;3357:6;3352:3;3345:4;3338:5;3334:16;3312:52;:::i;:::-;3389:29;3411:6;3389:29;:::i;:::-;3384:3;3380:39;3373:46;;3153:272;3061:364;;;;:::o;3431:313::-;3544:4;3582:2;3571:9;3567:18;3559:26;;3631:9;3625:4;3621:20;3617:1;3606:9;3602:17;3595:47;3659:78;3732:4;3723:6;3659:78;:::i;:::-;3651:86;;3431:313;;;;:::o;3750:77::-;3787:7;3816:5;3805:16;;3750:77;;;:::o;3833:122::-;3906:24;3924:5;3906:24;:::i;:::-;3899:5;3896:35;3886:63;;3945:1;3942;3935:12;3886:63;3833:122;:::o;3961:139::-;4007:5;4045:6;4032:20;4023:29;;4061:33;4088:5;4061:33;:::i;:::-;3961:139;;;;:::o;4106:329::-;4165:6;4214:2;4202:9;4193:7;4189:23;4185:32;4182:119;;;4220:79;;:::i;:::-;4182:119;4340:1;4365:53;4410:7;4401:6;4390:9;4386:22;4365:53;:::i;:::-;4355:63;;4311:117;4106:329;;;;:::o;4441:118::-;4528:24;4546:5;4528:24;:::i;:::-;4523:3;4516:37;4441:118;;:::o;4565:222::-;4658:4;4696:2;4685:9;4681:18;4673:26;;4709:71;4777:1;4766:9;4762:17;4753:6;4709:71;:::i;:::-;4565:222;;;;:::o;4793:474::-;4861:6;4869;4918:2;4906:9;4897:7;4893:23;4889:32;4886:119;;;4924:79;;:::i;:::-;4886:119;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4793:474;;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:86::-;6285:7;6325:4;6318:5;6314:16;6303:27;;6250:86;;;:::o;6342:118::-;6413:22;6429:5;6413:22;:::i;:::-;6406:5;6403:33;6393:61;;6450:1;6447;6440:12;6393:61;6342:118;:::o;6466:135::-;6510:5;6548:6;6535:20;6526:29;;6564:31;6589:5;6564:31;:::i;:::-;6466:135;;;;:::o;6607:77::-;6644:7;6673:5;6662:16;;6607:77;;;:::o;6690:122::-;6763:24;6781:5;6763:24;:::i;:::-;6756:5;6753:35;6743:63;;6802:1;6799;6792:12;6743:63;6690:122;:::o;6818:139::-;6864:5;6902:6;6889:20;6880:29;;6918:33;6945:5;6918:33;:::i;:::-;6818:139;;;;:::o;6963:761::-;7047:6;7055;7063;7071;7120:3;7108:9;7099:7;7095:23;7091:33;7088:120;;;7127:79;;:::i;:::-;7088:120;7247:1;7272:53;7317:7;7308:6;7297:9;7293:22;7272:53;:::i;:::-;7262:63;;7218:117;7374:2;7400:51;7443:7;7434:6;7423:9;7419:22;7400:51;:::i;:::-;7390:61;;7345:116;7500:2;7526:53;7571:7;7562:6;7551:9;7547:22;7526:53;:::i;:::-;7516:63;;7471:118;7628:2;7654:53;7699:7;7690:6;7679:9;7675:22;7654:53;:::i;:::-;7644:63;;7599:118;6963:761;;;;;;;:::o;7730:117::-;7839:1;7836;7829:12;7853:117;7962:1;7959;7952:12;7976:180;8024:77;8021:1;8014:88;8121:4;8118:1;8111:15;8145:4;8142:1;8135:15;8162:281;8245:27;8267:4;8245:27;:::i;:::-;8237:6;8233:40;8375:6;8363:10;8360:22;8339:18;8327:10;8324:34;8321:62;8318:88;;;8386:18;;:::i;:::-;8318:88;8426:10;8422:2;8415:22;8205:238;8162:281;;:::o;8449:129::-;8483:6;8510:20;;:::i;:::-;8500:30;;8539:33;8567:4;8559:6;8539:33;:::i;:::-;8449:129;;;:::o;8584:308::-;8646:4;8736:18;8728:6;8725:30;8722:56;;;8758:18;;:::i;:::-;8722:56;8796:29;8818:6;8796:29;:::i;:::-;8788:37;;8880:4;8874;8870:15;8862:23;;8584:308;;;:::o;8898:154::-;8982:6;8977:3;8972;8959:30;9044:1;9035:6;9030:3;9026:16;9019:27;8898:154;;;:::o;9058:412::-;9136:5;9161:66;9177:49;9219:6;9177:49;:::i;:::-;9161:66;:::i;:::-;9152:75;;9250:6;9243:5;9236:21;9288:4;9281:5;9277:16;9326:3;9317:6;9312:3;9308:16;9305:25;9302:112;;;9333:79;;:::i;:::-;9302:112;9423:41;9457:6;9452:3;9447;9423:41;:::i;:::-;9142:328;9058:412;;;;;:::o;9490:340::-;9546:5;9595:3;9588:4;9580:6;9576:17;9572:27;9562:122;;9603:79;;:::i;:::-;9562:122;9720:6;9707:20;9745:79;9820:3;9812:6;9805:4;9797:6;9793:17;9745:79;:::i;:::-;9736:88;;9552:278;9490:340;;;;:::o;9836:509::-;9905:6;9954:2;9942:9;9933:7;9929:23;9925:32;9922:119;;;9960:79;;:::i;:::-;9922:119;10108:1;10097:9;10093:17;10080:31;10138:18;10130:6;10127:30;10124:117;;;10160:79;;:::i;:::-;10124:117;10265:63;10320:7;10311:6;10300:9;10296:22;10265:63;:::i;:::-;10255:73;;10051:287;9836:509;;;;:::o;10351:180::-;10399:77;10396:1;10389:88;10496:4;10493:1;10486:15;10520:4;10517:1;10510:15;10537:115;10620:1;10613:5;10610:12;10600:46;;10626:18;;:::i;:::-;10600:46;10537:115;:::o;10658:131::-;10705:7;10734:5;10723:16;;10740:43;10777:5;10740:43;:::i;:::-;10658:131;;;:::o;10795:::-;10853:9;10886:34;10914:5;10886:34;:::i;:::-;10873:47;;10795:131;;;:::o;10932:147::-;11027:45;11066:5;11027:45;:::i;:::-;11022:3;11015:58;10932:147;;:::o;11085:238::-;11186:4;11224:2;11213:9;11209:18;11201:26;;11237:79;11313:1;11302:9;11298:17;11289:6;11237:79;:::i;:::-;11085:238;;;;:::o;11329:116::-;11399:21;11414:5;11399:21;:::i;:::-;11392:5;11389:32;11379:60;;11435:1;11432;11425:12;11379:60;11329:116;:::o;11451:133::-;11494:5;11532:6;11519:20;11510:29;;11548:30;11572:5;11548:30;:::i;:::-;11451:133;;;;:::o;11590:468::-;11655:6;11663;11712:2;11700:9;11691:7;11687:23;11683:32;11680:119;;;11718:79;;:::i;:::-;11680:119;11838:1;11863:53;11908:7;11899:6;11888:9;11884:22;11863:53;:::i;:::-;11853:63;;11809:117;11965:2;11991:50;12033:7;12024:6;12013:9;12009:22;11991:50;:::i;:::-;11981:60;;11936:115;11590:468;;;;;:::o;12064:474::-;12132:6;12140;12189:2;12177:9;12168:7;12164:23;12160:32;12157:119;;;12195:79;;:::i;:::-;12157:119;12315:1;12340:53;12385:7;12376:6;12365:9;12361:22;12340:53;:::i;:::-;12330:63;;12286:117;12442:2;12468:53;12513:7;12504:6;12493:9;12489:22;12468:53;:::i;:::-;12458:63;;12413:118;12064:474;;;;;:::o;12544:307::-;12605:4;12695:18;12687:6;12684:30;12681:56;;;12717:18;;:::i;:::-;12681:56;12755:29;12777:6;12755:29;:::i;:::-;12747:37;;12839:4;12833;12829:15;12821:23;;12544:307;;;:::o;12857:410::-;12934:5;12959:65;12975:48;13016:6;12975:48;:::i;:::-;12959:65;:::i;:::-;12950:74;;13047:6;13040:5;13033:21;13085:4;13078:5;13074:16;13123:3;13114:6;13109:3;13105:16;13102:25;13099:112;;;13130:79;;:::i;:::-;13099:112;13220:41;13254:6;13249:3;13244;13220:41;:::i;:::-;12940:327;12857:410;;;;;:::o;13286:338::-;13341:5;13390:3;13383:4;13375:6;13371:17;13367:27;13357:122;;13398:79;;:::i;:::-;13357:122;13515:6;13502:20;13540:78;13614:3;13606:6;13599:4;13591:6;13587:17;13540:78;:::i;:::-;13531:87;;13347:277;13286:338;;;;:::o;13630:943::-;13725:6;13733;13741;13749;13798:3;13786:9;13777:7;13773:23;13769:33;13766:120;;;13805:79;;:::i;:::-;13766:120;13925:1;13950:53;13995:7;13986:6;13975:9;13971:22;13950:53;:::i;:::-;13940:63;;13896:117;14052:2;14078:53;14123:7;14114:6;14103:9;14099:22;14078:53;:::i;:::-;14068:63;;14023:118;14180:2;14206:53;14251:7;14242:6;14231:9;14227:22;14206:53;:::i;:::-;14196:63;;14151:118;14336:2;14325:9;14321:18;14308:32;14367:18;14359:6;14356:30;14353:117;;;14389:79;;:::i;:::-;14353:117;14494:62;14548:7;14539:6;14528:9;14524:22;14494:62;:::i;:::-;14484:72;;14279:287;13630:943;;;;;;;:::o;14579:761::-;14663:6;14671;14679;14687;14736:3;14724:9;14715:7;14711:23;14707:33;14704:120;;;14743:79;;:::i;:::-;14704:120;14863:1;14888:53;14933:7;14924:6;14913:9;14909:22;14888:53;:::i;:::-;14878:63;;14834:117;14990:2;15016:51;15059:7;15050:6;15039:9;15035:22;15016:51;:::i;:::-;15006:61;;14961:116;15116:2;15142:53;15187:7;15178:6;15167:9;15163:22;15142:53;:::i;:::-;15132:63;;15087:118;15244:2;15270:53;15315:7;15306:6;15295:9;15291:22;15270:53;:::i;:::-;15260:63;;15215:118;14579:761;;;;;;;:::o;15346:474::-;15414:6;15422;15471:2;15459:9;15450:7;15446:23;15442:32;15439:119;;;15477:79;;:::i;:::-;15439:119;15597:1;15622:53;15667:7;15658:6;15647:9;15643:22;15622:53;:::i;:::-;15612:63;;15568:117;15724:2;15750:53;15795:7;15786:6;15775:9;15771:22;15750:53;:::i;:::-;15740:63;;15695:118;15346:474;;;;;:::o;15826:182::-;15966:34;15962:1;15954:6;15950:14;15943:58;15826:182;:::o;16014:366::-;16156:3;16177:67;16241:2;16236:3;16177:67;:::i;:::-;16170:74;;16253:93;16342:3;16253:93;:::i;:::-;16371:2;16366:3;16362:12;16355:19;;16014:366;;;:::o;16386:419::-;16552:4;16590:2;16579:9;16575:18;16567:26;;16639:9;16633:4;16629:20;16625:1;16614:9;16610:17;16603:47;16667:131;16793:4;16667:131;:::i;:::-;16659:139;;16386:419;;;:::o;16811:180::-;16859:77;16856:1;16849:88;16956:4;16953:1;16946:15;16980:4;16977:1;16970:15;16997:320;17041:6;17078:1;17072:4;17068:12;17058:22;;17125:1;17119:4;17115:12;17146:18;17136:81;;17202:4;17194:6;17190:17;17180:27;;17136:81;17264:2;17256:6;17253:14;17233:18;17230:38;17227:84;;;17283:18;;:::i;:::-;17227:84;17048:269;16997:320;;;:::o;17323:232::-;17463:34;17459:1;17451:6;17447:14;17440:58;17532:15;17527:2;17519:6;17515:15;17508:40;17323:232;:::o;17561:366::-;17703:3;17724:67;17788:2;17783:3;17724:67;:::i;:::-;17717:74;;17800:93;17889:3;17800:93;:::i;:::-;17918:2;17913:3;17909:12;17902:19;;17561:366;;;:::o;17933:419::-;18099:4;18137:2;18126:9;18122:18;18114:26;;18186:9;18180:4;18176:20;18172:1;18161:9;18157:17;18150:47;18214:131;18340:4;18214:131;:::i;:::-;18206:139;;17933:419;;;:::o;18358:221::-;18498:34;18494:1;18486:6;18482:14;18475:58;18567:4;18562:2;18554:6;18550:15;18543:29;18358:221;:::o;18585:366::-;18727:3;18748:67;18812:2;18807:3;18748:67;:::i;:::-;18741:74;;18824:93;18913:3;18824:93;:::i;:::-;18942:2;18937:3;18933:12;18926:19;;18585:366;;;:::o;18957:419::-;19123:4;19161:2;19150:9;19146:18;19138:26;;19210:9;19204:4;19200:20;19196:1;19185:9;19181:17;19174:47;19238:131;19364:4;19238:131;:::i;:::-;19230:139;;18957:419;;;:::o;19382:244::-;19522:34;19518:1;19510:6;19506:14;19499:58;19591:27;19586:2;19578:6;19574:15;19567:52;19382:244;:::o;19632:366::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19632:366;;;:::o;20004:419::-;20170:4;20208:2;20197:9;20193:18;20185:26;;20257:9;20251:4;20247:20;20243:1;20232:9;20228:17;20221:47;20285:131;20411:4;20285:131;:::i;:::-;20277:139;;20004:419;;;:::o;20429:221::-;20569:34;20565:1;20557:6;20553:14;20546:58;20638:4;20633:2;20625:6;20621:15;20614:29;20429:221;:::o;20656:366::-;20798:3;20819:67;20883:2;20878:3;20819:67;:::i;:::-;20812:74;;20895:93;20984:3;20895:93;:::i;:::-;21013:2;21008:3;21004:12;20997:19;;20656:366;;;:::o;21028:419::-;21194:4;21232:2;21221:9;21217:18;21209:26;;21281:9;21275:4;21271:20;21267:1;21256:9;21252:17;21245:47;21309:131;21435:4;21309:131;:::i;:::-;21301:139;;21028:419;;;:::o;21453:233::-;21593:34;21589:1;21581:6;21577:14;21570:58;21662:16;21657:2;21649:6;21645:15;21638:41;21453:233;:::o;21692:366::-;21834:3;21855:67;21919:2;21914:3;21855:67;:::i;:::-;21848:74;;21931:93;22020:3;21931:93;:::i;:::-;22049:2;22044:3;22040:12;22033:19;;21692:366;;;:::o;22064:419::-;22230:4;22268:2;22257:9;22253:18;22245:26;;22317:9;22311:4;22307:20;22303:1;22292:9;22288:17;22281:47;22345:131;22471:4;22345:131;:::i;:::-;22337:139;;22064:419;;;:::o;22489:94::-;22522:8;22570:5;22566:2;22562:14;22541:35;;22489:94;;;:::o;22589:::-;22628:7;22657:20;22671:5;22657:20;:::i;:::-;22646:31;;22589:94;;;:::o;22689:100::-;22728:7;22757:26;22777:5;22757:26;:::i;:::-;22746:37;;22689:100;;;:::o;22795:157::-;22900:45;22920:24;22938:5;22920:24;:::i;:::-;22900:45;:::i;:::-;22895:3;22888:58;22795:157;;:::o;22958:397::-;23098:3;23113:75;23184:3;23175:6;23113:75;:::i;:::-;23213:2;23208:3;23204:12;23197:19;;23226:75;23297:3;23288:6;23226:75;:::i;:::-;23326:2;23321:3;23317:12;23310:19;;23346:3;23339:10;;22958:397;;;;;:::o;23361:148::-;23463:11;23500:3;23485:18;;23361:148;;;;:::o;23515:214::-;23655:66;23651:1;23643:6;23639:14;23632:90;23515:214;:::o;23735:402::-;23895:3;23916:85;23998:2;23993:3;23916:85;:::i;:::-;23909:92;;24010:93;24099:3;24010:93;:::i;:::-;24128:2;24123:3;24119:12;24112:19;;23735:402;;;:::o;24143:79::-;24182:7;24211:5;24200:16;;24143:79;;;:::o;24228:157::-;24333:45;24353:24;24371:5;24353:24;:::i;:::-;24333:45;:::i;:::-;24328:3;24321:58;24228:157;;:::o;24391:522::-;24604:3;24626:148;24770:3;24626:148;:::i;:::-;24619:155;;24784:75;24855:3;24846:6;24784:75;:::i;:::-;24884:2;24879:3;24875:12;24868:19;;24904:3;24897:10;;24391:522;;;;:::o;24919:118::-;25006:24;25024:5;25006:24;:::i;:::-;25001:3;24994:37;24919:118;;:::o;25043:112::-;25126:22;25142:5;25126:22;:::i;:::-;25121:3;25114:35;25043:112;;:::o;25161:545::-;25334:4;25372:3;25361:9;25357:19;25349:27;;25386:71;25454:1;25443:9;25439:17;25430:6;25386:71;:::i;:::-;25467:68;25531:2;25520:9;25516:18;25507:6;25467:68;:::i;:::-;25545:72;25613:2;25602:9;25598:18;25589:6;25545:72;:::i;:::-;25627;25695:2;25684:9;25680:18;25671:6;25627:72;:::i;:::-;25161:545;;;;;;;:::o;25712:222::-;25852:34;25848:1;25840:6;25836:14;25829:58;25921:5;25916:2;25908:6;25904:15;25897:30;25712:222;:::o;25940:366::-;26082:3;26103:67;26167:2;26162:3;26103:67;:::i;:::-;26096:74;;26179:93;26268:3;26179:93;:::i;:::-;26297:2;26292:3;26288:12;26281:19;;25940:366;;;:::o;26312:419::-;26478:4;26516:2;26505:9;26501:18;26493:26;;26565:9;26559:4;26555:20;26551:1;26540:9;26536:17;26529:47;26593:131;26719:4;26593:131;:::i;:::-;26585:139;;26312:419;;;:::o;26737:181::-;26877:33;26873:1;26865:6;26861:14;26854:57;26737:181;:::o;26924:366::-;27066:3;27087:67;27151:2;27146:3;27087:67;:::i;:::-;27080:74;;27163:93;27252:3;27163:93;:::i;:::-;27281:2;27276:3;27272:12;27265:19;;26924:366;;;:::o;27296:419::-;27462:4;27500:2;27489:9;27485:18;27477:26;;27549:9;27543:4;27539:20;27535:1;27524:9;27520:17;27513:47;27577:131;27703:4;27577:131;:::i;:::-;27569:139;;27296:419;;;:::o;27721:171::-;27861:23;27857:1;27849:6;27845:14;27838:47;27721:171;:::o;27898:366::-;28040:3;28061:67;28125:2;28120:3;28061:67;:::i;:::-;28054:74;;28137:93;28226:3;28137:93;:::i;:::-;28255:2;28250:3;28246:12;28239:19;;27898:366;;;:::o;28270:419::-;28436:4;28474:2;28463:9;28459:18;28451:26;;28523:9;28517:4;28513:20;28509:1;28498:9;28494:17;28487:47;28551:131;28677:4;28551:131;:::i;:::-;28543:139;;28270:419;;;:::o;28695:180::-;28743:77;28740:1;28733:88;28840:4;28837:1;28830:15;28864:4;28861:1;28854:15;28881:191;28921:4;28941:20;28959:1;28941:20;:::i;:::-;28936:25;;28975:20;28993:1;28975:20;:::i;:::-;28970:25;;29014:1;29011;29008:8;29005:34;;;29019:18;;:::i;:::-;29005:34;29064:1;29061;29057:9;29049:17;;28881:191;;;;:::o;29078:230::-;29218:34;29214:1;29206:6;29202:14;29195:58;29287:13;29282:2;29274:6;29270:15;29263:38;29078:230;:::o;29314:366::-;29456:3;29477:67;29541:2;29536:3;29477:67;:::i;:::-;29470:74;;29553:93;29642:3;29553:93;:::i;:::-;29671:2;29666:3;29662:12;29655:19;;29314:366;;;:::o;29686:419::-;29852:4;29890:2;29879:9;29875:18;29867:26;;29939:9;29933:4;29929:20;29925:1;29914:9;29910:17;29903:47;29967:131;30093:4;29967:131;:::i;:::-;29959:139;;29686:419;;;:::o;30111:176::-;30251:28;30247:1;30239:6;30235:14;30228:52;30111:176;:::o;30293:366::-;30435:3;30456:67;30520:2;30515:3;30456:67;:::i;:::-;30449:74;;30532:93;30621:3;30532:93;:::i;:::-;30650:2;30645:3;30641:12;30634:19;;30293:366;;;:::o;30665:419::-;30831:4;30869:2;30858:9;30854:18;30846:26;;30918:9;30912:4;30908:20;30904:1;30893:9;30889:17;30882:47;30946:131;31072:4;30946:131;:::i;:::-;30938:139;;30665:419;;;:::o;31090:178::-;31230:30;31226:1;31218:6;31214:14;31207:54;31090:178;:::o;31274:366::-;31416:3;31437:67;31501:2;31496:3;31437:67;:::i;:::-;31430:74;;31513:93;31602:3;31513:93;:::i;:::-;31631:2;31626:3;31622:12;31615:19;;31274:366;;;:::o;31646:419::-;31812:4;31850:2;31839:9;31835:18;31827:26;;31899:9;31893:4;31889:20;31885:1;31874:9;31870:17;31863:47;31927:131;32053:4;31927:131;:::i;:::-;31919:139;;31646:419;;;:::o;32071:223::-;32211:34;32207:1;32199:6;32195:14;32188:58;32280:6;32275:2;32267:6;32263:15;32256:31;32071:223;:::o;32300:366::-;32442:3;32463:67;32527:2;32522:3;32463:67;:::i;:::-;32456:74;;32539:93;32628:3;32539:93;:::i;:::-;32657:2;32652:3;32648:12;32641:19;;32300:366;;;:::o;32672:419::-;32838:4;32876:2;32865:9;32861:18;32853:26;;32925:9;32919:4;32915:20;32911:1;32900:9;32896:17;32889:47;32953:131;33079:4;32953:131;:::i;:::-;32945:139;;32672:419;;;:::o;33097:305::-;33137:3;33156:20;33174:1;33156:20;:::i;:::-;33151:25;;33190:20;33208:1;33190:20;:::i;:::-;33185:25;;33344:1;33276:66;33272:74;33269:1;33266:81;33263:107;;;33350:18;;:::i;:::-;33263:107;33394:1;33391;33387:9;33380:16;;33097:305;;;;:::o;33408:180::-;33548:32;33544:1;33536:6;33532:14;33525:56;33408:180;:::o;33594:366::-;33736:3;33757:67;33821:2;33816:3;33757:67;:::i;:::-;33750:74;;33833:93;33922:3;33833:93;:::i;:::-;33951:2;33946:3;33942:12;33935:19;;33594:366;;;:::o;33966:419::-;34132:4;34170:2;34159:9;34155:18;34147:26;;34219:9;34213:4;34209:20;34205:1;34194:9;34190:17;34183:47;34247:131;34373:4;34247:131;:::i;:::-;34239:139;;33966:419;;;:::o;34391:223::-;34531:34;34527:1;34519:6;34515:14;34508:58;34600:6;34595:2;34587:6;34583:15;34576:31;34391:223;:::o;34620:366::-;34762:3;34783:67;34847:2;34842:3;34783:67;:::i;:::-;34776:74;;34859:93;34948:3;34859:93;:::i;:::-;34977:2;34972:3;34968:12;34961:19;;34620:366;;;:::o;34992:419::-;35158:4;35196:2;35185:9;35181:18;35173:26;;35245:9;35239:4;35235:20;35231:1;35220:9;35216:17;35209:47;35273:131;35399:4;35273:131;:::i;:::-;35265:139;;34992:419;;;:::o;35417:348::-;35457:7;35480:20;35498:1;35480:20;:::i;:::-;35475:25;;35514:20;35532:1;35514:20;:::i;:::-;35509:25;;35702:1;35634:66;35630:74;35627:1;35624:81;35619:1;35612:9;35605:17;35601:105;35598:131;;;35709:18;;:::i;:::-;35598:131;35757:1;35754;35750:9;35739:20;;35417:348;;;;:::o;35771:305::-;35911:34;35907:1;35899:6;35895:14;35888:58;35980:34;35975:2;35967:6;35963:15;35956:59;36049:19;36044:2;36036:6;36032:15;36025:44;35771:305;:::o;36082:366::-;36224:3;36245:67;36309:2;36304:3;36245:67;:::i;:::-;36238:74;;36321:93;36410:3;36321:93;:::i;:::-;36439:2;36434:3;36430:12;36423:19;;36082:366;;;:::o;36454:419::-;36620:4;36658:2;36647:9;36643:18;36635:26;;36707:9;36701:4;36697:20;36693:1;36682:9;36678:17;36671:47;36735:131;36861:4;36735:131;:::i;:::-;36727:139;;36454:419;;;:::o;36879:238::-;37019:34;37015:1;37007:6;37003:14;36996:58;37088:21;37083:2;37075:6;37071:15;37064:46;36879:238;:::o;37123:366::-;37265:3;37286:67;37350:2;37345:3;37286:67;:::i;:::-;37279:74;;37362:93;37451:3;37362:93;:::i;:::-;37480:2;37475:3;37471:12;37464:19;;37123:366;;;:::o;37495:419::-;37661:4;37699:2;37688:9;37684:18;37676:26;;37748:9;37742:4;37738:20;37734:1;37723:9;37719:17;37712:47;37776:131;37902:4;37776:131;:::i;:::-;37768:139;;37495:419;;;:::o;37920:234::-;38060:34;38056:1;38048:6;38044:14;38037:58;38129:17;38124:2;38116:6;38112:15;38105:42;37920:234;:::o;38160:366::-;38302:3;38323:67;38387:2;38382:3;38323:67;:::i;:::-;38316:74;;38399:93;38488:3;38399:93;:::i;:::-;38517:2;38512:3;38508:12;38501:19;;38160:366;;;:::o;38532:419::-;38698:4;38736:2;38725:9;38721:18;38713:26;;38785:9;38779:4;38775:20;38771:1;38760:9;38756:17;38749:47;38813:131;38939:4;38813:131;:::i;:::-;38805:139;;38532:419;;;:::o;38957:377::-;39063:3;39091:39;39124:5;39091:39;:::i;:::-;39146:89;39228:6;39223:3;39146:89;:::i;:::-;39139:96;;39244:52;39289:6;39284:3;39277:4;39270:5;39266:16;39244:52;:::i;:::-;39321:6;39316:3;39312:16;39305:23;;39067:267;38957:377;;;;:::o;39340:155::-;39480:7;39476:1;39468:6;39464:14;39457:31;39340:155;:::o;39501:400::-;39661:3;39682:84;39764:1;39759:3;39682:84;:::i;:::-;39675:91;;39775:93;39864:3;39775:93;:::i;:::-;39893:1;39888:3;39884:11;39877:18;;39501:400;;;:::o;39907:701::-;40188:3;40210:95;40301:3;40292:6;40210:95;:::i;:::-;40203:102;;40322:95;40413:3;40404:6;40322:95;:::i;:::-;40315:102;;40434:148;40578:3;40434:148;:::i;:::-;40427:155;;40599:3;40592:10;;39907:701;;;;;:::o;40614:167::-;40754:19;40750:1;40742:6;40738:14;40731:43;40614:167;:::o;40787:366::-;40929:3;40950:67;41014:2;41009:3;40950:67;:::i;:::-;40943:74;;41026:93;41115:3;41026:93;:::i;:::-;41144:2;41139:3;41135:12;41128:19;;40787:366;;;:::o;41159:419::-;41325:4;41363:2;41352:9;41348:18;41340:26;;41412:9;41406:4;41402:20;41398:1;41387:9;41383:17;41376:47;41440:131;41566:4;41440:131;:::i;:::-;41432:139;;41159:419;;;:::o;41584:171::-;41724:23;41720:1;41712:6;41708:14;41701:47;41584:171;:::o;41761:366::-;41903:3;41924:67;41988:2;41983:3;41924:67;:::i;:::-;41917:74;;42000:93;42089:3;42000:93;:::i;:::-;42118:2;42113:3;42109:12;42102:19;;41761:366;;;:::o;42133:419::-;42299:4;42337:2;42326:9;42322:18;42314:26;;42386:9;42380:4;42376:20;42372:1;42361:9;42357:17;42350:47;42414:131;42540:4;42414:131;:::i;:::-;42406:139;;42133:419;;;:::o;42558:229::-;42698:34;42694:1;42686:6;42682:14;42675:58;42767:12;42762:2;42754:6;42750:15;42743:37;42558:229;:::o;42793:366::-;42935:3;42956:67;43020:2;43015:3;42956:67;:::i;:::-;42949:74;;43032:93;43121:3;43032:93;:::i;:::-;43150:2;43145:3;43141:12;43134:19;;42793:366;;;:::o;43165:419::-;43331:4;43369:2;43358:9;43354:18;43346:26;;43418:9;43412:4;43408:20;43404:1;43393:9;43389:17;43382:47;43446:131;43572:4;43446:131;:::i;:::-;43438:139;;43165:419;;;:::o;43590:301::-;43730:34;43726:1;43718:6;43714:14;43707:58;43799:34;43794:2;43786:6;43782:15;43775:59;43868:15;43863:2;43855:6;43851:15;43844:40;43590:301;:::o;43897:366::-;44039:3;44060:67;44124:2;44119:3;44060:67;:::i;:::-;44053:74;;44136:93;44225:3;44136:93;:::i;:::-;44254:2;44249:3;44245:12;44238:19;;43897:366;;;:::o;44269:419::-;44435:4;44473:2;44462:9;44458:18;44450:26;;44522:9;44516:4;44512:20;44508:1;44497:9;44493:17;44486:47;44550:131;44676:4;44550:131;:::i;:::-;44542:139;;44269:419;;;:::o;44694:177::-;44834:29;44830:1;44822:6;44818:14;44811:53;44694:177;:::o;44877:366::-;45019:3;45040:67;45104:2;45099:3;45040:67;:::i;:::-;45033:74;;45116:93;45205:3;45116:93;:::i;:::-;45234:2;45229:3;45225:12;45218:19;;44877:366;;;:::o;45249:419::-;45415:4;45453:2;45442:9;45438:18;45430:26;;45502:9;45496:4;45492:20;45488:1;45477:9;45473:17;45466:47;45530:131;45656:4;45530:131;:::i;:::-;45522:139;;45249:419;;;:::o;45674:225::-;45814:34;45810:1;45802:6;45798:14;45791:58;45883:8;45878:2;45870:6;45866:15;45859:33;45674:225;:::o;45905:366::-;46047:3;46068:67;46132:2;46127:3;46068:67;:::i;:::-;46061:74;;46144:93;46233:3;46144:93;:::i;:::-;46262:2;46257:3;46253:12;46246:19;;45905:366;;;:::o;46277:419::-;46443:4;46481:2;46470:9;46466:18;46458:26;;46530:9;46524:4;46520:20;46516:1;46505:9;46501:17;46494:47;46558:131;46684:4;46558:131;:::i;:::-;46550:139;;46277:419;;;:::o;46702:178::-;46842:30;46838:1;46830:6;46826:14;46819:54;46702:178;:::o;46886:366::-;47028:3;47049:67;47113:2;47108:3;47049:67;:::i;:::-;47042:74;;47125:93;47214:3;47125:93;:::i;:::-;47243:2;47238:3;47234:12;47227:19;;46886:366;;;:::o;47258:419::-;47424:4;47462:2;47451:9;47447:18;47439:26;;47511:9;47505:4;47501:20;47497:1;47486:9;47482:17;47475:47;47539:131;47665:4;47539:131;:::i;:::-;47531:139;;47258:419;;;:::o;47683:248::-;47823:34;47819:1;47811:6;47807:14;47800:58;47892:31;47887:2;47879:6;47875:15;47868:56;47683:248;:::o;47937:366::-;48079:3;48100:67;48164:2;48159:3;48100:67;:::i;:::-;48093:74;;48176:93;48265:3;48176:93;:::i;:::-;48294:2;48289:3;48285:12;48278:19;;47937:366;;;:::o;48309:419::-;48475:4;48513:2;48502:9;48498:18;48490:26;;48562:9;48556:4;48552:20;48548:1;48537:9;48533:17;48526:47;48590:131;48716:4;48590:131;:::i;:::-;48582:139;;48309:419;;;:::o;48734:237::-;48874:34;48870:1;48862:6;48858:14;48851:58;48943:20;48938:2;48930:6;48926:15;48919:45;48734:237;:::o;48977:366::-;49119:3;49140:67;49204:2;49199:3;49140:67;:::i;:::-;49133:74;;49216:93;49305:3;49216:93;:::i;:::-;49334:2;49329:3;49325:12;49318:19;;48977:366;;;:::o;49349:419::-;49515:4;49553:2;49542:9;49538:18;49530:26;;49602:9;49596:4;49592:20;49588:1;49577:9;49573:17;49566:47;49630:131;49756:4;49630:131;:::i;:::-;49622:139;;49349:419;;;:::o;49774:225::-;49914:34;49910:1;49902:6;49898:14;49891:58;49983:8;49978:2;49970:6;49966:15;49959:33;49774:225;:::o;50005:366::-;50147:3;50168:67;50232:2;50227:3;50168:67;:::i;:::-;50161:74;;50244:93;50333:3;50244:93;:::i;:::-;50362:2;50357:3;50353:12;50346:19;;50005:366;;;:::o;50377:419::-;50543:4;50581:2;50570:9;50566:18;50558:26;;50630:9;50624:4;50620:20;50616:1;50605:9;50601:17;50594:47;50658:131;50784:4;50658:131;:::i;:::-;50650:139;;50377:419;;;:::o;50802:224::-;50942:34;50938:1;50930:6;50926:14;50919:58;51011:7;51006:2;50998:6;50994:15;50987:32;50802:224;:::o;51032:366::-;51174:3;51195:67;51259:2;51254:3;51195:67;:::i;:::-;51188:74;;51271:93;51360:3;51271:93;:::i;:::-;51389:2;51384:3;51380:12;51373:19;;51032:366;;;:::o;51404:419::-;51570:4;51608:2;51597:9;51593:18;51585:26;;51657:9;51651:4;51647:20;51643:1;51632:9;51628:17;51621:47;51685:131;51811:4;51685:131;:::i;:::-;51677:139;;51404:419;;;:::o;51829:147::-;51930:11;51967:3;51952:18;;51829:147;;;;:::o;51982:114::-;;:::o;52102:398::-;52261:3;52282:83;52363:1;52358:3;52282:83;:::i;:::-;52275:90;;52374:93;52463:3;52374:93;:::i;:::-;52492:1;52487:3;52483:11;52476:18;;52102:398;;;:::o;52506:379::-;52690:3;52712:147;52855:3;52712:147;:::i;:::-;52705:154;;52876:3;52869:10;;52506:379;;;:::o;52891:170::-;53031:22;53027:1;53019:6;53015:14;53008:46;52891:170;:::o;53067:366::-;53209:3;53230:67;53294:2;53289:3;53230:67;:::i;:::-;53223:74;;53306:93;53395:3;53306:93;:::i;:::-;53424:2;53419:3;53415:12;53408:19;;53067:366;;;:::o;53439:419::-;53605:4;53643:2;53632:9;53628:18;53620:26;;53692:9;53686:4;53682:20;53678:1;53667:9;53663:17;53656:47;53720:131;53846:4;53720:131;:::i;:::-;53712:139;;53439:419;;;:::o;53864:229::-;54004:34;54000:1;53992:6;53988:14;53981:58;54073:12;54068:2;54060:6;54056:15;54049:37;53864:229;:::o;54099:366::-;54241:3;54262:67;54326:2;54321:3;54262:67;:::i;:::-;54255:74;;54338:93;54427:3;54338:93;:::i;:::-;54456:2;54451:3;54447:12;54440:19;;54099:366;;;:::o;54471:419::-;54637:4;54675:2;54664:9;54660:18;54652:26;;54724:9;54718:4;54714:20;54710:1;54699:9;54695:17;54688:47;54752:131;54878:4;54752:131;:::i;:::-;54744:139;;54471:419;;;:::o;54896:234::-;55036:34;55032:1;55024:6;55020:14;55013:58;55105:17;55100:2;55092:6;55088:15;55081:42;54896:234;:::o;55136:366::-;55278:3;55299:67;55363:2;55358:3;55299:67;:::i;:::-;55292:74;;55375:93;55464:3;55375:93;:::i;:::-;55493:2;55488:3;55484:12;55477:19;;55136:366;;;:::o;55508:419::-;55674:4;55712:2;55701:9;55697:18;55689:26;;55761:9;55755:4;55751:20;55747:1;55736:9;55732:17;55725:47;55789:131;55915:4;55789:131;:::i;:::-;55781:139;;55508:419;;;:::o;55933:98::-;55984:6;56018:5;56012:12;56002:22;;55933:98;;;:::o;56037:168::-;56120:11;56154:6;56149:3;56142:19;56194:4;56189:3;56185:14;56170:29;;56037:168;;;;:::o;56211:360::-;56297:3;56325:38;56357:5;56325:38;:::i;:::-;56379:70;56442:6;56437:3;56379:70;:::i;:::-;56372:77;;56458:52;56503:6;56498:3;56491:4;56484:5;56480:16;56458:52;:::i;:::-;56535:29;56557:6;56535:29;:::i;:::-;56530:3;56526:39;56519:46;;56301:270;56211:360;;;;:::o;56577:640::-;56772:4;56810:3;56799:9;56795:19;56787:27;;56824:71;56892:1;56881:9;56877:17;56868:6;56824:71;:::i;:::-;56905:72;56973:2;56962:9;56958:18;56949:6;56905:72;:::i;:::-;56987;57055:2;57044:9;57040:18;57031:6;56987:72;:::i;:::-;57106:9;57100:4;57096:20;57091:2;57080:9;57076:18;57069:48;57134:76;57205:4;57196:6;57134:76;:::i;:::-;57126:84;;56577:640;;;;;;;:::o;57223:141::-;57279:5;57310:6;57304:13;57295:22;;57326:32;57352:5;57326:32;:::i;:::-;57223:141;;;;:::o;57370:349::-;57439:6;57488:2;57476:9;57467:7;57463:23;57459:32;57456:119;;;57494:79;;:::i;:::-;57456:119;57614:1;57639:63;57694:7;57685:6;57674:9;57670:22;57639:63;:::i;:::-;57629:73;;57585:127;57370:349;;;;:::o;57725:233::-;57764:3;57787:24;57805:5;57787:24;:::i;:::-;57778:33;;57833:66;57826:5;57823:77;57820:103;;;57903:18;;:::i;:::-;57820:103;57950:1;57943:5;57939:13;57932:20;;57725:233;;;:::o;57964:180::-;58012:77;58009:1;58002:88;58109:4;58106:1;58099:15;58133:4;58130:1;58123:15;58150:185;58190:1;58207:20;58225:1;58207:20;:::i;:::-;58202:25;;58241:20;58259:1;58241:20;:::i;:::-;58236:25;;58280:1;58270:35;;58285:18;;:::i;:::-;58270:35;58327:1;58324;58320:9;58315:14;;58150:185;;;;:::o;58341:176::-;58373:1;58390:20;58408:1;58390:20;:::i;:::-;58385:25;;58424:20;58442:1;58424:20;:::i;:::-;58419:25;;58463:1;58453:35;;58468:18;;:::i;:::-;58453:35;58509:1;58506;58502:9;58497:14;;58341:176;;;;:::o;58523:180::-;58571:77;58568:1;58561:88;58668:4;58665:1;58658:15;58692:4;58689:1;58682:15;58709:220;58849:34;58845:1;58837:6;58833:14;58826:58;58918:3;58913:2;58905:6;58901:15;58894:28;58709:220;:::o;58935:366::-;59077:3;59098:67;59162:2;59157:3;59098:67;:::i;:::-;59091:74;;59174:93;59263:3;59174:93;:::i;:::-;59292:2;59287:3;59283:12;59276:19;;58935:366;;;:::o;59307:419::-;59473:4;59511:2;59500:9;59496:18;59488:26;;59560:9;59554:4;59550:20;59546:1;59535:9;59531:17;59524:47;59588:131;59714:4;59588:131;:::i;:::-;59580:139;;59307:419;;;:::o;59732:227::-;59872:34;59868:1;59860:6;59856:14;59849:58;59941:10;59936:2;59928:6;59924:15;59917:35;59732:227;:::o;59965:366::-;60107:3;60128:67;60192:2;60187:3;60128:67;:::i;:::-;60121:74;;60204:93;60293:3;60204:93;:::i;:::-;60322:2;60317:3;60313:12;60306:19;;59965:366;;;:::o;60337:419::-;60503:4;60541:2;60530:9;60526:18;60518:26;;60590:9;60584:4;60580:20;60576:1;60565:9;60561:17;60554:47;60618:131;60744:4;60618:131;:::i;:::-;60610:139;;60337:419;;;:::o

Swarm Source

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