ERC-721
Overview
Max Total Supply
24 SlowTurtle
Holders
11
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SlowTurtleLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
SlowTurtles
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-04-29 */ // File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol // OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol) pragma solidity ^0.8.0; /** * @dev These functions deal with verification of Merkle Trees proofs. * * The proofs can be generated using the JavaScript library * https://github.com/miguelmota/merkletreejs[merkletreejs]. * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled. * * See `test/utils/cryptography/MerkleProof.test.js` for some examples. * * WARNING: You should avoid using leaf values that are 64 bytes long prior to * hashing, or use a hash function other than keccak256 for hashing leaves. * This is because the concatenation of a sorted pair of internal nodes in * the merkle tree could be reinterpreted as a leaf value. */ library MerkleProof { /** * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree * defined by `root`. For this, a `proof` must be provided, containing * sibling hashes on the branch from the leaf to the root of the tree. Each * pair of leaves and each pair of pre-images are assumed to be sorted. */ function verify( bytes32[] memory proof, bytes32 root, bytes32 leaf ) internal pure returns (bool) { return processProof(proof, leaf) == root; } /** * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt * hash matches the root of the tree. When processing the proof, the pairs * of leafs & pre-images are assumed to be sorted. * * _Available since v4.4._ */ function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) { bytes32 computedHash = leaf; for (uint256 i = 0; i < proof.length; i++) { bytes32 proofElement = proof[i]; if (computedHash <= proofElement) { // Hash(current computed hash + current element of the proof) computedHash = _efficientHash(computedHash, proofElement); } else { // Hash(current element of the proof + current computed hash) computedHash = _efficientHash(proofElement, computedHash); } } return computedHash; } function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) { assembly { mstore(0x00, a) mstore(0x20, b) value := keccak256(0x00, 0x40) } } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * 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; /** * @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 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 the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @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); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: contracts/SlowTurtles.sol pragma solidity 0.8.11; contract SlowTurtles is ERC721Enumerable, Ownable { using Strings for string; uint256 public MAX_TOKENS = 333; uint256 public WHITELIST_PRICE = 80000000000000000; // 0.08 eth uint256 public PRICE = 100000000000000000; // 0.1 eth bool public saleIsActive = false; bool public preSaleIsActive = false; string private _baseTokenURI; bytes32 root; constructor() ERC721("SlowTurtles", "SlowTurtle") {} function mintToken(uint256 amount, bytes32[] memory proof) external payable { require( saleIsActive || (preSaleIsActive && verify(proof)), "Sale must be active to mint" ); require( msg.sender == tx.origin, "No transaction from smart contracts!" ); require(amount > 0 && amount <= 33, "Max 33 NFTs per transaction"); require( totalSupply() + amount <= MAX_TOKENS, "Purchase would exceed max supply" ); uint256 price = (preSaleIsActive && verify(proof)) ? WHITELIST_PRICE : PRICE; require(msg.value >= price * amount, "Not enough ETH for transaction"); for (uint256 i = 0; i < amount; i++) { _safeMint(msg.sender, totalSupply() + 1); } } function setPrice(uint256 newPrice) external onlyOwner { PRICE = newPrice; } function setMaxTokens(uint256 newMaxTokens) external onlyOwner { MAX_TOKENS = newMaxTokens; } function flipSaleState() external onlyOwner { saleIsActive = !saleIsActive; } function flipPreSaleState() external onlyOwner { preSaleIsActive = !preSaleIsActive; } function withdraw10() external onlyOwner { payable(owner()).transfer((address(this).balance / 100) * 10); } function withdrawTotal() external onlyOwner { payable(owner()).transfer(address(this).balance); } function transferReward(address winner, uint256 amount) external onlyOwner { payable(winner).transfer(amount); } function setRoot(bytes32 _root) external onlyOwner { root = _root; } function verify(bytes32[] memory proof) internal view returns (bool) { bytes32 leaf = keccak256(abi.encodePacked(msg.sender)); return MerkleProof.verify(proof, root, leaf); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function supportsInterface(bytes4 interfaceId) public view override(ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function getRandomNumber() public view returns (uint256) { return uint256( keccak256( abi.encodePacked( block.timestamp, block.difficulty, msg.sender ) ) ); } function pickWinner(uint256[] calldata chances, uint256 totalChance) public view returns (uint256) { uint256 numWinner = getRandomNumber() % totalChance; uint256 currNum = 0; uint256 index = 0; while (currNum < numWinner) { currNum += chances[index++]; } return index - 1; } //// //URI management part //// function _setBaseURI(string memory baseURI) internal virtual { _baseTokenURI = baseURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseURI) external onlyOwner { _setBaseURI(baseURI); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory _tokenURI = super.tokenURI(tokenId); return bytes(_tokenURI).length > 0 ? string(abi.encodePacked(_tokenURI)) : ""; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"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"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WHITELIST_PRICE","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":[],"name":"flipPreSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getRandomNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"mintToken","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"chances","type":"uint256[]"},{"internalType":"uint256","name":"totalChance","type":"uint256"}],"name":"pickWinner","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"preSaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxTokens","type":"uint256"}],"name":"setMaxTokens","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_root","type":"bytes32"}],"name":"setRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"winner","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw10","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawTotal","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405261014d600b5567011c37937e080000600c5567016345785d8a0000600d556000600e60006101000a81548160ff0219169083151502179055506000600e60016101000a81548160ff0219169083151502179055503480156200006557600080fd5b506040518060400160405280600b81526020017f536c6f77547572746c65730000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f536c6f77547572746c65000000000000000000000000000000000000000000008152508160009080519060200190620000ea929190620001fa565b50806001908051906020019062000103929190620001fa565b505050620001266200011a6200012c60201b60201c565b6200013460201b60201c565b6200030f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200020890620002d9565b90600052602060002090601f0160209004810192826200022c576000855562000278565b82601f106200024757805160ff191683800117855562000278565b8280016001018555821562000278579182015b82811115620002775782518255916020019190600101906200025a565b5b5090506200028791906200028b565b5090565b5b80821115620002a65760008160009055506001016200028c565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620002f257607f821691505b60208210811415620003095762000308620002aa565b5b50919050565b61498e806200031f6000396000f3fe60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610766578063eb8d2444146107a3578063f0325549146107ce578063f2fde38b146107e5578063f47c84c51461080e5761020f565b8063b88d4fde146106ac578063c87b56dd146106d5578063dab5f34014610712578063dbdff2c11461073b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806391b7f5ed1461061357806395d89b411461063c578063a22cb46514610667578063ae7c122e146106905761020f565b80636352211e1461052c57806370a0823114610569578063715018a6146105a65780638d859f3e146105bd5761020f565b806318e06e821161019b57806334918dfd1161016a57806334918dfd1461044957806342842e0e146104605780634f6ccce7146104895780635071cf41146104c657806355f804b3146105035761020f565b806318e06e82146103a15780631f0234d8146103b857806323b872dd146103e35780632f745c591461040c5761020f565b8063095ea7b3116101e2578063095ea7b3146102d057806311e776fe146102f957806315490ebb1461032257806317e7f2951461034b57806318160ddd146103765761020f565b8063016d4bfd1461021457806301ffc9a71461022b57806306fdde0314610268578063081812fc14610293575b600080fd5b34801561022057600080fd5b50610229610839565b005b34801561023757600080fd5b50610252600480360381019061024d9190613020565b61091d565b60405161025f9190613068565b60405180910390f35b34801561027457600080fd5b5061027d61092f565b60405161028a919061311c565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613174565b6109c1565b6040516102c791906131e2565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190613229565b610a46565b005b34801561030557600080fd5b50610320600480360381019061031b9190613174565b610b5e565b005b34801561032e57600080fd5b5061034960048036038101906103449190613229565b610be4565b005b34801561035757600080fd5b50610360610cab565b60405161036d9190613278565b60405180910390f35b34801561038257600080fd5b5061038b610cb1565b6040516103989190613278565b60405180910390f35b3480156103ad57600080fd5b506103b6610cbe565b005b3480156103c457600080fd5b506103cd610d8a565b6040516103da9190613068565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613293565b610d9d565b005b34801561041857600080fd5b50610433600480360381019061042e9190613229565b610dfd565b6040516104409190613278565b60405180910390f35b34801561045557600080fd5b5061045e610ea2565b005b34801561046c57600080fd5b5061048760048036038101906104829190613293565b610f4a565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613174565b610f6a565b6040516104bd9190613278565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061334b565b610fdb565b6040516104fa9190613278565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906134db565b611050565b005b34801561053857600080fd5b50610553600480360381019061054e9190613174565b6110d8565b60405161056091906131e2565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613524565b61118a565b60405161059d9190613278565b60405180910390f35b3480156105b257600080fd5b506105bb611242565b005b3480156105c957600080fd5b506105d26112ca565b6040516105df9190613278565b60405180910390f35b3480156105f457600080fd5b506105fd6112d0565b60405161060a91906131e2565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613174565b6112fa565b005b34801561064857600080fd5b50610651611380565b60405161065e919061311c565b60405180910390f35b34801561067357600080fd5b5061068e6004803603810190610689919061357d565b611412565b005b6106aa60048036038101906106a591906136b6565b611428565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906137b3565b611678565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613174565b6116da565b604051610709919061311c565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613836565b611778565b005b34801561074757600080fd5b506107506117fe565b60405161075d9190613278565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613863565b611833565b60405161079a9190613068565b60405180910390f35b3480156107af57600080fd5b506107b86118c7565b6040516107c59190613068565b60405180910390f35b3480156107da57600080fd5b506107e36118da565b005b3480156107f157600080fd5b5061080c60048036038101906108079190613524565b611982565b005b34801561081a57600080fd5b50610823611a7a565b6040516108309190613278565b60405180910390f35b610841611a80565b73ffffffffffffffffffffffffffffffffffffffff1661085f6112d0565b73ffffffffffffffffffffffffffffffffffffffff16146108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac906138ef565b60405180910390fd5b6108bd6112d0565b73ffffffffffffffffffffffffffffffffffffffff166108fc600a6064476108e5919061396d565b6108ef919061399e565b9081150290604051600060405180830381858888f1935050505015801561091a573d6000803e3d6000fd5b50565b600061092882611a88565b9050919050565b60606000805461093e90613a27565b80601f016020809104026020016040519081016040528092919081815260200182805461096a90613a27565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b60006109cc82611b02565b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613acb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a51826110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613b5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae1611a80565b73ffffffffffffffffffffffffffffffffffffffff161480610b105750610b0f81610b0a611a80565b611833565b5b610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613bef565b60405180910390fd5b610b598383611b6e565b505050565b610b66611a80565b73ffffffffffffffffffffffffffffffffffffffff16610b846112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906138ef565b60405180910390fd5b80600b8190555050565b610bec611a80565b73ffffffffffffffffffffffffffffffffffffffff16610c0a6112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c57906138ef565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ca6573d6000803e3d6000fd5b505050565b600c5481565b6000600880549050905090565b610cc6611a80565b73ffffffffffffffffffffffffffffffffffffffff16610ce46112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906138ef565b60405180910390fd5b610d426112d0565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d87573d6000803e3d6000fd5b50565b600e60019054906101000a900460ff1681565b610dae610da8611a80565b82611c27565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613c81565b60405180910390fd5b610df8838383611d05565b505050565b6000610e088361118a565b8210610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613d13565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eaa611a80565b73ffffffffffffffffffffffffffffffffffffffff16610ec86112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f15906138ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610f6583838360405180602001604052806000815250611678565b505050565b6000610f74610cb1565b8210610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613da5565b60405180910390fd5b60088281548110610fc957610fc8613dc5565b5b90600052602060002001549050919050565b60008082610fe76117fe565b610ff19190613df4565b90506000805b82821015611037578686828061100c90613e25565b935081811061101e5761101d613dc5565b5b90506020020135826110309190613e6e565b9150610ff7565b6001816110449190613ec4565b93505050509392505050565b611058611a80565b73ffffffffffffffffffffffffffffffffffffffff166110766112d0565b73ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c3906138ef565b60405180910390fd5b6110d581611f6c565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613f6a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290613ffc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61124a611a80565b73ffffffffffffffffffffffffffffffffffffffff166112686112d0565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906138ef565b60405180910390fd5b6112c86000611f86565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611302611a80565b73ffffffffffffffffffffffffffffffffffffffff166113206112d0565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d906138ef565b60405180910390fd5b80600d8190555050565b60606001805461138f90613a27565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb90613a27565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b5050505050905090565b61142461141d611a80565b838361204c565b5050565b600e60009054906101000a900460ff16806114605750600e60019054906101000a900460ff16801561145f575061145e816121b9565b5b5b61149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614068565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461150d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611504906140fa565b60405180910390fd5b60008211801561151e575060218211155b61155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490614166565b60405180910390fd5b600b5482611569610cb1565b6115739190613e6e565b11156115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906141d2565b60405180910390fd5b6000600e60019054906101000a900460ff1680156115d757506115d6826121b9565b5b6115e357600d546115e7565b600c545b905082816115f5919061399e565b341015611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e9061423e565b60405180910390fd5b60005b838110156116725761165f336001611650610cb1565b61165a9190613e6e565b6121fa565b808061166a90613e25565b91505061163a565b50505050565b611689611683611a80565b83611c27565b6116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90613c81565b60405180910390fd5b6116d484848484612218565b50505050565b60606116e582611b02565b611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906142d0565b60405180910390fd5b600061172f83612274565b9050600081511161174f5760405180602001604052806000815250611770565b80604051602001611760919061432c565b6040516020818303038152906040525b915050919050565b611780611a80565b73ffffffffffffffffffffffffffffffffffffffff1661179e6112d0565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb906138ef565b60405180910390fd5b8060108190555050565b6000424433604051602001611815939291906143ac565b6040516020818303038152906040528051906020012060001c905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6118e2611a80565b73ffffffffffffffffffffffffffffffffffffffff166119006112d0565b73ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d906138ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b61198a611a80565b73ffffffffffffffffffffffffffffffffffffffff166119a86112d0565b73ffffffffffffffffffffffffffffffffffffffff16146119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906138ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a659061445b565b60405180910390fd5b611a7781611f86565b50565b600b5481565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afb5750611afa8261231b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be1836110d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3282611b02565b611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906144ed565b60405180910390fd5b6000611c7c836110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cbe5750611cbd8185611833565b5b80611cfc57508373ffffffffffffffffffffffffffffffffffffffff16611ce4846109c1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d25826110d8565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d729061457f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614611565b60405180910390fd5b611df68383836123fd565b611e01600082611b6e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e519190613ec4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea89190613e6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6783838361240d565b505050565b80600f9080519060200190611f82929190612f11565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b29061467d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121ac9190613068565b60405180910390a3505050565b600080336040516020016121cd919061469d565b6040516020818303038152906040528051906020012090506121f28360105483612412565b915050919050565b612214828260405180602001604052806000815250612429565b5050565b612223848484611d05565b61222f84848484612484565b61226e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122659061472a565b60405180910390fd5b50505050565b606061227f82611b02565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b5906142d0565b60405180910390fd5b60006122c861260c565b905060008151116122e85760405180602001604052806000815250612313565b806122f28461269e565b60405160200161230392919061474a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123f657506123f5826127ff565b5b9050919050565b612408838383612869565b505050565b505050565b60008261241f858461297d565b1490509392505050565b61243383836129f2565b6124406000848484612484565b61247f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124769061472a565b60405180910390fd5b505050565b60006124a58473ffffffffffffffffffffffffffffffffffffffff16612bcc565b156125ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ce611a80565b8786866040518563ffffffff1660e01b81526004016124f094939291906147c3565b6020604051808303816000875af192505050801561252c57506040513d601f19601f820116820180604052508101906125299190614824565b60015b6125af573d806000811461255c576040519150601f19603f3d011682016040523d82523d6000602084013e612561565b606091505b506000815114156125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e9061472a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612604565b600190505b949350505050565b6060600f805461261b90613a27565b80601f016020809104026020016040519081016040528092919081815260200182805461264790613a27565b80156126945780601f1061266957610100808354040283529160200191612694565b820191906000526020600020905b81548152906001019060200180831161267757829003601f168201915b5050505050905090565b606060008214156126e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127fa565b600082905060005b6000821461271857808061270190613e25565b915050600a82612711919061396d565b91506126ee565b60008167ffffffffffffffff811115612734576127336133b0565b5b6040519080825280601f01601f1916602001820160405280156127665781602001600182028036833780820191505090505b5090505b600085146127f35760018261277f9190613ec4565b9150600a8561278e9190613df4565b603061279a9190613e6e565b60f81b8183815181106127b0576127af613dc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127ec919061396d565b945061276a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612874838383612bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b7576128b281612bf4565b6128f6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128f5576128f48382612c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129395761293481612daa565b612978565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612977576129768282612e7b565b5b5b505050565b60008082905060005b84518110156129e75760008582815181106129a4576129a3613dc5565b5b602002602001015190508083116129c6576129bf8382612efa565b92506129d3565b6129d08184612efa565b92505b5080806129df90613e25565b915050612986565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a599061489d565b60405180910390fd5b612a6b81611b02565b15612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614909565b60405180910390fd5b612ab7600083836123fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b079190613e6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc86000838361240d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4a8461118a565b612c549190613ec4565b9050600060076000848152602001908152602001600020549050818114612d39576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dbe9190613ec4565b9050600060096000848152602001908152602001600020549050600060088381548110612dee57612ded613dc5565b5b906000526020600020015490508060088381548110612e1057612e0f613dc5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5f57612e5e614929565b5b6001900381819060005260206000200160009055905550505050565b6000612e868361118a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b828054612f1d90613a27565b90600052602060002090601f016020900481019282612f3f5760008555612f86565b82601f10612f5857805160ff1916838001178555612f86565b82800160010185558215612f86579182015b82811115612f85578251825591602001919060010190612f6a565b5b509050612f939190612f97565b5090565b5b80821115612fb0576000816000905550600101612f98565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ffd81612fc8565b811461300857600080fd5b50565b60008135905061301a81612ff4565b92915050565b60006020828403121561303657613035612fbe565b5b60006130448482850161300b565b91505092915050565b60008115159050919050565b6130628161304d565b82525050565b600060208201905061307d6000830184613059565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130bd5780820151818401526020810190506130a2565b838111156130cc576000848401525b50505050565b6000601f19601f8301169050919050565b60006130ee82613083565b6130f8818561308e565b935061310881856020860161309f565b613111816130d2565b840191505092915050565b6000602082019050818103600083015261313681846130e3565b905092915050565b6000819050919050565b6131518161313e565b811461315c57600080fd5b50565b60008135905061316e81613148565b92915050565b60006020828403121561318a57613189612fbe565b5b60006131988482850161315f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131cc826131a1565b9050919050565b6131dc816131c1565b82525050565b60006020820190506131f760008301846131d3565b92915050565b613206816131c1565b811461321157600080fd5b50565b600081359050613223816131fd565b92915050565b600080604083850312156132405761323f612fbe565b5b600061324e85828601613214565b925050602061325f8582860161315f565b9150509250929050565b6132728161313e565b82525050565b600060208201905061328d6000830184613269565b92915050565b6000806000606084860312156132ac576132ab612fbe565b5b60006132ba86828701613214565b93505060206132cb86828701613214565b92505060406132dc8682870161315f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261330b5761330a6132e6565b5b8235905067ffffffffffffffff811115613328576133276132eb565b5b602083019150836020820283011115613344576133436132f0565b5b9250929050565b60008060006040848603121561336457613363612fbe565b5b600084013567ffffffffffffffff81111561338257613381612fc3565b5b61338e868287016132f5565b935093505060206133a18682870161315f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133e8826130d2565b810181811067ffffffffffffffff82111715613407576134066133b0565b5b80604052505050565b600061341a612fb4565b905061342682826133df565b919050565b600067ffffffffffffffff821115613446576134456133b0565b5b61344f826130d2565b9050602081019050919050565b82818337600083830152505050565b600061347e6134798461342b565b613410565b90508281526020810184848401111561349a576134996133ab565b5b6134a584828561345c565b509392505050565b600082601f8301126134c2576134c16132e6565b5b81356134d284826020860161346b565b91505092915050565b6000602082840312156134f1576134f0612fbe565b5b600082013567ffffffffffffffff81111561350f5761350e612fc3565b5b61351b848285016134ad565b91505092915050565b60006020828403121561353a57613539612fbe565b5b600061354884828501613214565b91505092915050565b61355a8161304d565b811461356557600080fd5b50565b60008135905061357781613551565b92915050565b6000806040838503121561359457613593612fbe565b5b60006135a285828601613214565b92505060206135b385828601613568565b9150509250929050565b600067ffffffffffffffff8211156135d8576135d76133b0565b5b602082029050602081019050919050565b6000819050919050565b6135fc816135e9565b811461360757600080fd5b50565b600081359050613619816135f3565b92915050565b600061363261362d846135bd565b613410565b90508083825260208201905060208402830185811115613655576136546132f0565b5b835b8181101561367e578061366a888261360a565b845260208401935050602081019050613657565b5050509392505050565b600082601f83011261369d5761369c6132e6565b5b81356136ad84826020860161361f565b91505092915050565b600080604083850312156136cd576136cc612fbe565b5b60006136db8582860161315f565b925050602083013567ffffffffffffffff8111156136fc576136fb612fc3565b5b61370885828601613688565b9150509250929050565b600067ffffffffffffffff82111561372d5761372c6133b0565b5b613736826130d2565b9050602081019050919050565b600061375661375184613712565b613410565b905082815260208101848484011115613772576137716133ab565b5b61377d84828561345c565b509392505050565b600082601f83011261379a576137996132e6565b5b81356137aa848260208601613743565b91505092915050565b600080600080608085870312156137cd576137cc612fbe565b5b60006137db87828801613214565b94505060206137ec87828801613214565b93505060406137fd8782880161315f565b925050606085013567ffffffffffffffff81111561381e5761381d612fc3565b5b61382a87828801613785565b91505092959194509250565b60006020828403121561384c5761384b612fbe565b5b600061385a8482850161360a565b91505092915050565b6000806040838503121561387a57613879612fbe565b5b600061388885828601613214565b925050602061389985828601613214565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138d960208361308e565b91506138e4826138a3565b602082019050919050565b60006020820190508181036000830152613908816138cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139788261313e565b91506139838361313e565b9250826139935761399261390f565b5b828204905092915050565b60006139a98261313e565b91506139b48361313e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ed576139ec61393e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a3f57607f821691505b60208210811415613a5357613a526139f8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ab5602c8361308e565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b4760218361308e565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613bd960388361308e565b9150613be482613b7d565b604082019050919050565b60006020820190508181036000830152613c0881613bcc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c6b60318361308e565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613cfd602b8361308e565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613d8f602c8361308e565b9150613d9a82613d33565b604082019050919050565b60006020820190508181036000830152613dbe81613d82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613dff8261313e565b9150613e0a8361313e565b925082613e1a57613e1961390f565b5b828206905092915050565b6000613e308261313e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6357613e6261393e565b5b600182019050919050565b6000613e798261313e565b9150613e848361313e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb957613eb861393e565b5b828201905092915050565b6000613ecf8261313e565b9150613eda8361313e565b925082821015613eed57613eec61393e565b5b828203905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f5460298361308e565b9150613f5f82613ef8565b604082019050919050565b60006020820190508181036000830152613f8381613f47565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fe6602a8361308e565b9150613ff182613f8a565b604082019050919050565b6000602082019050818103600083015261401581613fd9565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b6000614052601b8361308e565b915061405d8261401c565b602082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b60006140e460248361308e565b91506140ef82614088565b604082019050919050565b60006020820190508181036000830152614113816140d7565b9050919050565b7f4d6178203333204e46547320706572207472616e73616374696f6e0000000000600082015250565b6000614150601b8361308e565b915061415b8261411a565b602082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006141bc60208361308e565b91506141c782614186565b602082019050919050565b600060208201905081810360008301526141eb816141af565b9050919050565b7f4e6f7420656e6f7567682045544820666f72207472616e73616374696f6e0000600082015250565b6000614228601e8361308e565b9150614233826141f2565b602082019050919050565b600060208201905081810360008301526142578161421b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142ba602f8361308e565b91506142c58261425e565b604082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b600081905092915050565b600061430682613083565b61431081856142f0565b935061432081856020860161309f565b80840191505092915050565b600061433882846142fb565b915081905092915050565b6000819050919050565b61435e6143598261313e565b614343565b82525050565b60008160601b9050919050565b600061437c82614364565b9050919050565b600061438e82614371565b9050919050565b6143a66143a1826131c1565b614383565b82525050565b60006143b8828661434d565b6020820191506143c8828561434d565b6020820191506143d88284614395565b601482019150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444560268361308e565b9150614450826143e9565b604082019050919050565b6000602082019050818103600083015261447481614438565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144d7602c8361308e565b91506144e28261447b565b604082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061456960258361308e565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145fb60248361308e565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061466760198361308e565b915061467282614631565b602082019050919050565b600060208201905081810360008301526146968161465a565b9050919050565b60006146a98284614395565b60148201915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061471460328361308e565b915061471f826146b8565b604082019050919050565b6000602082019050818103600083015261474381614707565b9050919050565b600061475682856142fb565b915061476282846142fb565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006147958261476e565b61479f8185614779565b93506147af81856020860161309f565b6147b8816130d2565b840191505092915050565b60006080820190506147d860008301876131d3565b6147e560208301866131d3565b6147f26040830185613269565b8181036060830152614804818461478a565b905095945050505050565b60008151905061481e81612ff4565b92915050565b60006020828403121561483a57614839612fbe565b5b60006148488482850161480f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061488760208361308e565b915061489282614851565b602082019050919050565b600060208201905081810360008301526148b68161487a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148f3601c8361308e565b91506148fe826148bd565b602082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220266679178d0172ef007e74e4d7894296b24cbe80eebbb3baee010fa3741693dd64736f6c634300080b0033
Deployed Bytecode
0x60806040526004361061020f5760003560e01c80636352211e11610118578063b88d4fde116100a0578063e985e9c51161006f578063e985e9c514610766578063eb8d2444146107a3578063f0325549146107ce578063f2fde38b146107e5578063f47c84c51461080e5761020f565b8063b88d4fde146106ac578063c87b56dd146106d5578063dab5f34014610712578063dbdff2c11461073b5761020f565b80638da5cb5b116100e75780638da5cb5b146105e857806391b7f5ed1461061357806395d89b411461063c578063a22cb46514610667578063ae7c122e146106905761020f565b80636352211e1461052c57806370a0823114610569578063715018a6146105a65780638d859f3e146105bd5761020f565b806318e06e821161019b57806334918dfd1161016a57806334918dfd1461044957806342842e0e146104605780634f6ccce7146104895780635071cf41146104c657806355f804b3146105035761020f565b806318e06e82146103a15780631f0234d8146103b857806323b872dd146103e35780632f745c591461040c5761020f565b8063095ea7b3116101e2578063095ea7b3146102d057806311e776fe146102f957806315490ebb1461032257806317e7f2951461034b57806318160ddd146103765761020f565b8063016d4bfd1461021457806301ffc9a71461022b57806306fdde0314610268578063081812fc14610293575b600080fd5b34801561022057600080fd5b50610229610839565b005b34801561023757600080fd5b50610252600480360381019061024d9190613020565b61091d565b60405161025f9190613068565b60405180910390f35b34801561027457600080fd5b5061027d61092f565b60405161028a919061311c565b60405180910390f35b34801561029f57600080fd5b506102ba60048036038101906102b59190613174565b6109c1565b6040516102c791906131e2565b60405180910390f35b3480156102dc57600080fd5b506102f760048036038101906102f29190613229565b610a46565b005b34801561030557600080fd5b50610320600480360381019061031b9190613174565b610b5e565b005b34801561032e57600080fd5b5061034960048036038101906103449190613229565b610be4565b005b34801561035757600080fd5b50610360610cab565b60405161036d9190613278565b60405180910390f35b34801561038257600080fd5b5061038b610cb1565b6040516103989190613278565b60405180910390f35b3480156103ad57600080fd5b506103b6610cbe565b005b3480156103c457600080fd5b506103cd610d8a565b6040516103da9190613068565b60405180910390f35b3480156103ef57600080fd5b5061040a60048036038101906104059190613293565b610d9d565b005b34801561041857600080fd5b50610433600480360381019061042e9190613229565b610dfd565b6040516104409190613278565b60405180910390f35b34801561045557600080fd5b5061045e610ea2565b005b34801561046c57600080fd5b5061048760048036038101906104829190613293565b610f4a565b005b34801561049557600080fd5b506104b060048036038101906104ab9190613174565b610f6a565b6040516104bd9190613278565b60405180910390f35b3480156104d257600080fd5b506104ed60048036038101906104e8919061334b565b610fdb565b6040516104fa9190613278565b60405180910390f35b34801561050f57600080fd5b5061052a600480360381019061052591906134db565b611050565b005b34801561053857600080fd5b50610553600480360381019061054e9190613174565b6110d8565b60405161056091906131e2565b60405180910390f35b34801561057557600080fd5b50610590600480360381019061058b9190613524565b61118a565b60405161059d9190613278565b60405180910390f35b3480156105b257600080fd5b506105bb611242565b005b3480156105c957600080fd5b506105d26112ca565b6040516105df9190613278565b60405180910390f35b3480156105f457600080fd5b506105fd6112d0565b60405161060a91906131e2565b60405180910390f35b34801561061f57600080fd5b5061063a60048036038101906106359190613174565b6112fa565b005b34801561064857600080fd5b50610651611380565b60405161065e919061311c565b60405180910390f35b34801561067357600080fd5b5061068e6004803603810190610689919061357d565b611412565b005b6106aa60048036038101906106a591906136b6565b611428565b005b3480156106b857600080fd5b506106d360048036038101906106ce91906137b3565b611678565b005b3480156106e157600080fd5b506106fc60048036038101906106f79190613174565b6116da565b604051610709919061311c565b60405180910390f35b34801561071e57600080fd5b5061073960048036038101906107349190613836565b611778565b005b34801561074757600080fd5b506107506117fe565b60405161075d9190613278565b60405180910390f35b34801561077257600080fd5b5061078d60048036038101906107889190613863565b611833565b60405161079a9190613068565b60405180910390f35b3480156107af57600080fd5b506107b86118c7565b6040516107c59190613068565b60405180910390f35b3480156107da57600080fd5b506107e36118da565b005b3480156107f157600080fd5b5061080c60048036038101906108079190613524565b611982565b005b34801561081a57600080fd5b50610823611a7a565b6040516108309190613278565b60405180910390f35b610841611a80565b73ffffffffffffffffffffffffffffffffffffffff1661085f6112d0565b73ffffffffffffffffffffffffffffffffffffffff16146108b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108ac906138ef565b60405180910390fd5b6108bd6112d0565b73ffffffffffffffffffffffffffffffffffffffff166108fc600a6064476108e5919061396d565b6108ef919061399e565b9081150290604051600060405180830381858888f1935050505015801561091a573d6000803e3d6000fd5b50565b600061092882611a88565b9050919050565b60606000805461093e90613a27565b80601f016020809104026020016040519081016040528092919081815260200182805461096a90613a27565b80156109b75780601f1061098c576101008083540402835291602001916109b7565b820191906000526020600020905b81548152906001019060200180831161099a57829003601f168201915b5050505050905090565b60006109cc82611b02565b610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613acb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a51826110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ac2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab990613b5d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ae1611a80565b73ffffffffffffffffffffffffffffffffffffffff161480610b105750610b0f81610b0a611a80565b611833565b5b610b4f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4690613bef565b60405180910390fd5b610b598383611b6e565b505050565b610b66611a80565b73ffffffffffffffffffffffffffffffffffffffff16610b846112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610bda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd1906138ef565b60405180910390fd5b80600b8190555050565b610bec611a80565b73ffffffffffffffffffffffffffffffffffffffff16610c0a6112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610c60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c57906138ef565b60405180910390fd5b8173ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610ca6573d6000803e3d6000fd5b505050565b600c5481565b6000600880549050905090565b610cc6611a80565b73ffffffffffffffffffffffffffffffffffffffff16610ce46112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610d3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d31906138ef565b60405180910390fd5b610d426112d0565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610d87573d6000803e3d6000fd5b50565b600e60019054906101000a900460ff1681565b610dae610da8611a80565b82611c27565b610ded576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de490613c81565b60405180910390fd5b610df8838383611d05565b505050565b6000610e088361118a565b8210610e49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4090613d13565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610eaa611a80565b73ffffffffffffffffffffffffffffffffffffffff16610ec86112d0565b73ffffffffffffffffffffffffffffffffffffffff1614610f1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f15906138ef565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b610f6583838360405180602001604052806000815250611678565b505050565b6000610f74610cb1565b8210610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac90613da5565b60405180910390fd5b60088281548110610fc957610fc8613dc5565b5b90600052602060002001549050919050565b60008082610fe76117fe565b610ff19190613df4565b90506000805b82821015611037578686828061100c90613e25565b935081811061101e5761101d613dc5565b5b90506020020135826110309190613e6e565b9150610ff7565b6001816110449190613ec4565b93505050509392505050565b611058611a80565b73ffffffffffffffffffffffffffffffffffffffff166110766112d0565b73ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c3906138ef565b60405180910390fd5b6110d581611f6c565b50565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611181576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161117890613f6a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f290613ffc565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61124a611a80565b73ffffffffffffffffffffffffffffffffffffffff166112686112d0565b73ffffffffffffffffffffffffffffffffffffffff16146112be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b5906138ef565b60405180910390fd5b6112c86000611f86565b565b600d5481565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611302611a80565b73ffffffffffffffffffffffffffffffffffffffff166113206112d0565b73ffffffffffffffffffffffffffffffffffffffff1614611376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161136d906138ef565b60405180910390fd5b80600d8190555050565b60606001805461138f90613a27565b80601f01602080910402602001604051908101604052809291908181526020018280546113bb90613a27565b80156114085780601f106113dd57610100808354040283529160200191611408565b820191906000526020600020905b8154815290600101906020018083116113eb57829003601f168201915b5050505050905090565b61142461141d611a80565b838361204c565b5050565b600e60009054906101000a900460ff16806114605750600e60019054906101000a900460ff16801561145f575061145e816121b9565b5b5b61149f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149690614068565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461150d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611504906140fa565b60405180910390fd5b60008211801561151e575060218211155b61155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161155490614166565b60405180910390fd5b600b5482611569610cb1565b6115739190613e6e565b11156115b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ab906141d2565b60405180910390fd5b6000600e60019054906101000a900460ff1680156115d757506115d6826121b9565b5b6115e357600d546115e7565b600c545b905082816115f5919061399e565b341015611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162e9061423e565b60405180910390fd5b60005b838110156116725761165f336001611650610cb1565b61165a9190613e6e565b6121fa565b808061166a90613e25565b91505061163a565b50505050565b611689611683611a80565b83611c27565b6116c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bf90613c81565b60405180910390fd5b6116d484848484612218565b50505050565b60606116e582611b02565b611724576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171b906142d0565b60405180910390fd5b600061172f83612274565b9050600081511161174f5760405180602001604052806000815250611770565b80604051602001611760919061432c565b6040516020818303038152906040525b915050919050565b611780611a80565b73ffffffffffffffffffffffffffffffffffffffff1661179e6112d0565b73ffffffffffffffffffffffffffffffffffffffff16146117f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117eb906138ef565b60405180910390fd5b8060108190555050565b6000424433604051602001611815939291906143ac565b6040516020818303038152906040528051906020012060001c905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600e60009054906101000a900460ff1681565b6118e2611a80565b73ffffffffffffffffffffffffffffffffffffffff166119006112d0565b73ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194d906138ef565b60405180910390fd5b600e60019054906101000a900460ff1615600e60016101000a81548160ff021916908315150217905550565b61198a611a80565b73ffffffffffffffffffffffffffffffffffffffff166119a86112d0565b73ffffffffffffffffffffffffffffffffffffffff16146119fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f5906138ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a659061445b565b60405180910390fd5b611a7781611f86565b50565b600b5481565b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611afb5750611afa8261231b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611be1836110d8565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c3282611b02565b611c71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c68906144ed565b60405180910390fd5b6000611c7c836110d8565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611cbe5750611cbd8185611833565b5b80611cfc57508373ffffffffffffffffffffffffffffffffffffffff16611ce4846109c1565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d25826110d8565b73ffffffffffffffffffffffffffffffffffffffff1614611d7b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d729061457f565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611deb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de290614611565b60405180910390fd5b611df68383836123fd565b611e01600082611b6e565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e519190613ec4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ea89190613e6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611f6783838361240d565b505050565b80600f9080519060200190611f82929190612f11565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120b29061467d565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121ac9190613068565b60405180910390a3505050565b600080336040516020016121cd919061469d565b6040516020818303038152906040528051906020012090506121f28360105483612412565b915050919050565b612214828260405180602001604052806000815250612429565b5050565b612223848484611d05565b61222f84848484612484565b61226e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122659061472a565b60405180910390fd5b50505050565b606061227f82611b02565b6122be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122b5906142d0565b60405180910390fd5b60006122c861260c565b905060008151116122e85760405180602001604052806000815250612313565b806122f28461269e565b60405160200161230392919061474a565b6040516020818303038152906040525b915050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123f657506123f5826127ff565b5b9050919050565b612408838383612869565b505050565b505050565b60008261241f858461297d565b1490509392505050565b61243383836129f2565b6124406000848484612484565b61247f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124769061472a565b60405180910390fd5b505050565b60006124a58473ffffffffffffffffffffffffffffffffffffffff16612bcc565b156125ff578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124ce611a80565b8786866040518563ffffffff1660e01b81526004016124f094939291906147c3565b6020604051808303816000875af192505050801561252c57506040513d601f19601f820116820180604052508101906125299190614824565b60015b6125af573d806000811461255c576040519150601f19603f3d011682016040523d82523d6000602084013e612561565b606091505b506000815114156125a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161259e9061472a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612604565b600190505b949350505050565b6060600f805461261b90613a27565b80601f016020809104026020016040519081016040528092919081815260200182805461264790613a27565b80156126945780601f1061266957610100808354040283529160200191612694565b820191906000526020600020905b81548152906001019060200180831161267757829003601f168201915b5050505050905090565b606060008214156126e6576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127fa565b600082905060005b6000821461271857808061270190613e25565b915050600a82612711919061396d565b91506126ee565b60008167ffffffffffffffff811115612734576127336133b0565b5b6040519080825280601f01601f1916602001820160405280156127665781602001600182028036833780820191505090505b5090505b600085146127f35760018261277f9190613ec4565b9150600a8561278e9190613df4565b603061279a9190613e6e565b60f81b8183815181106127b0576127af613dc5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127ec919061396d565b945061276a565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612874838383612bef565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156128b7576128b281612bf4565b6128f6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146128f5576128f48382612c3d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129395761293481612daa565b612978565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612977576129768282612e7b565b5b5b505050565b60008082905060005b84518110156129e75760008582815181106129a4576129a3613dc5565b5b602002602001015190508083116129c6576129bf8382612efa565b92506129d3565b6129d08184612efa565b92505b5080806129df90613e25565b915050612986565b508091505092915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a62576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a599061489d565b60405180910390fd5b612a6b81611b02565b15612aab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612aa290614909565b60405180910390fd5b612ab7600083836123fd565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612b079190613e6e565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bc86000838361240d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c4a8461118a565b612c549190613ec4565b9050600060076000848152602001908152602001600020549050818114612d39576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612dbe9190613ec4565b9050600060096000848152602001908152602001600020549050600060088381548110612dee57612ded613dc5565b5b906000526020600020015490508060088381548110612e1057612e0f613dc5565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5f57612e5e614929565b5b6001900381819060005260206000200160009055905550505050565b6000612e868361118a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600082600052816020526040600020905092915050565b828054612f1d90613a27565b90600052602060002090601f016020900481019282612f3f5760008555612f86565b82601f10612f5857805160ff1916838001178555612f86565b82800160010185558215612f86579182015b82811115612f85578251825591602001919060010190612f6a565b5b509050612f939190612f97565b5090565b5b80821115612fb0576000816000905550600101612f98565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ffd81612fc8565b811461300857600080fd5b50565b60008135905061301a81612ff4565b92915050565b60006020828403121561303657613035612fbe565b5b60006130448482850161300b565b91505092915050565b60008115159050919050565b6130628161304d565b82525050565b600060208201905061307d6000830184613059565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130bd5780820151818401526020810190506130a2565b838111156130cc576000848401525b50505050565b6000601f19601f8301169050919050565b60006130ee82613083565b6130f8818561308e565b935061310881856020860161309f565b613111816130d2565b840191505092915050565b6000602082019050818103600083015261313681846130e3565b905092915050565b6000819050919050565b6131518161313e565b811461315c57600080fd5b50565b60008135905061316e81613148565b92915050565b60006020828403121561318a57613189612fbe565b5b60006131988482850161315f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131cc826131a1565b9050919050565b6131dc816131c1565b82525050565b60006020820190506131f760008301846131d3565b92915050565b613206816131c1565b811461321157600080fd5b50565b600081359050613223816131fd565b92915050565b600080604083850312156132405761323f612fbe565b5b600061324e85828601613214565b925050602061325f8582860161315f565b9150509250929050565b6132728161313e565b82525050565b600060208201905061328d6000830184613269565b92915050565b6000806000606084860312156132ac576132ab612fbe565b5b60006132ba86828701613214565b93505060206132cb86828701613214565b92505060406132dc8682870161315f565b9150509250925092565b600080fd5b600080fd5b600080fd5b60008083601f84011261330b5761330a6132e6565b5b8235905067ffffffffffffffff811115613328576133276132eb565b5b602083019150836020820283011115613344576133436132f0565b5b9250929050565b60008060006040848603121561336457613363612fbe565b5b600084013567ffffffffffffffff81111561338257613381612fc3565b5b61338e868287016132f5565b935093505060206133a18682870161315f565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6133e8826130d2565b810181811067ffffffffffffffff82111715613407576134066133b0565b5b80604052505050565b600061341a612fb4565b905061342682826133df565b919050565b600067ffffffffffffffff821115613446576134456133b0565b5b61344f826130d2565b9050602081019050919050565b82818337600083830152505050565b600061347e6134798461342b565b613410565b90508281526020810184848401111561349a576134996133ab565b5b6134a584828561345c565b509392505050565b600082601f8301126134c2576134c16132e6565b5b81356134d284826020860161346b565b91505092915050565b6000602082840312156134f1576134f0612fbe565b5b600082013567ffffffffffffffff81111561350f5761350e612fc3565b5b61351b848285016134ad565b91505092915050565b60006020828403121561353a57613539612fbe565b5b600061354884828501613214565b91505092915050565b61355a8161304d565b811461356557600080fd5b50565b60008135905061357781613551565b92915050565b6000806040838503121561359457613593612fbe565b5b60006135a285828601613214565b92505060206135b385828601613568565b9150509250929050565b600067ffffffffffffffff8211156135d8576135d76133b0565b5b602082029050602081019050919050565b6000819050919050565b6135fc816135e9565b811461360757600080fd5b50565b600081359050613619816135f3565b92915050565b600061363261362d846135bd565b613410565b90508083825260208201905060208402830185811115613655576136546132f0565b5b835b8181101561367e578061366a888261360a565b845260208401935050602081019050613657565b5050509392505050565b600082601f83011261369d5761369c6132e6565b5b81356136ad84826020860161361f565b91505092915050565b600080604083850312156136cd576136cc612fbe565b5b60006136db8582860161315f565b925050602083013567ffffffffffffffff8111156136fc576136fb612fc3565b5b61370885828601613688565b9150509250929050565b600067ffffffffffffffff82111561372d5761372c6133b0565b5b613736826130d2565b9050602081019050919050565b600061375661375184613712565b613410565b905082815260208101848484011115613772576137716133ab565b5b61377d84828561345c565b509392505050565b600082601f83011261379a576137996132e6565b5b81356137aa848260208601613743565b91505092915050565b600080600080608085870312156137cd576137cc612fbe565b5b60006137db87828801613214565b94505060206137ec87828801613214565b93505060406137fd8782880161315f565b925050606085013567ffffffffffffffff81111561381e5761381d612fc3565b5b61382a87828801613785565b91505092959194509250565b60006020828403121561384c5761384b612fbe565b5b600061385a8482850161360a565b91505092915050565b6000806040838503121561387a57613879612fbe565b5b600061388885828601613214565b925050602061389985828601613214565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006138d960208361308e565b91506138e4826138a3565b602082019050919050565b60006020820190508181036000830152613908816138cc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139788261313e565b91506139838361313e565b9250826139935761399261390f565b5b828204905092915050565b60006139a98261313e565b91506139b48361313e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ed576139ec61393e565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613a3f57607f821691505b60208210811415613a5357613a526139f8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613ab5602c8361308e565b9150613ac082613a59565b604082019050919050565b60006020820190508181036000830152613ae481613aa8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613b4760218361308e565b9150613b5282613aeb565b604082019050919050565b60006020820190508181036000830152613b7681613b3a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613bd960388361308e565b9150613be482613b7d565b604082019050919050565b60006020820190508181036000830152613c0881613bcc565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613c6b60318361308e565b9150613c7682613c0f565b604082019050919050565b60006020820190508181036000830152613c9a81613c5e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b6000613cfd602b8361308e565b9150613d0882613ca1565b604082019050919050565b60006020820190508181036000830152613d2c81613cf0565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613d8f602c8361308e565b9150613d9a82613d33565b604082019050919050565b60006020820190508181036000830152613dbe81613d82565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000613dff8261313e565b9150613e0a8361313e565b925082613e1a57613e1961390f565b5b828206905092915050565b6000613e308261313e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6357613e6261393e565b5b600182019050919050565b6000613e798261313e565b9150613e848361313e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613eb957613eb861393e565b5b828201905092915050565b6000613ecf8261313e565b9150613eda8361313e565b925082821015613eed57613eec61393e565b5b828203905092915050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613f5460298361308e565b9150613f5f82613ef8565b604082019050919050565b60006020820190508181036000830152613f8381613f47565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613fe6602a8361308e565b9150613ff182613f8a565b604082019050919050565b6000602082019050818103600083015261401581613fd9565b9050919050565b7f53616c65206d7573742062652061637469766520746f206d696e740000000000600082015250565b6000614052601b8361308e565b915061405d8261401c565b602082019050919050565b6000602082019050818103600083015261408181614045565b9050919050565b7f4e6f207472616e73616374696f6e2066726f6d20736d61727420636f6e74726160008201527f6374732100000000000000000000000000000000000000000000000000000000602082015250565b60006140e460248361308e565b91506140ef82614088565b604082019050919050565b60006020820190508181036000830152614113816140d7565b9050919050565b7f4d6178203333204e46547320706572207472616e73616374696f6e0000000000600082015250565b6000614150601b8361308e565b915061415b8261411a565b602082019050919050565b6000602082019050818103600083015261417f81614143565b9050919050565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b60006141bc60208361308e565b91506141c782614186565b602082019050919050565b600060208201905081810360008301526141eb816141af565b9050919050565b7f4e6f7420656e6f7567682045544820666f72207472616e73616374696f6e0000600082015250565b6000614228601e8361308e565b9150614233826141f2565b602082019050919050565b600060208201905081810360008301526142578161421b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006142ba602f8361308e565b91506142c58261425e565b604082019050919050565b600060208201905081810360008301526142e9816142ad565b9050919050565b600081905092915050565b600061430682613083565b61431081856142f0565b935061432081856020860161309f565b80840191505092915050565b600061433882846142fb565b915081905092915050565b6000819050919050565b61435e6143598261313e565b614343565b82525050565b60008160601b9050919050565b600061437c82614364565b9050919050565b600061438e82614371565b9050919050565b6143a66143a1826131c1565b614383565b82525050565b60006143b8828661434d565b6020820191506143c8828561434d565b6020820191506143d88284614395565b601482019150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061444560268361308e565b9150614450826143e9565b604082019050919050565b6000602082019050818103600083015261447481614438565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144d7602c8361308e565b91506144e28261447b565b604082019050919050565b60006020820190508181036000830152614506816144ca565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061456960258361308e565b91506145748261450d565b604082019050919050565b600060208201905081810360008301526145988161455c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145fb60248361308e565b91506146068261459f565b604082019050919050565b6000602082019050818103600083015261462a816145ee565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b600061466760198361308e565b915061467282614631565b602082019050919050565b600060208201905081810360008301526146968161465a565b9050919050565b60006146a98284614395565b60148201915081905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061471460328361308e565b915061471f826146b8565b604082019050919050565b6000602082019050818103600083015261474381614707565b9050919050565b600061475682856142fb565b915061476282846142fb565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006147958261476e565b61479f8185614779565b93506147af81856020860161309f565b6147b8816130d2565b840191505092915050565b60006080820190506147d860008301876131d3565b6147e560208301866131d3565b6147f26040830185613269565b8181036060830152614804818461478a565b905095945050505050565b60008151905061481e81612ff4565b92915050565b60006020828403121561483a57614839612fbe565b5b60006148488482850161480f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061488760208361308e565b915061489282614851565b602082019050919050565b600060208201905081810360008301526148b68161487a565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148f3601c8361308e565b91506148fe826148bd565b602082019050919050565b60006020820190508181036000830152614922816148e6565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfea2646970667358221220266679178d0172ef007e74e4d7894296b24cbe80eebbb3baee010fa3741693dd64736f6c634300080b0033
Deployed Bytecode Sourcemap
48259:4470:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50025:121;;;;;;;;;;;;;:::i;:::-;;50917:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28857:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30417:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29940:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49703:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50273:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48387:50;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42678:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50154:111;;;;;;;;;;;;;:::i;:::-;;48556:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31167:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42346:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49818:91;;;;;;;;;;;;;:::i;:::-;;31577:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42868:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51486:382;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52150:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28551:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28281:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7415:103;;;;;;;;;;;;;:::i;:::-;;48456:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6764:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49605:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29026:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30710:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48716:881;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31833:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52259:467;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50407:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51129:349;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30936:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48517:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49917:100;;;;;;;;;;;;;:::i;:::-;;7673:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48349:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50025:121;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50085:7:::1;:5;:7::i;:::-;50077:25;;:61;50135:2;50128:3;50104:21;:27;;;;:::i;:::-;50103:34;;;;:::i;:::-;50077:61;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50025:121::o:0;50917:204::-;51048:4;51077:36;51101:11;51077:23;:36::i;:::-;51070:43;;50917:204;;;:::o;28857:100::-;28911:13;28944:5;28937:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28857:100;:::o;30417:221::-;30493:7;30521:16;30529:7;30521;:16::i;:::-;30513:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30606:15;:24;30622:7;30606:24;;;;;;;;;;;;;;;;;;;;;30599:31;;30417:221;;;:::o;29940:411::-;30021:13;30037:23;30052:7;30037:14;:23::i;:::-;30021:39;;30085:5;30079:11;;:2;:11;;;;30071:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;30179:5;30163:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;30188:37;30205:5;30212:12;:10;:12::i;:::-;30188:16;:37::i;:::-;30163:62;30141:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;30322:21;30331:2;30335:7;30322:8;:21::i;:::-;30010:341;29940:411;;:::o;49703:107::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49790:12:::1;49777:10;:25;;;;49703:107:::0;:::o;50273:126::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50367:6:::1;50359:24;;:32;50384:6;50359:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50273:126:::0;;:::o;48387:50::-;;;;:::o;42678:113::-;42739:7;42766:10;:17;;;;42759:24;;42678:113;:::o;50154:111::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50217:7:::1;:5;:7::i;:::-;50209:25;;:48;50235:21;50209:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;50154:111::o:0;48556:35::-;;;;;;;;;;;;;:::o;31167:339::-;31362:41;31381:12;:10;:12::i;:::-;31395:7;31362:18;:41::i;:::-;31354:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31470:28;31480:4;31486:2;31490:7;31470:9;:28::i;:::-;31167:339;;;:::o;42346:256::-;42443:7;42479:23;42496:5;42479:16;:23::i;:::-;42471:5;:31;42463:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;42568:12;:19;42581:5;42568:19;;;;;;;;;;;;;;;:26;42588:5;42568:26;;;;;;;;;;;;42561:33;;42346:256;;;;:::o;49818:91::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49889:12:::1;;;;;;;;;;;49888:13;49873:12;;:28;;;;;;;;;;;;;;;;;;49818:91::o:0;31577:185::-;31715:39;31732:4;31738:2;31742:7;31715:39;;;;;;;;;;;;:16;:39::i;:::-;31577:185;;;:::o;42868:233::-;42943:7;42979:30;:28;:30::i;:::-;42971:5;:38;42963:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43076:10;43087:5;43076:17;;;;;;;;:::i;:::-;;;;;;;;;;43069:24;;42868:233;;;:::o;51486:382::-;51603:7;51628:17;51668:11;51648:17;:15;:17::i;:::-;:31;;;;:::i;:::-;51628:51;;51690:15;51720:13;51750:82;51767:9;51757:7;:19;51750:82;;;51804:7;;51812;;;;;:::i;:::-;;;51804:16;;;;;;;:::i;:::-;;;;;;;;51793:27;;;;;:::i;:::-;;;51750:82;;;51859:1;51851:5;:9;;;;:::i;:::-;51844:16;;;;;51486:382;;;;;:::o;52150:101::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52223:20:::1;52235:7;52223:11;:20::i;:::-;52150:101:::0;:::o;28551:239::-;28623:7;28643:13;28659:7;:16;28667:7;28659:16;;;;;;;;;;;;;;;;;;;;;28643:32;;28711:1;28694:19;;:5;:19;;;;28686:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28777:5;28770:12;;;28551:239;;;:::o;28281:208::-;28353:7;28398:1;28381:19;;:5;:19;;;;28373:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;28465:9;:16;28475:5;28465:16;;;;;;;;;;;;;;;;28458:23;;28281:208;;;:::o;7415:103::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7480:30:::1;7507:1;7480:18;:30::i;:::-;7415:103::o:0;48456:41::-;;;;:::o;6764:87::-;6810:7;6837:6;;;;;;;;;;;6830:13;;6764:87;:::o;49605:90::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49679:8:::1;49671:5;:16;;;;49605:90:::0;:::o;29026:104::-;29082:13;29115:7;29108:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29026:104;:::o;30710:155::-;30805:52;30824:12;:10;:12::i;:::-;30838:8;30848;30805:18;:52::i;:::-;30710:155;;:::o;48716:881::-;48848:12;;;;;;;;;;;:50;;;;48865:15;;;;;;;;;;;:32;;;;;48884:13;48891:5;48884:6;:13::i;:::-;48865:32;48848:50;48826:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;49000:9;48986:23;;:10;:23;;;48964:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49101:1;49092:6;:10;:26;;;;;49116:2;49106:6;:12;;49092:26;49084:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49209:10;;49199:6;49183:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:36;;49161:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;49290:13;49307:15;;;;;;;;;;;:32;;;;;49326:13;49333:5;49326:6;:13::i;:::-;49307:32;49306:86;;49387:5;;49306:86;;;49356:15;;49306:86;49290:102;;49432:6;49424:5;:14;;;;:::i;:::-;49411:9;:27;;49403:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;49491:9;49486:104;49510:6;49506:1;:10;49486:104;;;49538:40;49548:10;49576:1;49560:13;:11;:13::i;:::-;:17;;;;:::i;:::-;49538:9;:40::i;:::-;49518:3;;;;;:::i;:::-;;;;49486:104;;;;48815:782;48716:881;;:::o;31833:328::-;32008:41;32027:12;:10;:12::i;:::-;32041:7;32008:18;:41::i;:::-;32000:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;32114:39;32128:4;32134:2;32138:7;32147:5;32114:13;:39::i;:::-;31833:328;;;;:::o;52259:467::-;52377:13;52430:16;52438:7;52430;:16::i;:::-;52408:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;52534:23;52560;52575:7;52560:14;:23::i;:::-;52534:49;;52640:1;52620:9;52614:23;:27;:104;;;;;;;;;;;;;;;;;52685:9;52668:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;52614:104;52594:124;;;52259:467;;;:::o;50407:82::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50476:5:::1;50469:4;:12;;;;50407:82:::0;:::o;51129:349::-;51177:7;51318:15;51360:16;51403:10;51275:161;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51243:212;;;;;;51217:253;;51197:273;;51129:349;:::o;30936:164::-;31033:4;31057:18;:25;31076:5;31057:25;;;;;;;;;;;;;;;:35;31083:8;31057:35;;;;;;;;;;;;;;;;;;;;;;;;;31050:42;;30936:164;;;;:::o;48517:32::-;;;;;;;;;;;;;:::o;49917:100::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49994:15:::1;;;;;;;;;;;49993:16;49975:15;;:34;;;;;;;;;;;;;;;;;;49917:100::o:0;7673:201::-;6995:12;:10;:12::i;:::-;6984:23;;:7;:5;:7::i;:::-;:23;;;6976:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7782:1:::1;7762:22;;:8;:22;;;;7754:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7838:28;7857:8;7838:18;:28::i;:::-;7673:201:::0;:::o;48349:31::-;;;;:::o;5488:98::-;5541:7;5568:10;5561:17;;5488:98;:::o;42038:224::-;42140:4;42179:35;42164:50;;;:11;:50;;;;:90;;;;42218:36;42242:11;42218:23;:36::i;:::-;42164:90;42157:97;;42038:224;;;:::o;33671:127::-;33736:4;33788:1;33760:30;;:7;:16;33768:7;33760:16;;;;;;;;;;;;;;;;;;;;;:30;;;;33753:37;;33671:127;;;:::o;37817:174::-;37919:2;37892:15;:24;37908:7;37892:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;37975:7;37971:2;37937:46;;37946:23;37961:7;37946:14;:23::i;:::-;37937:46;;;;;;;;;;;;37817:174;;:::o;33965:348::-;34058:4;34083:16;34091:7;34083;:16::i;:::-;34075:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34159:13;34175:23;34190:7;34175:14;:23::i;:::-;34159:39;;34228:5;34217:16;;:7;:16;;;:52;;;;34237:32;34254:5;34261:7;34237:16;:32::i;:::-;34217:52;:87;;;;34297:7;34273:31;;:20;34285:7;34273:11;:20::i;:::-;:31;;;34217:87;34209:96;;;33965:348;;;;:::o;37074:625::-;37233:4;37206:31;;:23;37221:7;37206:14;:23::i;:::-;:31;;;37198:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;37312:1;37298:16;;:2;:16;;;;37290:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;37368:39;37389:4;37395:2;37399:7;37368:20;:39::i;:::-;37472:29;37489:1;37493:7;37472:8;:29::i;:::-;37533:1;37514:9;:15;37524:4;37514:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;37562:1;37545:9;:13;37555:2;37545:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;37593:2;37574:7;:16;37582:7;37574:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;37632:7;37628:2;37613:27;;37622:4;37613:27;;;;;;;;;;;;37653:38;37673:4;37679:2;37683:7;37653:19;:38::i;:::-;37074:625;;;:::o;51925:103::-;52013:7;51997:13;:23;;;;;;;;;;;;:::i;:::-;;51925:103;:::o;8034:191::-;8108:16;8127:6;;;;;;;;;;;8108:25;;8153:8;8144:6;;:17;;;;;;;;;;;;;;;;;;8208:8;8177:40;;8198:8;8177:40;;;;;;;;;;;;8097:128;8034:191;:::o;38133:315::-;38288:8;38279:17;;:5;:17;;;;38271:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;38375:8;38337:18;:25;38356:5;38337:25;;;;;;;;;;;;;;;:35;38363:8;38337:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;38421:8;38399:41;;38414:5;38399:41;;;38431:8;38399:41;;;;;;:::i;:::-;;;;;;;;38133:315;;;:::o;50497:197::-;50560:4;50577:12;50619:10;50602:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;50592:39;;;;;;50577:54;;50649:37;50668:5;50675:4;;50681;50649:18;:37::i;:::-;50642:44;;;50497:197;;;:::o;34655:110::-;34731:26;34741:2;34745:7;34731:26;;;;;;;;;;;;:9;:26::i;:::-;34655:110;;:::o;33043:315::-;33200:28;33210:4;33216:2;33220:7;33200:9;:28::i;:::-;33247:48;33270:4;33276:2;33280:7;33289:5;33247:22;:48::i;:::-;33239:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;33043:315;;;;:::o;29201:334::-;29274:13;29308:16;29316:7;29308;:16::i;:::-;29300:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;29389:21;29413:10;:8;:10::i;:::-;29389:34;;29465:1;29447:7;29441:21;:25;:86;;;;;;;;;;;;;;;;;29493:7;29502:18;:7;:16;:18::i;:::-;29476:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;29441:86;29434:93;;;29201:334;;;:::o;27912:305::-;28014:4;28066:25;28051:40;;;:11;:40;;;;:105;;;;28123:33;28108:48;;;:11;:48;;;;28051:105;:158;;;;28173:36;28197:11;28173:23;:36::i;:::-;28051:158;28031:178;;27912:305;;;:::o;50702:207::-;50856:45;50883:4;50889:2;50893:7;50856:26;:45::i;:::-;50702:207;;;:::o;40895:125::-;;;;:::o;1220:190::-;1345:4;1398;1369:25;1382:5;1389:4;1369:12;:25::i;:::-;:33;1362:40;;1220:190;;;;;:::o;34992:321::-;35122:18;35128:2;35132:7;35122:5;:18::i;:::-;35173:54;35204:1;35208:2;35212:7;35221:5;35173:22;:54::i;:::-;35151:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;34992:321;;;:::o;39013:799::-;39168:4;39189:15;:2;:13;;;:15::i;:::-;39185:620;;;39241:2;39225:36;;;39262:12;:10;:12::i;:::-;39276:4;39282:7;39291:5;39225:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;39221:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39484:1;39467:6;:13;:18;39463:272;;;39510:60;;;;;;;;;;:::i;:::-;;;;;;;;39463:272;39685:6;39679:13;39670:6;39666:2;39662:15;39655:38;39221:529;39358:41;;;39348:51;;;:6;:51;;;;39341:58;;;;;39185:620;39789:4;39782:11;;39013:799;;;;;;;:::o;52036:106::-;52088:13;52121;52114:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52036:106;:::o;3050:723::-;3106:13;3336:1;3327:5;:10;3323:53;;;3354:10;;;;;;;;;;;;;;;;;;;;;3323:53;3386:12;3401:5;3386:20;;3417:14;3442:78;3457:1;3449:4;:9;3442:78;;3475:8;;;;;:::i;:::-;;;;3506:2;3498:10;;;;;:::i;:::-;;;3442:78;;;3530:19;3562:6;3552:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3530:39;;3580:154;3596:1;3587:5;:10;3580:154;;3624:1;3614:11;;;;;:::i;:::-;;;3691:2;3683:5;:10;;;;:::i;:::-;3670:2;:24;;;;:::i;:::-;3657:39;;3640:6;3647;3640:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3720:2;3711:11;;;;;:::i;:::-;;;3580:154;;;3758:6;3744:21;;;;;3050:723;;;;:::o;19571:157::-;19656:4;19695:25;19680:40;;;:11;:40;;;;19673:47;;19571:157;;;:::o;43714:589::-;43858:45;43885:4;43891:2;43895:7;43858:26;:45::i;:::-;43936:1;43920:18;;:4;:18;;;43916:187;;;43955:40;43987:7;43955:31;:40::i;:::-;43916:187;;;44025:2;44017:10;;:4;:10;;;44013:90;;44044:47;44077:4;44083:7;44044:32;:47::i;:::-;44013:90;43916:187;44131:1;44117:16;;:2;:16;;;44113:183;;;44150:45;44187:7;44150:36;:45::i;:::-;44113:183;;;44223:4;44217:10;;:2;:10;;;44213:83;;44244:40;44272:2;44276:7;44244:27;:40::i;:::-;44213:83;44113:183;43714:589;;;:::o;1771:675::-;1854:7;1874:20;1897:4;1874:27;;1917:9;1912:497;1936:5;:12;1932:1;:16;1912:497;;;1970:20;1993:5;1999:1;1993:8;;;;;;;;:::i;:::-;;;;;;;;1970:31;;2036:12;2020;:28;2016:382;;2163:42;2178:12;2192;2163:14;:42::i;:::-;2148:57;;2016:382;;;2340:42;2355:12;2369;2340:14;:42::i;:::-;2325:57;;2016:382;1955:454;1950:3;;;;;:::i;:::-;;;;1912:497;;;;2426:12;2419:19;;;1771:675;;;;:::o;35649:439::-;35743:1;35729:16;;:2;:16;;;;35721:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;35802:16;35810:7;35802;:16::i;:::-;35801:17;35793:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35864:45;35893:1;35897:2;35901:7;35864:20;:45::i;:::-;35939:1;35922:9;:13;35932:2;35922:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35970:2;35951:7;:16;35959:7;35951:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36015:7;36011:2;35990:33;;36007:1;35990:33;;;;;;;;;;;;36036:44;36064:1;36068:2;36072:7;36036:19;:44::i;:::-;35649:439;;:::o;9465:326::-;9525:4;9782:1;9760:7;:19;;;:23;9753:30;;9465:326;;;:::o;40384:126::-;;;;:::o;45026:164::-;45130:10;:17;;;;45103:15;:24;45119:7;45103:24;;;;;;;;;;;:44;;;;45158:10;45174:7;45158:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45026:164;:::o;45817:988::-;46083:22;46133:1;46108:22;46125:4;46108:16;:22::i;:::-;:26;;;;:::i;:::-;46083:51;;46145:18;46166:17;:26;46184:7;46166:26;;;;;;;;;;;;46145:47;;46313:14;46299:10;:28;46295:328;;46344:19;46366:12;:18;46379:4;46366:18;;;;;;;;;;;;;;;:34;46385:14;46366:34;;;;;;;;;;;;46344:56;;46450:11;46417:12;:18;46430:4;46417:18;;;;;;;;;;;;;;;:30;46436:10;46417:30;;;;;;;;;;;:44;;;;46567:10;46534:17;:30;46552:11;46534:30;;;;;;;;;;;:43;;;;46329:294;46295:328;46719:17;:26;46737:7;46719:26;;;;;;;;;;;46712:33;;;46763:12;:18;46776:4;46763:18;;;;;;;;;;;;;;;:34;46782:14;46763:34;;;;;;;;;;;46756:41;;;45898:907;;45817:988;;:::o;47100:1079::-;47353:22;47398:1;47378:10;:17;;;;:21;;;;:::i;:::-;47353:46;;47410:18;47431:15;:24;47447:7;47431:24;;;;;;;;;;;;47410:45;;47782:19;47804:10;47815:14;47804:26;;;;;;;;:::i;:::-;;;;;;;;;;47782:48;;47868:11;47843:10;47854;47843:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;47979:10;47948:15;:28;47964:11;47948:28;;;;;;;;;;;:41;;;;48120:15;:24;48136:7;48120:24;;;;;;;;;;;48113:31;;;48155:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47171:1008;;;47100:1079;:::o;44604:221::-;44689:14;44706:20;44723:2;44706:16;:20::i;:::-;44689:37;;44764:7;44737:12;:16;44750:2;44737:16;;;;;;;;;;;;;;;:24;44754:6;44737:24;;;;;;;;;;;:34;;;;44811:6;44782:17;:26;44800:7;44782:26;;;;;;;;;;;:35;;;;44678:147;44604:221;;:::o;2454:224::-;2522:13;2585:1;2579:4;2572:15;2614:1;2608:4;2601:15;2655:4;2649;2639:21;2630:30;;2454:224;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:117::-;6024:1;6021;6014:12;6038:117;6147:1;6144;6137:12;6161:117;6270:1;6267;6260:12;6301:568;6374:8;6384:6;6434:3;6427:4;6419:6;6415:17;6411:27;6401:122;;6442:79;;:::i;:::-;6401:122;6555:6;6542:20;6532:30;;6585:18;6577:6;6574:30;6571:117;;;6607:79;;:::i;:::-;6571:117;6721:4;6713:6;6709:17;6697:29;;6775:3;6767:4;6759:6;6755:17;6745:8;6741:32;6738:41;6735:128;;;6782:79;;:::i;:::-;6735:128;6301:568;;;;;:::o;6875:704::-;6970:6;6978;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7189:1;7178:9;7174:17;7161:31;7219:18;7211:6;7208:30;7205:117;;;7241:79;;:::i;:::-;7205:117;7354:80;7426:7;7417:6;7406:9;7402:22;7354:80;:::i;:::-;7336:98;;;;7132:312;7483:2;7509:53;7554:7;7545:6;7534:9;7530:22;7509:53;:::i;:::-;7499:63;;7454:118;6875:704;;;;;:::o;7585:117::-;7694:1;7691;7684:12;7708:180;7756:77;7753:1;7746:88;7853:4;7850:1;7843:15;7877:4;7874:1;7867:15;7894:281;7977:27;7999:4;7977:27;:::i;:::-;7969:6;7965:40;8107:6;8095:10;8092:22;8071:18;8059:10;8056:34;8053:62;8050:88;;;8118:18;;:::i;:::-;8050:88;8158:10;8154:2;8147:22;7937:238;7894:281;;:::o;8181:129::-;8215:6;8242:20;;:::i;:::-;8232:30;;8271:33;8299:4;8291:6;8271:33;:::i;:::-;8181:129;;;:::o;8316:308::-;8378:4;8468:18;8460:6;8457:30;8454:56;;;8490:18;;:::i;:::-;8454:56;8528:29;8550:6;8528:29;:::i;:::-;8520:37;;8612:4;8606;8602:15;8594:23;;8316:308;;;:::o;8630:154::-;8714:6;8709:3;8704;8691:30;8776:1;8767:6;8762:3;8758:16;8751:27;8630:154;;;:::o;8790:412::-;8868:5;8893:66;8909:49;8951:6;8909:49;:::i;:::-;8893:66;:::i;:::-;8884:75;;8982:6;8975:5;8968:21;9020:4;9013:5;9009:16;9058:3;9049:6;9044:3;9040:16;9037:25;9034:112;;;9065:79;;:::i;:::-;9034:112;9155:41;9189:6;9184:3;9179;9155:41;:::i;:::-;8874:328;8790:412;;;;;:::o;9222:340::-;9278:5;9327:3;9320:4;9312:6;9308:17;9304:27;9294:122;;9335:79;;:::i;:::-;9294:122;9452:6;9439:20;9477:79;9552:3;9544:6;9537:4;9529:6;9525:17;9477:79;:::i;:::-;9468:88;;9284:278;9222:340;;;;:::o;9568:509::-;9637:6;9686:2;9674:9;9665:7;9661:23;9657:32;9654:119;;;9692:79;;:::i;:::-;9654:119;9840:1;9829:9;9825:17;9812:31;9870:18;9862:6;9859:30;9856:117;;;9892:79;;:::i;:::-;9856:117;9997:63;10052:7;10043:6;10032:9;10028:22;9997:63;:::i;:::-;9987:73;;9783:287;9568:509;;;;:::o;10083:329::-;10142:6;10191:2;10179:9;10170:7;10166:23;10162:32;10159:119;;;10197:79;;:::i;:::-;10159:119;10317:1;10342:53;10387:7;10378:6;10367:9;10363:22;10342:53;:::i;:::-;10332:63;;10288:117;10083:329;;;;:::o;10418:116::-;10488:21;10503:5;10488:21;:::i;:::-;10481:5;10478:32;10468:60;;10524:1;10521;10514:12;10468:60;10418:116;:::o;10540:133::-;10583:5;10621:6;10608:20;10599:29;;10637:30;10661:5;10637:30;:::i;:::-;10540:133;;;;:::o;10679:468::-;10744:6;10752;10801:2;10789:9;10780:7;10776:23;10772:32;10769:119;;;10807:79;;:::i;:::-;10769:119;10927:1;10952:53;10997:7;10988:6;10977:9;10973:22;10952:53;:::i;:::-;10942:63;;10898:117;11054:2;11080:50;11122:7;11113:6;11102:9;11098:22;11080:50;:::i;:::-;11070:60;;11025:115;10679:468;;;;;:::o;11153:311::-;11230:4;11320:18;11312:6;11309:30;11306:56;;;11342:18;;:::i;:::-;11306:56;11392:4;11384:6;11380:17;11372:25;;11452:4;11446;11442:15;11434:23;;11153:311;;;:::o;11470:77::-;11507:7;11536:5;11525:16;;11470:77;;;:::o;11553:122::-;11626:24;11644:5;11626:24;:::i;:::-;11619:5;11616:35;11606:63;;11665:1;11662;11655:12;11606:63;11553:122;:::o;11681:139::-;11727:5;11765:6;11752:20;11743:29;;11781:33;11808:5;11781:33;:::i;:::-;11681:139;;;;:::o;11843:710::-;11939:5;11964:81;11980:64;12037:6;11980:64;:::i;:::-;11964:81;:::i;:::-;11955:90;;12065:5;12094:6;12087:5;12080:21;12128:4;12121:5;12117:16;12110:23;;12181:4;12173:6;12169:17;12161:6;12157:30;12210:3;12202:6;12199:15;12196:122;;;12229:79;;:::i;:::-;12196:122;12344:6;12327:220;12361:6;12356:3;12353:15;12327:220;;;12436:3;12465:37;12498:3;12486:10;12465:37;:::i;:::-;12460:3;12453:50;12532:4;12527:3;12523:14;12516:21;;12403:144;12387:4;12382:3;12378:14;12371:21;;12327:220;;;12331:21;11945:608;;11843:710;;;;;:::o;12576:370::-;12647:5;12696:3;12689:4;12681:6;12677:17;12673:27;12663:122;;12704:79;;:::i;:::-;12663:122;12821:6;12808:20;12846:94;12936:3;12928:6;12921:4;12913:6;12909:17;12846:94;:::i;:::-;12837:103;;12653:293;12576:370;;;;:::o;12952:684::-;13045:6;13053;13102:2;13090:9;13081:7;13077:23;13073:32;13070:119;;;13108:79;;:::i;:::-;13070:119;13228:1;13253:53;13298:7;13289:6;13278:9;13274:22;13253:53;:::i;:::-;13243:63;;13199:117;13383:2;13372:9;13368:18;13355:32;13414:18;13406:6;13403:30;13400:117;;;13436:79;;:::i;:::-;13400:117;13541:78;13611:7;13602:6;13591:9;13587:22;13541:78;:::i;:::-;13531:88;;13326:303;12952:684;;;;;:::o;13642:307::-;13703:4;13793:18;13785:6;13782:30;13779:56;;;13815:18;;:::i;:::-;13779:56;13853:29;13875:6;13853:29;:::i;:::-;13845:37;;13937:4;13931;13927:15;13919:23;;13642:307;;;:::o;13955:410::-;14032:5;14057:65;14073:48;14114:6;14073:48;:::i;:::-;14057:65;:::i;:::-;14048:74;;14145:6;14138:5;14131:21;14183:4;14176:5;14172:16;14221:3;14212:6;14207:3;14203:16;14200:25;14197:112;;;14228:79;;:::i;:::-;14197:112;14318:41;14352:6;14347:3;14342;14318:41;:::i;:::-;14038:327;13955:410;;;;;:::o;14384:338::-;14439:5;14488:3;14481:4;14473:6;14469:17;14465:27;14455:122;;14496:79;;:::i;:::-;14455:122;14613:6;14600:20;14638:78;14712:3;14704:6;14697:4;14689:6;14685:17;14638:78;:::i;:::-;14629:87;;14445:277;14384:338;;;;:::o;14728:943::-;14823:6;14831;14839;14847;14896:3;14884:9;14875:7;14871:23;14867:33;14864:120;;;14903:79;;:::i;:::-;14864:120;15023:1;15048:53;15093:7;15084:6;15073:9;15069:22;15048:53;:::i;:::-;15038:63;;14994:117;15150:2;15176:53;15221:7;15212:6;15201:9;15197:22;15176:53;:::i;:::-;15166:63;;15121:118;15278:2;15304:53;15349:7;15340:6;15329:9;15325:22;15304:53;:::i;:::-;15294:63;;15249:118;15434:2;15423:9;15419:18;15406:32;15465:18;15457:6;15454:30;15451:117;;;15487:79;;:::i;:::-;15451:117;15592:62;15646:7;15637:6;15626:9;15622:22;15592:62;:::i;:::-;15582:72;;15377:287;14728:943;;;;;;;:::o;15677:329::-;15736:6;15785:2;15773:9;15764:7;15760:23;15756:32;15753:119;;;15791:79;;:::i;:::-;15753:119;15911:1;15936:53;15981:7;15972:6;15961:9;15957:22;15936:53;:::i;:::-;15926:63;;15882:117;15677:329;;;;:::o;16012:474::-;16080:6;16088;16137:2;16125:9;16116:7;16112:23;16108:32;16105:119;;;16143:79;;:::i;:::-;16105:119;16263:1;16288:53;16333:7;16324:6;16313:9;16309:22;16288:53;:::i;:::-;16278:63;;16234:117;16390:2;16416:53;16461:7;16452:6;16441:9;16437:22;16416:53;:::i;:::-;16406:63;;16361:118;16012:474;;;;;:::o;16492:182::-;16632:34;16628:1;16620:6;16616:14;16609:58;16492:182;:::o;16680:366::-;16822:3;16843:67;16907:2;16902:3;16843:67;:::i;:::-;16836:74;;16919:93;17008:3;16919:93;:::i;:::-;17037:2;17032:3;17028:12;17021:19;;16680:366;;;:::o;17052:419::-;17218:4;17256:2;17245:9;17241:18;17233:26;;17305:9;17299:4;17295:20;17291:1;17280:9;17276:17;17269:47;17333:131;17459:4;17333:131;:::i;:::-;17325:139;;17052:419;;;:::o;17477:180::-;17525:77;17522:1;17515:88;17622:4;17619:1;17612:15;17646:4;17643:1;17636:15;17663:180;17711:77;17708:1;17701:88;17808:4;17805:1;17798:15;17832:4;17829:1;17822:15;17849:185;17889:1;17906:20;17924:1;17906:20;:::i;:::-;17901:25;;17940:20;17958:1;17940:20;:::i;:::-;17935:25;;17979:1;17969:35;;17984:18;;:::i;:::-;17969:35;18026:1;18023;18019:9;18014:14;;17849:185;;;;:::o;18040:348::-;18080:7;18103:20;18121:1;18103:20;:::i;:::-;18098:25;;18137:20;18155:1;18137:20;:::i;:::-;18132:25;;18325:1;18257:66;18253:74;18250:1;18247:81;18242:1;18235:9;18228:17;18224:105;18221:131;;;18332:18;;:::i;:::-;18221:131;18380:1;18377;18373:9;18362:20;;18040:348;;;;:::o;18394:180::-;18442:77;18439:1;18432:88;18539:4;18536:1;18529:15;18563:4;18560:1;18553:15;18580:320;18624:6;18661:1;18655:4;18651:12;18641:22;;18708:1;18702:4;18698:12;18729:18;18719:81;;18785:4;18777:6;18773:17;18763:27;;18719:81;18847:2;18839:6;18836:14;18816:18;18813:38;18810:84;;;18866:18;;:::i;:::-;18810:84;18631:269;18580:320;;;:::o;18906:231::-;19046:34;19042:1;19034:6;19030:14;19023:58;19115:14;19110:2;19102:6;19098:15;19091:39;18906:231;:::o;19143:366::-;19285:3;19306:67;19370:2;19365:3;19306:67;:::i;:::-;19299:74;;19382:93;19471:3;19382:93;:::i;:::-;19500:2;19495:3;19491:12;19484:19;;19143:366;;;:::o;19515:419::-;19681:4;19719:2;19708:9;19704:18;19696:26;;19768:9;19762:4;19758:20;19754:1;19743:9;19739:17;19732:47;19796:131;19922:4;19796:131;:::i;:::-;19788:139;;19515:419;;;:::o;19940:220::-;20080:34;20076:1;20068:6;20064:14;20057:58;20149:3;20144:2;20136:6;20132:15;20125:28;19940:220;:::o;20166:366::-;20308:3;20329:67;20393:2;20388:3;20329:67;:::i;:::-;20322:74;;20405:93;20494:3;20405:93;:::i;:::-;20523:2;20518:3;20514:12;20507:19;;20166:366;;;:::o;20538:419::-;20704:4;20742:2;20731:9;20727:18;20719:26;;20791:9;20785:4;20781:20;20777:1;20766:9;20762:17;20755:47;20819:131;20945:4;20819:131;:::i;:::-;20811:139;;20538:419;;;:::o;20963:243::-;21103:34;21099:1;21091:6;21087:14;21080:58;21172:26;21167:2;21159:6;21155:15;21148:51;20963:243;:::o;21212:366::-;21354:3;21375:67;21439:2;21434:3;21375:67;:::i;:::-;21368:74;;21451:93;21540:3;21451:93;:::i;:::-;21569:2;21564:3;21560:12;21553:19;;21212:366;;;:::o;21584:419::-;21750:4;21788:2;21777:9;21773:18;21765:26;;21837:9;21831:4;21827:20;21823:1;21812:9;21808:17;21801:47;21865:131;21991:4;21865:131;:::i;:::-;21857:139;;21584:419;;;:::o;22009:236::-;22149:34;22145:1;22137:6;22133:14;22126:58;22218:19;22213:2;22205:6;22201:15;22194:44;22009:236;:::o;22251:366::-;22393:3;22414:67;22478:2;22473:3;22414:67;:::i;:::-;22407:74;;22490:93;22579:3;22490:93;:::i;:::-;22608:2;22603:3;22599:12;22592:19;;22251:366;;;:::o;22623:419::-;22789:4;22827:2;22816:9;22812:18;22804:26;;22876:9;22870:4;22866:20;22862:1;22851:9;22847:17;22840:47;22904:131;23030:4;22904:131;:::i;:::-;22896:139;;22623:419;;;:::o;23048:230::-;23188:34;23184:1;23176:6;23172:14;23165:58;23257:13;23252:2;23244:6;23240:15;23233:38;23048:230;:::o;23284:366::-;23426:3;23447:67;23511:2;23506:3;23447:67;:::i;:::-;23440:74;;23523:93;23612:3;23523:93;:::i;:::-;23641:2;23636:3;23632:12;23625:19;;23284:366;;;:::o;23656:419::-;23822:4;23860:2;23849:9;23845:18;23837:26;;23909:9;23903:4;23899:20;23895:1;23884:9;23880:17;23873:47;23937:131;24063:4;23937:131;:::i;:::-;23929:139;;23656:419;;;:::o;24081:231::-;24221:34;24217:1;24209:6;24205:14;24198:58;24290:14;24285:2;24277:6;24273:15;24266:39;24081:231;:::o;24318:366::-;24460:3;24481:67;24545:2;24540:3;24481:67;:::i;:::-;24474:74;;24557:93;24646:3;24557:93;:::i;:::-;24675:2;24670:3;24666:12;24659:19;;24318:366;;;:::o;24690:419::-;24856:4;24894:2;24883:9;24879:18;24871:26;;24943:9;24937:4;24933:20;24929:1;24918:9;24914:17;24907:47;24971:131;25097:4;24971:131;:::i;:::-;24963:139;;24690:419;;;:::o;25115:180::-;25163:77;25160:1;25153:88;25260:4;25257:1;25250:15;25284:4;25281:1;25274:15;25301:176;25333:1;25350:20;25368:1;25350:20;:::i;:::-;25345:25;;25384:20;25402:1;25384:20;:::i;:::-;25379:25;;25423:1;25413:35;;25428:18;;:::i;:::-;25413:35;25469:1;25466;25462:9;25457:14;;25301:176;;;;:::o;25483:233::-;25522:3;25545:24;25563:5;25545:24;:::i;:::-;25536:33;;25591:66;25584:5;25581:77;25578:103;;;25661:18;;:::i;:::-;25578:103;25708:1;25701:5;25697:13;25690:20;;25483:233;;;:::o;25722:305::-;25762:3;25781:20;25799:1;25781:20;:::i;:::-;25776:25;;25815:20;25833:1;25815:20;:::i;:::-;25810:25;;25969:1;25901:66;25897:74;25894:1;25891:81;25888:107;;;25975:18;;:::i;:::-;25888:107;26019:1;26016;26012:9;26005:16;;25722:305;;;;:::o;26033:191::-;26073:4;26093:20;26111:1;26093:20;:::i;:::-;26088:25;;26127:20;26145:1;26127:20;:::i;:::-;26122:25;;26166:1;26163;26160:8;26157:34;;;26171:18;;:::i;:::-;26157:34;26216:1;26213;26209:9;26201:17;;26033:191;;;;:::o;26230:228::-;26370:34;26366:1;26358:6;26354:14;26347:58;26439:11;26434:2;26426:6;26422:15;26415:36;26230:228;:::o;26464:366::-;26606:3;26627:67;26691:2;26686:3;26627:67;:::i;:::-;26620:74;;26703:93;26792:3;26703:93;:::i;:::-;26821:2;26816:3;26812:12;26805:19;;26464:366;;;:::o;26836:419::-;27002:4;27040:2;27029:9;27025:18;27017:26;;27089:9;27083:4;27079:20;27075:1;27064:9;27060:17;27053:47;27117:131;27243:4;27117:131;:::i;:::-;27109:139;;26836:419;;;:::o;27261:229::-;27401:34;27397:1;27389:6;27385:14;27378:58;27470:12;27465:2;27457:6;27453:15;27446:37;27261:229;:::o;27496:366::-;27638:3;27659:67;27723:2;27718:3;27659:67;:::i;:::-;27652:74;;27735:93;27824:3;27735:93;:::i;:::-;27853:2;27848:3;27844:12;27837:19;;27496:366;;;:::o;27868:419::-;28034:4;28072:2;28061:9;28057:18;28049:26;;28121:9;28115:4;28111:20;28107:1;28096:9;28092:17;28085:47;28149:131;28275:4;28149:131;:::i;:::-;28141:139;;27868:419;;;:::o;28293:177::-;28433:29;28429:1;28421:6;28417:14;28410:53;28293:177;:::o;28476:366::-;28618:3;28639:67;28703:2;28698:3;28639:67;:::i;:::-;28632:74;;28715:93;28804:3;28715:93;:::i;:::-;28833:2;28828:3;28824:12;28817:19;;28476:366;;;:::o;28848:419::-;29014:4;29052:2;29041:9;29037:18;29029:26;;29101:9;29095:4;29091:20;29087:1;29076:9;29072:17;29065:47;29129:131;29255:4;29129:131;:::i;:::-;29121:139;;28848:419;;;:::o;29273:223::-;29413:34;29409:1;29401:6;29397:14;29390:58;29482:6;29477:2;29469:6;29465:15;29458:31;29273:223;:::o;29502:366::-;29644:3;29665:67;29729:2;29724:3;29665:67;:::i;:::-;29658:74;;29741:93;29830:3;29741:93;:::i;:::-;29859:2;29854:3;29850:12;29843:19;;29502:366;;;:::o;29874:419::-;30040:4;30078:2;30067:9;30063:18;30055:26;;30127:9;30121:4;30117:20;30113:1;30102:9;30098:17;30091:47;30155:131;30281:4;30155:131;:::i;:::-;30147:139;;29874:419;;;:::o;30299:177::-;30439:29;30435:1;30427:6;30423:14;30416:53;30299:177;:::o;30482:366::-;30624:3;30645:67;30709:2;30704:3;30645:67;:::i;:::-;30638:74;;30721:93;30810:3;30721:93;:::i;:::-;30839:2;30834:3;30830:12;30823:19;;30482:366;;;:::o;30854:419::-;31020:4;31058:2;31047:9;31043:18;31035:26;;31107:9;31101:4;31097:20;31093:1;31082:9;31078:17;31071:47;31135:131;31261:4;31135:131;:::i;:::-;31127:139;;30854:419;;;:::o;31279:182::-;31419:34;31415:1;31407:6;31403:14;31396:58;31279:182;:::o;31467:366::-;31609:3;31630:67;31694:2;31689:3;31630:67;:::i;:::-;31623:74;;31706:93;31795:3;31706:93;:::i;:::-;31824:2;31819:3;31815:12;31808:19;;31467:366;;;:::o;31839:419::-;32005:4;32043:2;32032:9;32028:18;32020:26;;32092:9;32086:4;32082:20;32078:1;32067:9;32063:17;32056:47;32120:131;32246:4;32120:131;:::i;:::-;32112:139;;31839:419;;;:::o;32264:180::-;32404:32;32400:1;32392:6;32388:14;32381:56;32264:180;:::o;32450:366::-;32592:3;32613:67;32677:2;32672:3;32613:67;:::i;:::-;32606:74;;32689:93;32778:3;32689:93;:::i;:::-;32807:2;32802:3;32798:12;32791:19;;32450:366;;;:::o;32822:419::-;32988:4;33026:2;33015:9;33011:18;33003:26;;33075:9;33069:4;33065:20;33061:1;33050:9;33046:17;33039:47;33103:131;33229:4;33103:131;:::i;:::-;33095:139;;32822:419;;;:::o;33247:234::-;33387:34;33383:1;33375:6;33371:14;33364:58;33456:17;33451:2;33443:6;33439:15;33432:42;33247:234;:::o;33487:366::-;33629:3;33650:67;33714:2;33709:3;33650:67;:::i;:::-;33643:74;;33726:93;33815:3;33726:93;:::i;:::-;33844:2;33839:3;33835:12;33828:19;;33487:366;;;:::o;33859:419::-;34025:4;34063:2;34052:9;34048:18;34040:26;;34112:9;34106:4;34102:20;34098:1;34087:9;34083:17;34076:47;34140:131;34266:4;34140:131;:::i;:::-;34132:139;;33859:419;;;:::o;34284:148::-;34386:11;34423:3;34408:18;;34284:148;;;;:::o;34438:377::-;34544:3;34572:39;34605:5;34572:39;:::i;:::-;34627:89;34709:6;34704:3;34627:89;:::i;:::-;34620:96;;34725:52;34770:6;34765:3;34758:4;34751:5;34747:16;34725:52;:::i;:::-;34802:6;34797:3;34793:16;34786:23;;34548:267;34438:377;;;;:::o;34821:275::-;34953:3;34975:95;35066:3;35057:6;34975:95;:::i;:::-;34968:102;;35087:3;35080:10;;34821:275;;;;:::o;35102:79::-;35141:7;35170:5;35159:16;;35102:79;;;:::o;35187:157::-;35292:45;35312:24;35330:5;35312:24;:::i;:::-;35292:45;:::i;:::-;35287:3;35280:58;35187:157;;:::o;35350:94::-;35383:8;35431:5;35427:2;35423:14;35402:35;;35350:94;;;:::o;35450:::-;35489:7;35518:20;35532:5;35518:20;:::i;:::-;35507:31;;35450:94;;;:::o;35550:100::-;35589:7;35618:26;35638:5;35618:26;:::i;:::-;35607:37;;35550:100;;;:::o;35656:157::-;35761:45;35781:24;35799:5;35781:24;:::i;:::-;35761:45;:::i;:::-;35756:3;35749:58;35656:157;;:::o;35819:538::-;35987:3;36002:75;36073:3;36064:6;36002:75;:::i;:::-;36102:2;36097:3;36093:12;36086:19;;36115:75;36186:3;36177:6;36115:75;:::i;:::-;36215:2;36210:3;36206:12;36199:19;;36228:75;36299:3;36290:6;36228:75;:::i;:::-;36328:2;36323:3;36319:12;36312:19;;36348:3;36341:10;;35819:538;;;;;;:::o;36363:225::-;36503:34;36499:1;36491:6;36487:14;36480:58;36572:8;36567:2;36559:6;36555:15;36548:33;36363:225;:::o;36594:366::-;36736:3;36757:67;36821:2;36816:3;36757:67;:::i;:::-;36750:74;;36833:93;36922:3;36833:93;:::i;:::-;36951:2;36946:3;36942:12;36935:19;;36594:366;;;:::o;36966:419::-;37132:4;37170:2;37159:9;37155:18;37147:26;;37219:9;37213:4;37209:20;37205:1;37194:9;37190:17;37183:47;37247:131;37373:4;37247:131;:::i;:::-;37239:139;;36966:419;;;:::o;37391:231::-;37531:34;37527:1;37519:6;37515:14;37508:58;37600:14;37595:2;37587:6;37583:15;37576:39;37391:231;:::o;37628:366::-;37770:3;37791:67;37855:2;37850:3;37791:67;:::i;:::-;37784:74;;37867:93;37956:3;37867:93;:::i;:::-;37985:2;37980:3;37976:12;37969:19;;37628:366;;;:::o;38000:419::-;38166:4;38204:2;38193:9;38189:18;38181:26;;38253:9;38247:4;38243:20;38239:1;38228:9;38224:17;38217:47;38281:131;38407:4;38281:131;:::i;:::-;38273:139;;38000:419;;;:::o;38425:224::-;38565:34;38561:1;38553:6;38549:14;38542:58;38634:7;38629:2;38621:6;38617:15;38610:32;38425:224;:::o;38655:366::-;38797:3;38818:67;38882:2;38877:3;38818:67;:::i;:::-;38811:74;;38894:93;38983:3;38894:93;:::i;:::-;39012:2;39007:3;39003:12;38996:19;;38655:366;;;:::o;39027:419::-;39193:4;39231:2;39220:9;39216:18;39208:26;;39280:9;39274:4;39270:20;39266:1;39255:9;39251:17;39244:47;39308:131;39434:4;39308:131;:::i;:::-;39300:139;;39027:419;;;:::o;39452:223::-;39592:34;39588:1;39580:6;39576:14;39569:58;39661:6;39656:2;39648:6;39644:15;39637:31;39452:223;:::o;39681:366::-;39823:3;39844:67;39908:2;39903:3;39844:67;:::i;:::-;39837:74;;39920:93;40009:3;39920:93;:::i;:::-;40038:2;40033:3;40029:12;40022:19;;39681:366;;;:::o;40053:419::-;40219:4;40257:2;40246:9;40242:18;40234:26;;40306:9;40300:4;40296:20;40292:1;40281:9;40277:17;40270:47;40334:131;40460:4;40334:131;:::i;:::-;40326:139;;40053:419;;;:::o;40478:175::-;40618:27;40614:1;40606:6;40602:14;40595:51;40478:175;:::o;40659:366::-;40801:3;40822:67;40886:2;40881:3;40822:67;:::i;:::-;40815:74;;40898:93;40987:3;40898:93;:::i;:::-;41016:2;41011:3;41007:12;41000:19;;40659:366;;;:::o;41031:419::-;41197:4;41235:2;41224:9;41220:18;41212:26;;41284:9;41278:4;41274:20;41270:1;41259:9;41255:17;41248:47;41312:131;41438:4;41312:131;:::i;:::-;41304:139;;41031:419;;;:::o;41456:256::-;41568:3;41583:75;41654:3;41645:6;41583:75;:::i;:::-;41683:2;41678:3;41674:12;41667:19;;41703:3;41696:10;;41456:256;;;;:::o;41718:237::-;41858:34;41854:1;41846:6;41842:14;41835:58;41927:20;41922:2;41914:6;41910:15;41903:45;41718:237;:::o;41961:366::-;42103:3;42124:67;42188:2;42183:3;42124:67;:::i;:::-;42117:74;;42200:93;42289:3;42200:93;:::i;:::-;42318:2;42313:3;42309:12;42302:19;;41961:366;;;:::o;42333:419::-;42499:4;42537:2;42526:9;42522:18;42514:26;;42586:9;42580:4;42576:20;42572:1;42561:9;42557:17;42550:47;42614:131;42740:4;42614:131;:::i;:::-;42606:139;;42333:419;;;:::o;42758:435::-;42938:3;42960:95;43051:3;43042:6;42960:95;:::i;:::-;42953:102;;43072:95;43163:3;43154:6;43072:95;:::i;:::-;43065:102;;43184:3;43177:10;;42758:435;;;;;:::o;43199:98::-;43250:6;43284:5;43278:12;43268:22;;43199:98;;;:::o;43303:168::-;43386:11;43420:6;43415:3;43408:19;43460:4;43455:3;43451:14;43436:29;;43303:168;;;;:::o;43477:360::-;43563:3;43591:38;43623:5;43591:38;:::i;:::-;43645:70;43708:6;43703:3;43645:70;:::i;:::-;43638:77;;43724:52;43769:6;43764:3;43757:4;43750:5;43746:16;43724:52;:::i;:::-;43801:29;43823:6;43801:29;:::i;:::-;43796:3;43792:39;43785:46;;43567:270;43477:360;;;;:::o;43843:640::-;44038:4;44076:3;44065:9;44061:19;44053:27;;44090:71;44158:1;44147:9;44143:17;44134:6;44090:71;:::i;:::-;44171:72;44239:2;44228:9;44224:18;44215:6;44171:72;:::i;:::-;44253;44321:2;44310:9;44306:18;44297:6;44253:72;:::i;:::-;44372:9;44366:4;44362:20;44357:2;44346:9;44342:18;44335:48;44400:76;44471:4;44462:6;44400:76;:::i;:::-;44392:84;;43843:640;;;;;;;:::o;44489:141::-;44545:5;44576:6;44570:13;44561:22;;44592:32;44618:5;44592:32;:::i;:::-;44489:141;;;;:::o;44636:349::-;44705:6;44754:2;44742:9;44733:7;44729:23;44725:32;44722:119;;;44760:79;;:::i;:::-;44722:119;44880:1;44905:63;44960:7;44951:6;44940:9;44936:22;44905:63;:::i;:::-;44895:73;;44851:127;44636:349;;;;:::o;44991:182::-;45131:34;45127:1;45119:6;45115:14;45108:58;44991:182;:::o;45179:366::-;45321:3;45342:67;45406:2;45401:3;45342:67;:::i;:::-;45335:74;;45418:93;45507:3;45418:93;:::i;:::-;45536:2;45531:3;45527:12;45520:19;;45179:366;;;:::o;45551:419::-;45717:4;45755:2;45744:9;45740:18;45732:26;;45804:9;45798:4;45794:20;45790:1;45779:9;45775:17;45768:47;45832:131;45958:4;45832:131;:::i;:::-;45824:139;;45551:419;;;:::o;45976:178::-;46116:30;46112:1;46104:6;46100:14;46093:54;45976:178;:::o;46160:366::-;46302:3;46323:67;46387:2;46382:3;46323:67;:::i;:::-;46316:74;;46399:93;46488:3;46399:93;:::i;:::-;46517:2;46512:3;46508:12;46501:19;;46160:366;;;:::o;46532:419::-;46698:4;46736:2;46725:9;46721:18;46713:26;;46785:9;46779:4;46775:20;46771:1;46760:9;46756:17;46749:47;46813:131;46939:4;46813:131;:::i;:::-;46805:139;;46532:419;;;:::o;46957:180::-;47005:77;47002:1;46995:88;47102:4;47099:1;47092:15;47126:4;47123:1;47116:15
Swarm Source
ipfs://266679178d0172ef007e74e4d7894296b24cbe80eebbb3baee010fa3741693dd
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.