Feature Tip: Add private address tag to any address under My Name Tag !
Overview
ETH Balance
0 ETH
Eth Value
$0.00More Info
Private Name Tags
ContractCreator
TokenTracker
Latest 25 from a total of 913 transactions
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
Burn And Combine | 19758106 | 265 days ago | IN | 0 ETH | 0.00039926 | ||||
Burn And Combine | 19758095 | 265 days ago | IN | 0 ETH | 0.00038943 | ||||
Burn And Combine | 19758085 | 265 days ago | IN | 0 ETH | 0.00049007 | ||||
Burn And Combine | 19758071 | 265 days ago | IN | 0 ETH | 0.00070157 | ||||
Set Approval For... | 18288194 | 471 days ago | IN | 0 ETH | 0.0003543 | ||||
Burn And Combine | 18067230 | 502 days ago | IN | 0 ETH | 0.00107142 | ||||
Burn And Combine | 18067198 | 502 days ago | IN | 0 ETH | 0.00109103 | ||||
Burn And Combine | 18067195 | 502 days ago | IN | 0 ETH | 0.0010432 | ||||
Burn And Combine | 18067194 | 502 days ago | IN | 0 ETH | 0.00108591 | ||||
Burn And Combine | 18067193 | 502 days ago | IN | 0 ETH | 0.00118151 | ||||
Burn And Combine | 18067148 | 502 days ago | IN | 0 ETH | 0.00102899 | ||||
Burn And Combine | 18067146 | 502 days ago | IN | 0 ETH | 0.00090521 | ||||
Burn And Combine | 18067144 | 502 days ago | IN | 0 ETH | 0.00087603 | ||||
Burn And Combine | 18067140 | 502 days ago | IN | 0 ETH | 0.00093223 | ||||
Burn And Combine | 18067137 | 502 days ago | IN | 0 ETH | 0.00161901 | ||||
Burn And Combine | 18067136 | 502 days ago | IN | 0 ETH | 0.00163396 | ||||
Burn And Combine | 18067135 | 502 days ago | IN | 0 ETH | 0.00158267 | ||||
Burn And Combine | 18067133 | 502 days ago | IN | 0 ETH | 0.00163849 | ||||
Burn And Combine | 18067132 | 502 days ago | IN | 0 ETH | 0.0016133 | ||||
Burn And Combine | 18067131 | 502 days ago | IN | 0 ETH | 0.00146723 | ||||
Burn And Combine | 18067122 | 502 days ago | IN | 0 ETH | 0.00154332 | ||||
Burn And Combine | 18067101 | 502 days ago | IN | 0 ETH | 0.00136337 | ||||
Burn And Combine | 18067098 | 502 days ago | IN | 0 ETH | 0.0015504 | ||||
Burn And Combine | 18067096 | 502 days ago | IN | 0 ETH | 0.00139212 | ||||
Burn And Combine | 18067093 | 502 days ago | IN | 0 ETH | 0.00163607 |
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|
16474831 | 726 days ago | 2.6925 ETH |
Loading...
Loading
Contract Name:
QuacksQQ
Compiler Version
v0.8.17+commit.8df45f5f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-01-19 */ /** *Submitted for verification at polygonscan.com on 2023-01-17 */ /** *Submitted for verification at Etherscan.io on 2022-06-24 */ // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } 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); } pragma solidity ^0.8.0; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); } pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastvalue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastvalue; // Update the index for the moved value set._indexes[lastvalue] = valueIndex; // Replace lastvalue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { return _values(set._inner); } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values on the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; assembly { result := store } return result; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } 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 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } 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); } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } 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; } } 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); } } 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; } } pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev 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 {} } pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } 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); } } pragma solidity ^0.8.0; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } } pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { _addressData[owner].aux = aux; } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return _ownershipOf(tokenId).addr; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ''); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) private { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { AddressData storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } pragma solidity ^0.8.13; interface IOperatorFilterRegistry { function isOperatorAllowed(address registrant, address operator) external view returns (bool); function register(address registrant) external; function registerAndSubscribe(address registrant, address subscription) external; function registerAndCopyEntries(address registrant, address registrantToCopy) external; function unregister(address addr) external; function updateOperator(address registrant, address operator, bool filtered) external; function updateOperators(address registrant, address[] calldata operators, bool filtered) external; function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external; function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external; function subscribe(address registrant, address registrantToSubscribe) external; function unsubscribe(address registrant, bool copyExistingEntries) external; function subscriptionOf(address addr) external returns (address registrant); function subscribers(address registrant) external returns (address[] memory); function subscriberAt(address registrant, uint256 index) external returns (address); function copyEntriesOf(address registrant, address registrantToCopy) external; function isOperatorFiltered(address registrant, address operator) external returns (bool); function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool); function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool); function filteredOperators(address addr) external returns (address[] memory); function filteredCodeHashes(address addr) external returns (bytes32[] memory); function filteredOperatorAt(address registrant, uint256 index) external returns (address); function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32); function isRegistered(address addr) external returns (bool); function codeHashOf(address addr) external returns (bytes32); } pragma solidity ^0.8.13; //import {IOperatorFilterRegistry} from "./IOperatorFilterRegistry.sol"; /** * @title OperatorFilterer * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another * registrant's entries in the OperatorFilterRegistry. * @dev This smart contract is meant to be inherited by token contracts so they can use the following: * - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods. * - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods. */ abstract contract OperatorFilterer { error OperatorNotAllowed(address operator); IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY = IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E); constructor(address subscriptionOrRegistrantToCopy, bool subscribe) { // If an inheriting token contract is deployed to a network without the registry deployed, the modifier // will not revert, but the contract will need to be registered with the registry once it is deployed in // order for the modifier to filter addresses. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (subscribe) { OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy); } else { if (subscriptionOrRegistrantToCopy != address(0)) { OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy); } else { OPERATOR_FILTER_REGISTRY.register(address(this)); } } } } modifier onlyAllowedOperator(address from) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { // Allow spending tokens from addresses with balance // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred // from an EOA. if (from == msg.sender) { _; return; } if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) { revert OperatorNotAllowed(msg.sender); } } _; } modifier onlyAllowedOperatorApproval(address operator) virtual { // Check registry code length to facilitate testing in environments without a deployed registry. if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) { if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) { revert OperatorNotAllowed(operator); } } _; } } pragma solidity ^0.8.13; //import {OperatorFilterer} from "./OperatorFilterer.sol"; /** * @title DefaultOperatorFilterer * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription. */ abstract contract DefaultOperatorFilterer is OperatorFilterer { address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6); constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {} } contract QuacksQQ is ERC721A, ReentrancyGuard, Ownable, DefaultOperatorFilterer { using Strings for uint256; // Minting Variables uint256 public mintPrice = 0.0005 ether; uint256 public maxPurchase = 80; uint256 public maxSupply = 16027; // Sale Status bool public saleIsActive = false; // mappings mapping(address => uint) public addressesThatMinted; mapping(uint256 => uint256) public tokenIdLevels; mapping(uint256 => uint256) public tokenIdBurnedBy; mapping(uint => string) public levelBaseTokenURIs; // Metadata string _baseTokenURI = "ipfs://bafybeicld43chptveq6ysonrrmbde5lc5zmhdkynm7nge6kfmxwf4ojtrm/"; function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) { super.setApprovalForAll(operator, approved); } function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) { super.approve(operator, tokenId); } function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.transferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId); } function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public override onlyAllowedOperator(from) { super.safeTransferFrom(from, to, tokenId, data); } // Events event SaleActivation(bool isActive); constructor() ERC721A("Quacks QQ", "QUACKS") { } // Minting function ownerMint(address _to, uint256 _count) external onlyOwner { require( totalSupply() + _count <= maxSupply, "SOLD_OUT" ); _safeMint(_to, _count); } function mint(uint256 _count) external payable nonReentrant { require(saleIsActive, "SALE_INACTIVE"); require(((addressesThatMinted[msg.sender] + _count) ) <= maxPurchase , "this would exceed mint max allowance"); require( totalSupply() + _count <= maxSupply, "SOLD_OUT" ); require( mintPrice * _count <= msg.value, "INCORRECT_ETHER_VALUE" ); _safeMint(msg.sender, _count); addressesThatMinted[msg.sender] += _count; } function toggleSaleStatus() external onlyOwner { saleIsActive = !saleIsActive; emit SaleActivation(saleIsActive); } function setMintPrice(uint256 _mintPrice) external onlyOwner { mintPrice = _mintPrice; } function setMaxPurchase(uint256 _maxPurchase) external onlyOwner { maxPurchase = _maxPurchase; } function withdraw() external onlyOwner { payable(owner()).transfer(address(this).balance); } function burnAndCombine( uint256 _tokenID, uint256[] calldata tokenIds ) external payable { bool check = false; bool check2 = false; require(tokenIds.length == 2); require(ownerOf(_tokenID) == msg.sender, "NOT_TOKEN_OWNER"); for (uint256 i; i < tokenIds.length; i++) { require(ownerOf(tokenIds[i]) == msg.sender, "NOT_TOKEN_OWNER"); require(tokenIdLevels[tokenIds[i]] == tokenIdLevels[_tokenID], "Tokens are not right level"); if (tokenIds[i] == _tokenID) { check = true; } else { check2 = true; } } require(check == true, "tokenID param not in token array param"); require(check2 == true, "no burn token in token array param"); for (uint256 i; i < tokenIds.length; i++) { if (tokenIds[i] != _tokenID) { _burn(tokenIds[i],false); tokenIdBurnedBy[tokenIds[i]] = _tokenID; } else { tokenIdLevels[tokenIds[i]] += 1; } } } function getWalletOfOwner(address owner) external view returns (uint256[] memory) { unchecked { uint256[] memory a = new uint256[](balanceOf(owner)); uint256 end = _currentIndex; uint256 tokenIdsIdx; address currOwnershipAddr; for (uint256 i; i < end; i++) { TokenOwnership memory ownership = _ownerships[i]; if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { a[tokenIdsIdx++] = i; } } return a; } } function getTotalSupply() external view returns (uint256) { return totalSupply(); } function setBaseURI(string memory baseURI) external onlyOwner { _baseTokenURI = baseURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setTokenLevelsURI(string memory baseURI, uint256 level) external onlyOwner { levelBaseTokenURIs[level] = baseURI; } // function tokenURI(uint256 tokenId) public view override returns (string memory){ // return string(abi.encodePacked(super.tokenURI(tokenId), ".json")); // } function tokenURI(uint256 tokenId) public view override returns (string memory){ // return string(abi.encodePacked(super.tokenURI(tokenId), ".json")); string memory token_str = tokenId.toString(); if (tokenIdLevels[tokenId] > 0) { return string(abi.encodePacked(levelBaseTokenURIs[tokenIdLevels[tokenId]],token_str, ".json")); } else { return string(abi.encodePacked(super.tokenURI(tokenId), ".json")); } } function _startTokenId() internal view virtual override returns (uint256){ return 1; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"bool","name":"isActive","type":"bool"}],"name":"SaleActivation","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressesThatMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenID","type":"uint256"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"burnAndCombine","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getTotalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getWalletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"levelBaseTokenURIs","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxPurchase","type":"uint256"}],"name":"setMaxPurchase","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"setTokenLevelsURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdBurnedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdLevels","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040526601c6bf52634000600a556050600b55613e9b600c556000600d60006101000a81548160ff021916908315150217905550604051806080016040528060438152602001620059c460439139601290816200005f9190620006a3565b503480156200006d57600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f517561636b7320515100000000000000000000000000000000000000000000008152506040518060400160405280600681526020017f515541434b5300000000000000000000000000000000000000000000000000008152508160029081620001029190620006a3565b508060039081620001149190620006a3565b50620001256200035260201b60201c565b6000819055505050600160088190555062000155620001496200035b60201b60201c565b6200036360201b60201c565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034a57801562000210576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d6929190620007cf565b600060405180830381600087803b158015620001f157600080fd5b505af115801562000206573d6000803e3d6000fd5b5050505062000349565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002ca576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b815260040162000290929190620007cf565b600060405180830381600087803b158015620002ab57600080fd5b505af1158015620002c0573d6000803e3d6000fd5b5050505062000348565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003139190620007fc565b600060405180830381600087803b1580156200032e57600080fd5b505af115801562000343573d6000803e3d6000fd5b505050505b5b5b505062000819565b60006001905090565b600033905090565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004ab57607f821691505b602082108103620004c157620004c062000463565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200052b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620004ec565b620005378683620004ec565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005846200057e62000578846200054f565b62000559565b6200054f565b9050919050565b6000819050919050565b620005a08362000563565b620005b8620005af826200058b565b848454620004f9565b825550505050565b600090565b620005cf620005c0565b620005dc81848462000595565b505050565b5b818110156200060457620005f8600082620005c5565b600181019050620005e2565b5050565b601f82111562000653576200061d81620004c7565b6200062884620004dc565b8101602085101562000638578190505b620006506200064785620004dc565b830182620005e1565b50505b505050565b600082821c905092915050565b6000620006786000198460080262000658565b1980831691505092915050565b600062000693838362000665565b9150826002028217905092915050565b620006ae8262000429565b67ffffffffffffffff811115620006ca57620006c962000434565b5b620006d6825462000492565b620006e382828562000608565b600060209050601f8311600181146200071b576000841562000706578287015190505b62000712858262000685565b86555062000782565b601f1984166200072b86620004c7565b60005b8281101562000755578489015182556001820191506020850194506020810190506200072e565b8683101562000775578489015162000771601f89168262000665565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007b7826200078a565b9050919050565b620007c981620007aa565b82525050565b6000604082019050620007e66000830185620007be565b620007f56020830184620007be565b9392505050565b6000602082019050620008136000830184620007be565b92915050565b61519b80620008296000396000f3fe60806040526004361061021a5760003560e01c80637118974211610123578063ab2fdb0c116100ab578063d5abeb011161006f578063d5abeb01146107c7578063e985e9c5146107f2578063eb8d24441461082f578063f2fde38b1461085a578063f4a0a528146108835761021a565b8063ab2fdb0c146106bc578063b88d4fde146106f9578063c4e41b2214610722578063c5a602261461074d578063c87b56dd1461078a5761021a565b806392e37aea116100f257806392e37aea1461060557806395d89b4114610621578063977b055b1461064c578063a0712d6814610677578063a22cb465146106935761021a565b8063711897421461055d578063715018a614610586578063828ff0f71461059d5780638da5cb5b146105da5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b314610452578063627fdeab1461047b5780636352211e146104b85780636817c76c146104f557806370a08231146105205761021a565b806342842e0e1461039a57806345b0c0fa146103c3578063484b973c146104005780634e54a877146104295761021a565b8063095ea7b3116101ed578063095ea7b3146102db57806318160ddd1461030457806323b872dd1461032f5780633ccfd60b1461035857806341f434341461036f5761021a565b806301ffc9a71461021f578063049c5c491461025c57806306fdde0314610273578063081812fc1461029e575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613bf8565b6108ac565b6040516102539190613c40565b60405180910390f35b34801561026857600080fd5b5061027161098e565b005b34801561027f57600080fd5b50610288610a7c565b6040516102959190613ceb565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613d43565b610b0e565b6040516102d29190613db1565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613df8565b610b8a565b005b34801561031057600080fd5b50610319610c94565b6040516103269190613e47565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613e62565b610cab565b005b34801561036457600080fd5b5061036d610dfb565b005b34801561037b57600080fd5b50610384610ec7565b6040516103919190613f14565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613e62565b610ed9565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613d43565b611029565b6040516103f79190613e47565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190613df8565b611041565b005b34801561043557600080fd5b50610450600480360381019061044b9190614064565b611122565b005b34801561045e57600080fd5b50610479600480360381019061047491906140c0565b6111c3565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614109565b611252565b6040516104af91906141f4565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190613d43565b611448565b6040516104ec9190613db1565b60405180910390f35b34801561050157600080fd5b5061050a61145e565b6040516105179190613e47565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190614109565b611464565b6040516105549190613e47565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613d43565b611533565b005b34801561059257600080fd5b5061059b6115b9565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613d43565b611641565b6040516105d19190613ceb565b60405180910390f35b3480156105e657600080fd5b506105ef6116e1565b6040516105fc9190613db1565b60405180910390f35b61061f600480360381019061061a9190614276565b61170b565b005b34801561062d57600080fd5b50610636611a6a565b6040516106439190613ceb565b60405180910390f35b34801561065857600080fd5b50610661611afc565b60405161066e9190613e47565b60405180910390f35b610691600480360381019061068c9190613d43565b611b02565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190614302565b611d3f565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614109565b611e49565b6040516106f09190613e47565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906143e3565b611e61565b005b34801561072e57600080fd5b50610737611fb4565b6040516107449190613e47565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613d43565b611fc3565b6040516107819190613e47565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613d43565b611fdb565b6040516107be9190613ceb565b60405180910390f35b3480156107d357600080fd5b506107dc612086565b6040516107e99190613e47565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190614466565b61208c565b6040516108269190613c40565b60405180910390f35b34801561083b57600080fd5b50610844612120565b6040516108519190613c40565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190614109565b612133565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613d43565b61222a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109875750610986826122b0565b5b9050919050565b61099661231a565b73ffffffffffffffffffffffffffffffffffffffff166109b46116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906144f2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600d60009054906101000a900460ff16604051610a729190613c40565b60405180910390a1565b606060028054610a8b90614541565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab790614541565b8015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b5050505050905090565b6000610b1982612322565b610b4f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c85576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c02929190614572565b602060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4391906145b0565b610c8457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c7b9190613db1565b60405180910390fd5b5b610c8f8383612370565b505050565b6000610c9e61247a565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d1d57610d18848484612483565b610df5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d66929190614572565b602060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da791906145b0565b610de857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ddf9190613db1565b60405180910390fd5b5b610df4848484612483565b5b50505050565b610e0361231a565b73ffffffffffffffffffffffffffffffffffffffff16610e216116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e906144f2565b60405180910390fd5b610e7f6116e1565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ec4573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611017573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f4b57610f46848484612493565b611023565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f94929190614572565b602060405180830381865afa158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd591906145b0565b61101657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161100d9190613db1565b60405180910390fd5b5b611022848484612493565b5b50505050565b600f6020528060005260406000206000915090505481565b61104961231a565b73ffffffffffffffffffffffffffffffffffffffff166110676116e1565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b4906144f2565b60405180910390fd5b600c54816110c9610c94565b6110d3919061460c565b1115611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b9061468c565b60405180910390fd5b61111e82826124b3565b5050565b61112a61231a565b73ffffffffffffffffffffffffffffffffffffffff166111486116e1565b73ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611195906144f2565b60405180910390fd5b816011600083815260200190815260200160002090816111be919061484e565b505050565b6111cb61231a565b73ffffffffffffffffffffffffffffffffffffffff166111e96116e1565b73ffffffffffffffffffffffffffffffffffffffff161461123f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611236906144f2565b60405180910390fd5b806012908161124e919061484e565b5050565b6060600061125f83611464565b67ffffffffffffffff81111561127857611277613f39565b5b6040519080825280602002602001820160405280156112a65781602001602082028036833780820191505090505b50905060008054905060008060005b8381101561143b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611392575061142e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146113d257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361142c578186858060010196508151811061141f5761141e614920565b5b6020026020010181815250505b505b80806001019150506112b5565b5083945050505050919050565b6000611453826124d1565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61153b61231a565b73ffffffffffffffffffffffffffffffffffffffff166115596116e1565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906144f2565b60405180910390fd5b80600b8190555050565b6115c161231a565b73ffffffffffffffffffffffffffffffffffffffff166115df6116e1565b73ffffffffffffffffffffffffffffffffffffffff1614611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c906144f2565b60405180910390fd5b61163f6000612760565b565b6011602052806000526040600020600091509050805461166090614541565b80601f016020809104026020016040519081016040528092919081815260200182805461168c90614541565b80156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b505050505081565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806002848490501461171e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661173e86611448565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b9061499b565b60405180910390fd5b60005b848490508110156118f3573373ffffffffffffffffffffffffffffffffffffffff166117db8686848181106117cf576117ce614920565b5b90506020020135611448565b73ffffffffffffffffffffffffffffffffffffffff1614611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061499b565b60405180910390fd5b600f600087815260200190815260200160002054600f600087878581811061185c5761185b614920565b5b90506020020135815260200190815260200160002054146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614a07565b60405180910390fd5b858585838181106118c6576118c5614920565b5b90506020020135036118db57600192506118e0565b600191505b80806118eb90614a27565b915050611797565b50600115158215151461193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614ae1565b60405180910390fd5b6001151581151514611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614b73565b60405180910390fd5b60005b84849050811015611a6257858585838181106119a4576119a3614920565b5b9050602002013514611a0a576119d48585838181106119c6576119c5614920565b5b905060200201356000612826565b85601060008787858181106119ec576119eb614920565b5b90506020020135815260200190815260200160002081905550611a4f565b6001600f6000878785818110611a2357611a22614920565b5b9050602002013581526020019081526020016000206000828254611a47919061460c565b925050819055505b8080611a5a90614a27565b915050611985565b505050505050565b606060038054611a7990614541565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa590614541565b8015611af25780601f10611ac757610100808354040283529160200191611af2565b820191906000526020600020905b815481529060010190602001808311611ad557829003601f168201915b5050505050905090565b600b5481565b600260085403611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614bdf565b60405180910390fd5b6002600881905550600d60009054906101000a900460ff16611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590614c4b565b60405180910390fd5b600b5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bec919061460c565b1115611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2490614cdd565b60405180910390fd5b600c5481611c39610c94565b611c43919061460c565b1115611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b9061468c565b60405180910390fd5b3481600a54611c939190614cfd565b1115611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90614d8b565b60405180910390fd5b611cde33826124b3565b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d919061460c565b92505081905550600160088190555050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e3a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611db7929190614572565b602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df891906145b0565b611e3957806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e309190613db1565b60405180910390fd5b5b611e448383612c15565b505050565b600e6020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fa0573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ed457611ecf85858585612d8c565b611fad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f1d929190614572565b602060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5e91906145b0565b611f9f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611f969190613db1565b60405180910390fd5b5b611fac85858585612d8c565b5b5050505050565b6000611fbe610c94565b905090565b60106020528060005260406000206000915090505481565b60606000611fe883612e08565b90506000600f60008581526020019081526020016000205411156120555760116000600f60008681526020019081526020016000205481526020019081526020016000208160405160200161203e929190614eb6565b604051602081830303815290604052915050612081565b61205e83612f68565b60405160200161206e9190614ee5565b6040516020818303038152906040529150505b919050565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61213b61231a565b73ffffffffffffffffffffffffffffffffffffffff166121596116e1565b73ffffffffffffffffffffffffffffffffffffffff16146121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906144f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614f79565b60405180910390fd5b61222781612760565b50565b61223261231a565b73ffffffffffffffffffffffffffffffffffffffff166122506116e1565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d906144f2565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008161232d61247a565b1115801561233c575060005482105b8015612369575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600061237b82611448565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661240161231a565b73ffffffffffffffffffffffffffffffffffffffff161415801561243357506124318161242c61231a565b61208c565b155b1561246a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612475838383613006565b505050565b60006001905090565b61248e8383836130b8565b505050565b6124ae83838360405180602001604052806000815250611e61565b505050565b6124cd82826040518060200160405280600081525061356c565b5050565b6124d9613b49565b6000829050806124e761247a565b111580156124f6575060005481105b15612729576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161272757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260b57809250505061275b565b5b60011561272657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461272157809250505061275b565b61260c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612831836124d1565b905060008160000151905082156129125760008173ffffffffffffffffffffffffffffffffffffffff1661286361231a565b73ffffffffffffffffffffffffffffffffffffffff16148061289257506128918261288c61231a565b61208c565b5b806128d757506128a061231a565b73ffffffffffffffffffffffffffffffffffffffff166128bf86610b0e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612910576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61292081600086600161357e565b61292c60008583613006565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b8f576000548214612b8e57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfd816000866001613584565b60016000815480929190600101919050555050505050565b612c1d61231a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c81576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612c8e61231a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612d3b61231a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d809190613c40565b60405180910390a35050565b612d978484846130b8565b612db68373ffffffffffffffffffffffffffffffffffffffff1661358a565b8015612dcb5750612dc98484848461359d565b155b15612e02576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060008203612e4f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f63565b600082905060005b60008214612e81578080612e6a90614a27565b915050600a82612e7a9190614fc8565b9150612e57565b60008167ffffffffffffffff811115612e9d57612e9c613f39565b5b6040519080825280601f01601f191660200182016040528015612ecf5781602001600182028036833780820191505090505b5090505b60008514612f5c57600182612ee89190614ff9565b9150600a85612ef7919061502d565b6030612f03919061460c565b60f81b818381518110612f1957612f18614920565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f559190614fc8565b9450612ed3565b8093505050505b919050565b6060612f7382612322565b612fa9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612fb36136ed565b90506000815103612fd35760405180602001604052806000815250612ffe565b80612fdd84612e08565b604051602001612fee92919061505e565b6040516020818303038152906040525b915050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006130c3826124d1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461312e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661314f61231a565b73ffffffffffffffffffffffffffffffffffffffff16148061317e575061317d8561317861231a565b61208c565b5b806131c3575061318c61231a565b73ffffffffffffffffffffffffffffffffffffffff166131ab84610b0e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806131fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613262576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61326f858585600161357e565b61327b60008487613006565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036134fa5760005482146134f957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135658585856001613584565b5050505050565b613579838383600161377f565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135c361231a565b8786866040518563ffffffff1660e01b81526004016135e594939291906150d7565b6020604051808303816000875af192505050801561362157506040513d601f19601f8201168201806040525081019061361e9190615138565b60015b61369a573d8060008114613651576040519150601f19603f3d011682016040523d82523d6000602084013e613656565b606091505b506000815103613692576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601280546136fc90614541565b80601f016020809104026020016040519081016040528092919081815260200182805461372890614541565b80156137755780601f1061374a57610100808354040283529160200191613775565b820191906000526020600020905b81548152906001019060200180831161375857829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036137eb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613825576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613832600086838761357e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139fc57506139fb8773ffffffffffffffffffffffffffffffffffffffff1661358a565b5b15613ac1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a71600088848060010195508861359d565b613aa7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613a02578260005414613abc57600080fd5b613b2c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613ac2575b816000819055505050613b426000868387613584565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bd581613ba0565b8114613be057600080fd5b50565b600081359050613bf281613bcc565b92915050565b600060208284031215613c0e57613c0d613b96565b5b6000613c1c84828501613be3565b91505092915050565b60008115159050919050565b613c3a81613c25565b82525050565b6000602082019050613c556000830184613c31565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c95578082015181840152602081019050613c7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cbd82613c5b565b613cc78185613c66565b9350613cd7818560208601613c77565b613ce081613ca1565b840191505092915050565b60006020820190508181036000830152613d058184613cb2565b905092915050565b6000819050919050565b613d2081613d0d565b8114613d2b57600080fd5b50565b600081359050613d3d81613d17565b92915050565b600060208284031215613d5957613d58613b96565b5b6000613d6784828501613d2e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d9b82613d70565b9050919050565b613dab81613d90565b82525050565b6000602082019050613dc66000830184613da2565b92915050565b613dd581613d90565b8114613de057600080fd5b50565b600081359050613df281613dcc565b92915050565b60008060408385031215613e0f57613e0e613b96565b5b6000613e1d85828601613de3565b9250506020613e2e85828601613d2e565b9150509250929050565b613e4181613d0d565b82525050565b6000602082019050613e5c6000830184613e38565b92915050565b600080600060608486031215613e7b57613e7a613b96565b5b6000613e8986828701613de3565b9350506020613e9a86828701613de3565b9250506040613eab86828701613d2e565b9150509250925092565b6000819050919050565b6000613eda613ed5613ed084613d70565b613eb5565b613d70565b9050919050565b6000613eec82613ebf565b9050919050565b6000613efe82613ee1565b9050919050565b613f0e81613ef3565b82525050565b6000602082019050613f296000830184613f05565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f7182613ca1565b810181811067ffffffffffffffff82111715613f9057613f8f613f39565b5b80604052505050565b6000613fa3613b8c565b9050613faf8282613f68565b919050565b600067ffffffffffffffff821115613fcf57613fce613f39565b5b613fd882613ca1565b9050602081019050919050565b82818337600083830152505050565b600061400761400284613fb4565b613f99565b90508281526020810184848401111561402357614022613f34565b5b61402e848285613fe5565b509392505050565b600082601f83011261404b5761404a613f2f565b5b813561405b848260208601613ff4565b91505092915050565b6000806040838503121561407b5761407a613b96565b5b600083013567ffffffffffffffff81111561409957614098613b9b565b5b6140a585828601614036565b92505060206140b685828601613d2e565b9150509250929050565b6000602082840312156140d6576140d5613b96565b5b600082013567ffffffffffffffff8111156140f4576140f3613b9b565b5b61410084828501614036565b91505092915050565b60006020828403121561411f5761411e613b96565b5b600061412d84828501613de3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61416b81613d0d565b82525050565b600061417d8383614162565b60208301905092915050565b6000602082019050919050565b60006141a182614136565b6141ab8185614141565b93506141b683614152565b8060005b838110156141e75781516141ce8882614171565b97506141d983614189565b9250506001810190506141ba565b5085935050505092915050565b6000602082019050818103600083015261420e8184614196565b905092915050565b600080fd5b600080fd5b60008083601f84011261423657614235613f2f565b5b8235905067ffffffffffffffff81111561425357614252614216565b5b60208301915083602082028301111561426f5761426e61421b565b5b9250929050565b60008060006040848603121561428f5761428e613b96565b5b600061429d86828701613d2e565b935050602084013567ffffffffffffffff8111156142be576142bd613b9b565b5b6142ca86828701614220565b92509250509250925092565b6142df81613c25565b81146142ea57600080fd5b50565b6000813590506142fc816142d6565b92915050565b6000806040838503121561431957614318613b96565b5b600061432785828601613de3565b9250506020614338858286016142ed565b9150509250929050565b600067ffffffffffffffff82111561435d5761435c613f39565b5b61436682613ca1565b9050602081019050919050565b600061438661438184614342565b613f99565b9050828152602081018484840111156143a2576143a1613f34565b5b6143ad848285613fe5565b509392505050565b600082601f8301126143ca576143c9613f2f565b5b81356143da848260208601614373565b91505092915050565b600080600080608085870312156143fd576143fc613b96565b5b600061440b87828801613de3565b945050602061441c87828801613de3565b935050604061442d87828801613d2e565b925050606085013567ffffffffffffffff81111561444e5761444d613b9b565b5b61445a878288016143b5565b91505092959194509250565b6000806040838503121561447d5761447c613b96565b5b600061448b85828601613de3565b925050602061449c85828601613de3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144dc602083613c66565b91506144e7826144a6565b602082019050919050565b6000602082019050818103600083015261450b816144cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061455957607f821691505b60208210810361456c5761456b614512565b5b50919050565b60006040820190506145876000830185613da2565b6145946020830184613da2565b9392505050565b6000815190506145aa816142d6565b92915050565b6000602082840312156145c6576145c5613b96565b5b60006145d48482850161459b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061461782613d0d565b915061462283613d0d565b925082820190508082111561463a576146396145dd565b5b92915050565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b6000614676600883613c66565b915061468182614640565b602082019050919050565b600060208201905081810360008301526146a581614669565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261470e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146d1565b61471886836146d1565b95508019841693508086168417925050509392505050565b600061474b61474661474184613d0d565b613eb5565b613d0d565b9050919050565b6000819050919050565b61476583614730565b61477961477182614752565b8484546146de565b825550505050565b600090565b61478e614781565b61479981848461475c565b505050565b5b818110156147bd576147b2600082614786565b60018101905061479f565b5050565b601f821115614802576147d3816146ac565b6147dc846146c1565b810160208510156147eb578190505b6147ff6147f7856146c1565b83018261479e565b50505b505050565b600082821c905092915050565b600061482560001984600802614807565b1980831691505092915050565b600061483e8383614814565b9150826002028217905092915050565b61485782613c5b565b67ffffffffffffffff8111156148705761486f613f39565b5b61487a8254614541565b6148858282856147c1565b600060209050601f8311600181146148b857600084156148a6578287015190505b6148b08582614832565b865550614918565b601f1984166148c6866146ac565b60005b828110156148ee578489015182556001820191506020850194506020810190506148c9565b8683101561490b5784890151614907601f891682614814565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e4f545f544f4b454e5f4f574e45520000000000000000000000000000000000600082015250565b6000614985600f83613c66565b91506149908261494f565b602082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b7f546f6b656e7320617265206e6f74207269676874206c6576656c000000000000600082015250565b60006149f1601a83613c66565b91506149fc826149bb565b602082019050919050565b60006020820190508181036000830152614a20816149e4565b9050919050565b6000614a3282613d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6457614a636145dd565b5b600182019050919050565b7f746f6b656e494420706172616d206e6f7420696e20746f6b656e20617272617960008201527f20706172616d0000000000000000000000000000000000000000000000000000602082015250565b6000614acb602683613c66565b9150614ad682614a6f565b604082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f6e6f206275726e20746f6b656e20696e20746f6b656e2061727261792070617260008201527f616d000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b5d602283613c66565b9150614b6882614b01565b604082019050919050565b60006020820190508181036000830152614b8c81614b50565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614bc9601f83613c66565b9150614bd482614b93565b602082019050919050565b60006020820190508181036000830152614bf881614bbc565b9050919050565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b6000614c35600d83613c66565b9150614c4082614bff565b602082019050919050565b60006020820190508181036000830152614c6481614c28565b9050919050565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614cc7602483613c66565b9150614cd282614c6b565b604082019050919050565b60006020820190508181036000830152614cf681614cba565b9050919050565b6000614d0882613d0d565b9150614d1383613d0d565b9250828202614d2181613d0d565b91508282048414831517614d3857614d376145dd565b5b5092915050565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b6000614d75601583613c66565b9150614d8082614d3f565b602082019050919050565b60006020820190508181036000830152614da481614d68565b9050919050565b600081905092915050565b60008154614dc381614541565b614dcd8186614dab565b94506001821660008114614de85760018114614dfd57614e30565b60ff1983168652811515820286019350614e30565b614e06856146ac565b60005b83811015614e2857815481890152600182019150602081019050614e09565b838801955050505b50505092915050565b6000614e4482613c5b565b614e4e8185614dab565b9350614e5e818560208601613c77565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614ea0600583614dab565b9150614eab82614e6a565b600582019050919050565b6000614ec28285614db6565b9150614ece8284614e39565b9150614ed982614e93565b91508190509392505050565b6000614ef18284614e39565b9150614efc82614e93565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f63602683613c66565b9150614f6e82614f07565b604082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614fd382613d0d565b9150614fde83613d0d565b925082614fee57614fed614f99565b5b828204905092915050565b600061500482613d0d565b915061500f83613d0d565b9250828203905081811115615027576150266145dd565b5b92915050565b600061503882613d0d565b915061504383613d0d565b92508261505357615052614f99565b5b828206905092915050565b600061506a8285614e39565b91506150768284614e39565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006150a982615082565b6150b3818561508d565b93506150c3818560208601613c77565b6150cc81613ca1565b840191505092915050565b60006080820190506150ec6000830187613da2565b6150f96020830186613da2565b6151066040830185613e38565b8181036060830152615118818461509e565b905095945050505050565b60008151905061513281613bcc565b92915050565b60006020828403121561514e5761514d613b96565b5b600061515c84828501615123565b9150509291505056fea26469706673582212208bbf4eeb1563bc5bf70735d70ba8dec490ec0ed4f9809caadf7a47269829297f64736f6c63430008110033697066733a2f2f62616679626569636c643433636870747665713679736f6e72726d626465356c63357a6d68646b796e6d376e6765366b666d787766346f6a74726d2f
Deployed Bytecode
0x60806040526004361061021a5760003560e01c80637118974211610123578063ab2fdb0c116100ab578063d5abeb011161006f578063d5abeb01146107c7578063e985e9c5146107f2578063eb8d24441461082f578063f2fde38b1461085a578063f4a0a528146108835761021a565b8063ab2fdb0c146106bc578063b88d4fde146106f9578063c4e41b2214610722578063c5a602261461074d578063c87b56dd1461078a5761021a565b806392e37aea116100f257806392e37aea1461060557806395d89b4114610621578063977b055b1461064c578063a0712d6814610677578063a22cb465146106935761021a565b8063711897421461055d578063715018a614610586578063828ff0f71461059d5780638da5cb5b146105da5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b314610452578063627fdeab1461047b5780636352211e146104b85780636817c76c146104f557806370a08231146105205761021a565b806342842e0e1461039a57806345b0c0fa146103c3578063484b973c146104005780634e54a877146104295761021a565b8063095ea7b3116101ed578063095ea7b3146102db57806318160ddd1461030457806323b872dd1461032f5780633ccfd60b1461035857806341f434341461036f5761021a565b806301ffc9a71461021f578063049c5c491461025c57806306fdde0314610273578063081812fc1461029e575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613bf8565b6108ac565b6040516102539190613c40565b60405180910390f35b34801561026857600080fd5b5061027161098e565b005b34801561027f57600080fd5b50610288610a7c565b6040516102959190613ceb565b60405180910390f35b3480156102aa57600080fd5b506102c560048036038101906102c09190613d43565b610b0e565b6040516102d29190613db1565b60405180910390f35b3480156102e757600080fd5b5061030260048036038101906102fd9190613df8565b610b8a565b005b34801561031057600080fd5b50610319610c94565b6040516103269190613e47565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190613e62565b610cab565b005b34801561036457600080fd5b5061036d610dfb565b005b34801561037b57600080fd5b50610384610ec7565b6040516103919190613f14565b60405180910390f35b3480156103a657600080fd5b506103c160048036038101906103bc9190613e62565b610ed9565b005b3480156103cf57600080fd5b506103ea60048036038101906103e59190613d43565b611029565b6040516103f79190613e47565b60405180910390f35b34801561040c57600080fd5b5061042760048036038101906104229190613df8565b611041565b005b34801561043557600080fd5b50610450600480360381019061044b9190614064565b611122565b005b34801561045e57600080fd5b50610479600480360381019061047491906140c0565b6111c3565b005b34801561048757600080fd5b506104a2600480360381019061049d9190614109565b611252565b6040516104af91906141f4565b60405180910390f35b3480156104c457600080fd5b506104df60048036038101906104da9190613d43565b611448565b6040516104ec9190613db1565b60405180910390f35b34801561050157600080fd5b5061050a61145e565b6040516105179190613e47565b60405180910390f35b34801561052c57600080fd5b5061054760048036038101906105429190614109565b611464565b6040516105549190613e47565b60405180910390f35b34801561056957600080fd5b50610584600480360381019061057f9190613d43565b611533565b005b34801561059257600080fd5b5061059b6115b9565b005b3480156105a957600080fd5b506105c460048036038101906105bf9190613d43565b611641565b6040516105d19190613ceb565b60405180910390f35b3480156105e657600080fd5b506105ef6116e1565b6040516105fc9190613db1565b60405180910390f35b61061f600480360381019061061a9190614276565b61170b565b005b34801561062d57600080fd5b50610636611a6a565b6040516106439190613ceb565b60405180910390f35b34801561065857600080fd5b50610661611afc565b60405161066e9190613e47565b60405180910390f35b610691600480360381019061068c9190613d43565b611b02565b005b34801561069f57600080fd5b506106ba60048036038101906106b59190614302565b611d3f565b005b3480156106c857600080fd5b506106e360048036038101906106de9190614109565b611e49565b6040516106f09190613e47565b60405180910390f35b34801561070557600080fd5b50610720600480360381019061071b91906143e3565b611e61565b005b34801561072e57600080fd5b50610737611fb4565b6040516107449190613e47565b60405180910390f35b34801561075957600080fd5b50610774600480360381019061076f9190613d43565b611fc3565b6040516107819190613e47565b60405180910390f35b34801561079657600080fd5b506107b160048036038101906107ac9190613d43565b611fdb565b6040516107be9190613ceb565b60405180910390f35b3480156107d357600080fd5b506107dc612086565b6040516107e99190613e47565b60405180910390f35b3480156107fe57600080fd5b5061081960048036038101906108149190614466565b61208c565b6040516108269190613c40565b60405180910390f35b34801561083b57600080fd5b50610844612120565b6040516108519190613c40565b60405180910390f35b34801561086657600080fd5b50610881600480360381019061087c9190614109565b612133565b005b34801561088f57600080fd5b506108aa60048036038101906108a59190613d43565b61222a565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061097757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109875750610986826122b0565b5b9050919050565b61099661231a565b73ffffffffffffffffffffffffffffffffffffffff166109b46116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610a0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a01906144f2565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff0219169083151502179055507f58655b75d3df612fe99ead00dbf0812d415d35078fe06217a94c0818bb13967f600d60009054906101000a900460ff16604051610a729190613c40565b60405180910390a1565b606060028054610a8b90614541565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab790614541565b8015610b045780601f10610ad957610100808354040283529160200191610b04565b820191906000526020600020905b815481529060010190602001808311610ae757829003601f168201915b5050505050905090565b6000610b1982612322565b610b4f576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610c85576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610c02929190614572565b602060405180830381865afa158015610c1f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c4391906145b0565b610c8457806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610c7b9190613db1565b60405180910390fd5b5b610c8f8383612370565b505050565b6000610c9e61247a565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610de9573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d1d57610d18848484612483565b610df5565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610d66929190614572565b602060405180830381865afa158015610d83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da791906145b0565b610de857336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610ddf9190613db1565b60405180910390fd5b5b610df4848484612483565b5b50505050565b610e0361231a565b73ffffffffffffffffffffffffffffffffffffffff16610e216116e1565b73ffffffffffffffffffffffffffffffffffffffff1614610e77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6e906144f2565b60405180910390fd5b610e7f6116e1565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ec4573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611017573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f4b57610f46848484612493565b611023565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f94929190614572565b602060405180830381865afa158015610fb1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fd591906145b0565b61101657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161100d9190613db1565b60405180910390fd5b5b611022848484612493565b5b50505050565b600f6020528060005260406000206000915090505481565b61104961231a565b73ffffffffffffffffffffffffffffffffffffffff166110676116e1565b73ffffffffffffffffffffffffffffffffffffffff16146110bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110b4906144f2565b60405180910390fd5b600c54816110c9610c94565b6110d3919061460c565b1115611114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110b9061468c565b60405180910390fd5b61111e82826124b3565b5050565b61112a61231a565b73ffffffffffffffffffffffffffffffffffffffff166111486116e1565b73ffffffffffffffffffffffffffffffffffffffff161461119e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611195906144f2565b60405180910390fd5b816011600083815260200190815260200160002090816111be919061484e565b505050565b6111cb61231a565b73ffffffffffffffffffffffffffffffffffffffff166111e96116e1565b73ffffffffffffffffffffffffffffffffffffffff161461123f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611236906144f2565b60405180910390fd5b806012908161124e919061484e565b5050565b6060600061125f83611464565b67ffffffffffffffff81111561127857611277613f39565b5b6040519080825280602002602001820160405280156112a65781602001602082028036833780820191505090505b50905060008054905060008060005b8381101561143b576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015115611392575061142e565b600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146113d257806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361142c578186858060010196508151811061141f5761141e614920565b5b6020026020010181815250505b505b80806001019150506112b5565b5083945050505050919050565b6000611453826124d1565b600001519050919050565b600a5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036114cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b61153b61231a565b73ffffffffffffffffffffffffffffffffffffffff166115596116e1565b73ffffffffffffffffffffffffffffffffffffffff16146115af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a6906144f2565b60405180910390fd5b80600b8190555050565b6115c161231a565b73ffffffffffffffffffffffffffffffffffffffff166115df6116e1565b73ffffffffffffffffffffffffffffffffffffffff1614611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162c906144f2565b60405180910390fd5b61163f6000612760565b565b6011602052806000526040600020600091509050805461166090614541565b80601f016020809104026020016040519081016040528092919081815260200182805461168c90614541565b80156116d95780601f106116ae576101008083540402835291602001916116d9565b820191906000526020600020905b8154815290600101906020018083116116bc57829003601f168201915b505050505081565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000806002848490501461171e57600080fd5b3373ffffffffffffffffffffffffffffffffffffffff1661173e86611448565b73ffffffffffffffffffffffffffffffffffffffff1614611794576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178b9061499b565b60405180910390fd5b60005b848490508110156118f3573373ffffffffffffffffffffffffffffffffffffffff166117db8686848181106117cf576117ce614920565b5b90506020020135611448565b73ffffffffffffffffffffffffffffffffffffffff1614611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061499b565b60405180910390fd5b600f600087815260200190815260200160002054600f600087878581811061185c5761185b614920565b5b90506020020135815260200190815260200160002054146118b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118a990614a07565b60405180910390fd5b858585838181106118c6576118c5614920565b5b90506020020135036118db57600192506118e0565b600191505b80806118eb90614a27565b915050611797565b50600115158215151461193b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193290614ae1565b60405180910390fd5b6001151581151514611982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161197990614b73565b60405180910390fd5b60005b84849050811015611a6257858585838181106119a4576119a3614920565b5b9050602002013514611a0a576119d48585838181106119c6576119c5614920565b5b905060200201356000612826565b85601060008787858181106119ec576119eb614920565b5b90506020020135815260200190815260200160002081905550611a4f565b6001600f6000878785818110611a2357611a22614920565b5b9050602002013581526020019081526020016000206000828254611a47919061460c565b925050819055505b8080611a5a90614a27565b915050611985565b505050505050565b606060038054611a7990614541565b80601f0160208091040260200160405190810160405280929190818152602001828054611aa590614541565b8015611af25780601f10611ac757610100808354040283529160200191611af2565b820191906000526020600020905b815481529060010190602001808311611ad557829003601f168201915b5050505050905090565b600b5481565b600260085403611b47576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3e90614bdf565b60405180910390fd5b6002600881905550600d60009054906101000a900460ff16611b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9590614c4b565b60405180910390fd5b600b5481600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611bec919061460c565b1115611c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2490614cdd565b60405180910390fd5b600c5481611c39610c94565b611c43919061460c565b1115611c84576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7b9061468c565b60405180910390fd5b3481600a54611c939190614cfd565b1115611cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccb90614d8b565b60405180910390fd5b611cde33826124b3565b80600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d2d919061460c565b92505081905550600160088190555050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611e3a576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611db7929190614572565b602060405180830381865afa158015611dd4573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611df891906145b0565b611e3957806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611e309190613db1565b60405180910390fd5b5b611e448383612c15565b505050565b600e6020528060005260406000206000915090505481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611fa0573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ed457611ecf85858585612d8c565b611fad565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611f1d929190614572565b602060405180830381865afa158015611f3a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611f5e91906145b0565b611f9f57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611f969190613db1565b60405180910390fd5b5b611fac85858585612d8c565b5b5050505050565b6000611fbe610c94565b905090565b60106020528060005260406000206000915090505481565b60606000611fe883612e08565b90506000600f60008581526020019081526020016000205411156120555760116000600f60008681526020019081526020016000205481526020019081526020016000208160405160200161203e929190614eb6565b604051602081830303815290604052915050612081565b61205e83612f68565b60405160200161206e9190614ee5565b6040516020818303038152906040529150505b919050565b600c5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d60009054906101000a900460ff1681565b61213b61231a565b73ffffffffffffffffffffffffffffffffffffffff166121596116e1565b73ffffffffffffffffffffffffffffffffffffffff16146121af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a6906144f2565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361221e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161221590614f79565b60405180910390fd5b61222781612760565b50565b61223261231a565b73ffffffffffffffffffffffffffffffffffffffff166122506116e1565b73ffffffffffffffffffffffffffffffffffffffff16146122a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229d906144f2565b60405180910390fd5b80600a8190555050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b60008161232d61247a565b1115801561233c575060005482105b8015612369575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600061237b82611448565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036123e2576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661240161231a565b73ffffffffffffffffffffffffffffffffffffffff161415801561243357506124318161242c61231a565b61208c565b155b1561246a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612475838383613006565b505050565b60006001905090565b61248e8383836130b8565b505050565b6124ae83838360405180602001604052806000815250611e61565b505050565b6124cd82826040518060200160405280600081525061356c565b5050565b6124d9613b49565b6000829050806124e761247a565b111580156124f6575060005481105b15612729576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161272757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461260b57809250505061275b565b5b60011561272657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461272157809250505061275b565b61260c565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612831836124d1565b905060008160000151905082156129125760008173ffffffffffffffffffffffffffffffffffffffff1661286361231a565b73ffffffffffffffffffffffffffffffffffffffff16148061289257506128918261288c61231a565b61208c565b5b806128d757506128a061231a565b73ffffffffffffffffffffffffffffffffffffffff166128bf86610b0e565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612910576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b61292081600086600161357e565b61292c60008583613006565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060018160000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060018160000160108282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008781526020019081526020016000209050828160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600181600001601c6101000a81548160ff02191690831515021790555060006001870190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603612b8f576000548214612b8e57848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555085602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b5050505083600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612bfd816000866001613584565b60016000815480929190600101919050555050505050565b612c1d61231a565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c81576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000612c8e61231a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612d3b61231a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612d809190613c40565b60405180910390a35050565b612d978484846130b8565b612db68373ffffffffffffffffffffffffffffffffffffffff1661358a565b8015612dcb5750612dc98484848461359d565b155b15612e02576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606060008203612e4f576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612f63565b600082905060005b60008214612e81578080612e6a90614a27565b915050600a82612e7a9190614fc8565b9150612e57565b60008167ffffffffffffffff811115612e9d57612e9c613f39565b5b6040519080825280601f01601f191660200182016040528015612ecf5781602001600182028036833780820191505090505b5090505b60008514612f5c57600182612ee89190614ff9565b9150600a85612ef7919061502d565b6030612f03919061460c565b60f81b818381518110612f1957612f18614920565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612f559190614fc8565b9450612ed3565b8093505050505b919050565b6060612f7382612322565b612fa9576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000612fb36136ed565b90506000815103612fd35760405180602001604052806000815250612ffe565b80612fdd84612e08565b604051602001612fee92919061505e565b6040516020818303038152906040525b915050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006130c3826124d1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461312e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff1661314f61231a565b73ffffffffffffffffffffffffffffffffffffffff16148061317e575061317d8561317861231a565b61208c565b5b806131c3575061318c61231a565b73ffffffffffffffffffffffffffffffffffffffff166131ab84610b0e565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806131fc576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603613262576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61326f858585600161357e565b61327b60008487613006565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16036134fa5760005482146134f957878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46135658585856001613584565b5050505050565b613579838383600161377f565b505050565b50505050565b50505050565b600080823b905060008111915050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026135c361231a565b8786866040518563ffffffff1660e01b81526004016135e594939291906150d7565b6020604051808303816000875af192505050801561362157506040513d601f19601f8201168201806040525081019061361e9190615138565b60015b61369a573d8060008114613651576040519150601f19603f3d011682016040523d82523d6000602084013e613656565b606091505b506000815103613692576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060601280546136fc90614541565b80601f016020809104026020016040519081016040528092919081815260200182805461372890614541565b80156137755780601f1061374a57610100808354040283529160200191613775565b820191906000526020600020905b81548152906001019060200180831161375857829003601f168201915b5050505050905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036137eb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403613825576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613832600086838761357e565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156139fc57506139fb8773ffffffffffffffffffffffffffffffffffffffff1661358a565b5b15613ac1575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613a71600088848060010195508861359d565b613aa7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808203613a02578260005414613abc57600080fd5b613b2c565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808203613ac2575b816000819055505050613b426000868387613584565b5050505050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b613bd581613ba0565b8114613be057600080fd5b50565b600081359050613bf281613bcc565b92915050565b600060208284031215613c0e57613c0d613b96565b5b6000613c1c84828501613be3565b91505092915050565b60008115159050919050565b613c3a81613c25565b82525050565b6000602082019050613c556000830184613c31565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613c95578082015181840152602081019050613c7a565b60008484015250505050565b6000601f19601f8301169050919050565b6000613cbd82613c5b565b613cc78185613c66565b9350613cd7818560208601613c77565b613ce081613ca1565b840191505092915050565b60006020820190508181036000830152613d058184613cb2565b905092915050565b6000819050919050565b613d2081613d0d565b8114613d2b57600080fd5b50565b600081359050613d3d81613d17565b92915050565b600060208284031215613d5957613d58613b96565b5b6000613d6784828501613d2e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613d9b82613d70565b9050919050565b613dab81613d90565b82525050565b6000602082019050613dc66000830184613da2565b92915050565b613dd581613d90565b8114613de057600080fd5b50565b600081359050613df281613dcc565b92915050565b60008060408385031215613e0f57613e0e613b96565b5b6000613e1d85828601613de3565b9250506020613e2e85828601613d2e565b9150509250929050565b613e4181613d0d565b82525050565b6000602082019050613e5c6000830184613e38565b92915050565b600080600060608486031215613e7b57613e7a613b96565b5b6000613e8986828701613de3565b9350506020613e9a86828701613de3565b9250506040613eab86828701613d2e565b9150509250925092565b6000819050919050565b6000613eda613ed5613ed084613d70565b613eb5565b613d70565b9050919050565b6000613eec82613ebf565b9050919050565b6000613efe82613ee1565b9050919050565b613f0e81613ef3565b82525050565b6000602082019050613f296000830184613f05565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613f7182613ca1565b810181811067ffffffffffffffff82111715613f9057613f8f613f39565b5b80604052505050565b6000613fa3613b8c565b9050613faf8282613f68565b919050565b600067ffffffffffffffff821115613fcf57613fce613f39565b5b613fd882613ca1565b9050602081019050919050565b82818337600083830152505050565b600061400761400284613fb4565b613f99565b90508281526020810184848401111561402357614022613f34565b5b61402e848285613fe5565b509392505050565b600082601f83011261404b5761404a613f2f565b5b813561405b848260208601613ff4565b91505092915050565b6000806040838503121561407b5761407a613b96565b5b600083013567ffffffffffffffff81111561409957614098613b9b565b5b6140a585828601614036565b92505060206140b685828601613d2e565b9150509250929050565b6000602082840312156140d6576140d5613b96565b5b600082013567ffffffffffffffff8111156140f4576140f3613b9b565b5b61410084828501614036565b91505092915050565b60006020828403121561411f5761411e613b96565b5b600061412d84828501613de3565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61416b81613d0d565b82525050565b600061417d8383614162565b60208301905092915050565b6000602082019050919050565b60006141a182614136565b6141ab8185614141565b93506141b683614152565b8060005b838110156141e75781516141ce8882614171565b97506141d983614189565b9250506001810190506141ba565b5085935050505092915050565b6000602082019050818103600083015261420e8184614196565b905092915050565b600080fd5b600080fd5b60008083601f84011261423657614235613f2f565b5b8235905067ffffffffffffffff81111561425357614252614216565b5b60208301915083602082028301111561426f5761426e61421b565b5b9250929050565b60008060006040848603121561428f5761428e613b96565b5b600061429d86828701613d2e565b935050602084013567ffffffffffffffff8111156142be576142bd613b9b565b5b6142ca86828701614220565b92509250509250925092565b6142df81613c25565b81146142ea57600080fd5b50565b6000813590506142fc816142d6565b92915050565b6000806040838503121561431957614318613b96565b5b600061432785828601613de3565b9250506020614338858286016142ed565b9150509250929050565b600067ffffffffffffffff82111561435d5761435c613f39565b5b61436682613ca1565b9050602081019050919050565b600061438661438184614342565b613f99565b9050828152602081018484840111156143a2576143a1613f34565b5b6143ad848285613fe5565b509392505050565b600082601f8301126143ca576143c9613f2f565b5b81356143da848260208601614373565b91505092915050565b600080600080608085870312156143fd576143fc613b96565b5b600061440b87828801613de3565b945050602061441c87828801613de3565b935050604061442d87828801613d2e565b925050606085013567ffffffffffffffff81111561444e5761444d613b9b565b5b61445a878288016143b5565b91505092959194509250565b6000806040838503121561447d5761447c613b96565b5b600061448b85828601613de3565b925050602061449c85828601613de3565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006144dc602083613c66565b91506144e7826144a6565b602082019050919050565b6000602082019050818103600083015261450b816144cf565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061455957607f821691505b60208210810361456c5761456b614512565b5b50919050565b60006040820190506145876000830185613da2565b6145946020830184613da2565b9392505050565b6000815190506145aa816142d6565b92915050565b6000602082840312156145c6576145c5613b96565b5b60006145d48482850161459b565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061461782613d0d565b915061462283613d0d565b925082820190508082111561463a576146396145dd565b5b92915050565b7f534f4c445f4f5554000000000000000000000000000000000000000000000000600082015250565b6000614676600883613c66565b915061468182614640565b602082019050919050565b600060208201905081810360008301526146a581614669565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261470e7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826146d1565b61471886836146d1565b95508019841693508086168417925050509392505050565b600061474b61474661474184613d0d565b613eb5565b613d0d565b9050919050565b6000819050919050565b61476583614730565b61477961477182614752565b8484546146de565b825550505050565b600090565b61478e614781565b61479981848461475c565b505050565b5b818110156147bd576147b2600082614786565b60018101905061479f565b5050565b601f821115614802576147d3816146ac565b6147dc846146c1565b810160208510156147eb578190505b6147ff6147f7856146c1565b83018261479e565b50505b505050565b600082821c905092915050565b600061482560001984600802614807565b1980831691505092915050565b600061483e8383614814565b9150826002028217905092915050565b61485782613c5b565b67ffffffffffffffff8111156148705761486f613f39565b5b61487a8254614541565b6148858282856147c1565b600060209050601f8311600181146148b857600084156148a6578287015190505b6148b08582614832565b865550614918565b601f1984166148c6866146ac565b60005b828110156148ee578489015182556001820191506020850194506020810190506148c9565b8683101561490b5784890151614907601f891682614814565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e4f545f544f4b454e5f4f574e45520000000000000000000000000000000000600082015250565b6000614985600f83613c66565b91506149908261494f565b602082019050919050565b600060208201905081810360008301526149b481614978565b9050919050565b7f546f6b656e7320617265206e6f74207269676874206c6576656c000000000000600082015250565b60006149f1601a83613c66565b91506149fc826149bb565b602082019050919050565b60006020820190508181036000830152614a20816149e4565b9050919050565b6000614a3282613d0d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a6457614a636145dd565b5b600182019050919050565b7f746f6b656e494420706172616d206e6f7420696e20746f6b656e20617272617960008201527f20706172616d0000000000000000000000000000000000000000000000000000602082015250565b6000614acb602683613c66565b9150614ad682614a6f565b604082019050919050565b60006020820190508181036000830152614afa81614abe565b9050919050565b7f6e6f206275726e20746f6b656e20696e20746f6b656e2061727261792070617260008201527f616d000000000000000000000000000000000000000000000000000000000000602082015250565b6000614b5d602283613c66565b9150614b6882614b01565b604082019050919050565b60006020820190508181036000830152614b8c81614b50565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000614bc9601f83613c66565b9150614bd482614b93565b602082019050919050565b60006020820190508181036000830152614bf881614bbc565b9050919050565b7f53414c455f494e41435449564500000000000000000000000000000000000000600082015250565b6000614c35600d83613c66565b9150614c4082614bff565b602082019050919050565b60006020820190508181036000830152614c6481614c28565b9050919050565b7f7468697320776f756c6420657863656564206d696e74206d617820616c6c6f7760008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b6000614cc7602483613c66565b9150614cd282614c6b565b604082019050919050565b60006020820190508181036000830152614cf681614cba565b9050919050565b6000614d0882613d0d565b9150614d1383613d0d565b9250828202614d2181613d0d565b91508282048414831517614d3857614d376145dd565b5b5092915050565b7f494e434f52524543545f45544845525f56414c55450000000000000000000000600082015250565b6000614d75601583613c66565b9150614d8082614d3f565b602082019050919050565b60006020820190508181036000830152614da481614d68565b9050919050565b600081905092915050565b60008154614dc381614541565b614dcd8186614dab565b94506001821660008114614de85760018114614dfd57614e30565b60ff1983168652811515820286019350614e30565b614e06856146ac565b60005b83811015614e2857815481890152600182019150602081019050614e09565b838801955050505b50505092915050565b6000614e4482613c5b565b614e4e8185614dab565b9350614e5e818560208601613c77565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000614ea0600583614dab565b9150614eab82614e6a565b600582019050919050565b6000614ec28285614db6565b9150614ece8284614e39565b9150614ed982614e93565b91508190509392505050565b6000614ef18284614e39565b9150614efc82614e93565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614f63602683613c66565b9150614f6e82614f07565b604082019050919050565b60006020820190508181036000830152614f9281614f56565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614fd382613d0d565b9150614fde83613d0d565b925082614fee57614fed614f99565b5b828204905092915050565b600061500482613d0d565b915061500f83613d0d565b9250828203905081811115615027576150266145dd565b5b92915050565b600061503882613d0d565b915061504383613d0d565b92508261505357615052614f99565b5b828206905092915050565b600061506a8285614e39565b91506150768284614e39565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b60006150a982615082565b6150b3818561508d565b93506150c3818560208601613c77565b6150cc81613ca1565b840191505092915050565b60006080820190506150ec6000830187613da2565b6150f96020830186613da2565b6151066040830185613e38565b8181036060830152615118818461509e565b905095945050505050565b60008151905061513281613bcc565b92915050565b60006020828403121561514e5761514d613b96565b5b600061515c84828501615123565b9150509291505056fea26469706673582212208bbf4eeb1563bc5bf70735d70ba8dec490ec0ed4f9809caadf7a47269829297f64736f6c63430008110033
Deployed Bytecode Sourcemap
92367:6280:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69002:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94943:138;;;;;;;;;;;;;:::i;:::-;;72115:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73626:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93254:157;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68251:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93419:163;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95319:106;;;;;;;;;;;;;:::i;:::-;;89640:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93590:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92780:48;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94145:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97706:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97472:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;96647:712;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71923:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92515:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69371:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95201:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59125:103;;;;;;;;;;;;;:::i;:::-;;92892:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58474:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;95433:1206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72284:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92561:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94370:563;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93070:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92722:51;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93769:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;97367:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92835:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;98041:491;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92599:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74260:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92662:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59383:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95089:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69002:305;69104:4;69156:25;69141:40;;;:11;:40;;;;:105;;;;69213:33;69198:48;;;:11;:48;;;;69141:105;:158;;;;69263:36;69287:11;69263:23;:36::i;:::-;69141:158;69121:178;;69002:305;;;:::o;94943:138::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;95017:12:::1;;;;;;;;;;;95016:13;95001:12;;:28;;;;;;;;;;;;;;;;;;95045;95060:12;;;;;;;;;;;95045:28;;;;;;:::i;:::-;;;;;;;;94943:138::o:0;72115:100::-;72169:13;72202:5;72195:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72115:100;:::o;73626:204::-;73694:7;73719:16;73727:7;73719;:16::i;:::-;73714:64;;73744:34;;;;;;;;;;;;;;73714:64;73798:15;:24;73814:7;73798:24;;;;;;;;;;;;;;;;;;;;;73791:31;;73626:204;;;:::o;93254:157::-;93350:8;91682:1;89740:42;91634:45;;;:49;91630:225;;;89740:42;91705;;;91756:4;91763:8;91705:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91700:144;;91819:8;91800:28;;;;;;;;;;;:::i;:::-;;;;;;;;91700:144;91630:225;93371:32:::1;93385:8;93395:7;93371:13;:32::i;:::-;93254:157:::0;;;:::o;68251:303::-;68295:7;68520:15;:13;:15::i;:::-;68505:12;;68489:13;;:28;:46;68482:53;;68251:303;:::o;93419:163::-;93520:4;90936:1;89740:42;90888:45;;;:49;90884:539;;;91177:10;91169:18;;:4;:18;;;91165:85;;93537:37:::1;93556:4;93562:2;93566:7;93537:18;:37::i;:::-;91228:7:::0;;91165:85;89740:42;91269;;;91320:4;91327:10;91269:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91264:148;;91385:10;91366:30;;;;;;;;;;;:::i;:::-;;;;;;;;91264:148;90884:539;93537:37:::1;93556:4;93562:2;93566:7;93537:18;:37::i;:::-;93419:163:::0;;;;;:::o;95319:106::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;95377:7:::1;:5;:7::i;:::-;95369:25;;:48;95395:21;95369:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;95319:106::o:0;89640:143::-;89740:42;89640:143;:::o;93590:171::-;93695:4;90936:1;89740:42;90888:45;;;:49;90884:539;;;91177:10;91169:18;;:4;:18;;;91165:85;;93712:41:::1;93735:4;93741:2;93745:7;93712:22;:41::i;:::-;91228:7:::0;;91165:85;89740:42;91269;;;91320:4;91327:10;91269:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91264:148;;91385:10;91366:30;;;;;;;;;;;:::i;:::-;;;;;;;;91264:148;90884:539;93712:41:::1;93735:4;93741:2;93745:7;93712:22;:41::i;:::-;93590:171:::0;;;;;:::o;92780:48::-;;;;;;;;;;;;;;;;;:::o;94145:212::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;94271:9:::1;;94261:6;94245:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;94223:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;94327:22;94337:3;94342:6;94327:9;:22::i;:::-;94145:212:::0;;:::o;97706:138::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;97829:7:::1;97801:18;:25;97820:5;97801:25;;;;;;;;;;;:35;;;;;;:::i;:::-;;97706:138:::0;;:::o;97472:104::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;97561:7:::1;97545:13;:23;;;;;;:::i;:::-;;97472:104:::0;:::o;96647:712::-;96711:16;96757:18;96792:16;96802:5;96792:9;:16::i;:::-;96778:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96757:52;;96820:11;96834:13;;96820:27;;96858:19;96888:25;96929:9;96924:402;96944:3;96940:1;:7;96924:402;;;96969:31;97003:11;:14;97015:1;97003:14;;;;;;;;;;;96969:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97036:9;:16;;;97032:65;;;97073:8;;;97032:65;97141:1;97115:28;;:9;:14;;;:28;;;97111:103;;97184:9;:14;;;97164:34;;97111:103;97253:5;97232:26;;:17;:26;;;97228:87;;97298:1;97279;97281:13;;;;;;97279:16;;;;;;;;:::i;:::-;;;;;;;:20;;;;;97228:87;96954:372;96924:402;96949:3;;;;;;;96924:402;;;;97343:1;97336:8;;;;;;96647:712;;;:::o;71923:125::-;71987:7;72014:21;72027:7;72014:12;:21::i;:::-;:26;;;72007:33;;71923:125;;;:::o;92515:39::-;;;;:::o;69371:206::-;69435:7;69476:1;69459:19;;:5;:19;;;69455:60;;69487:28;;;;;;;;;;;;;;69455:60;69541:12;:19;69554:5;69541:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;69533:36;;69526:43;;69371:206;;;:::o;95201:110::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;95291:12:::1;95277:11;:26;;;;95201:110:::0;:::o;59125:103::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59190:30:::1;59217:1;59190:18;:30::i;:::-;59125:103::o:0;92892:49::-;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58474:87::-;58520:7;58547:6;;;;;;;;;;;58540:13;;58474:87;:::o;95433:1206::-;95565:10;95594:11;95651:1;95632:8;;:15;;:20;95624:29;;;;;;95693:10;95672:31;;:17;95680:8;95672:7;:17::i;:::-;:31;;;95664:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;95739:9;95734:409;95754:8;;:15;;95750:1;:19;95734:409;;;95823:10;95799:34;;:20;95807:8;;95816:1;95807:11;;;;;;;:::i;:::-;;;;;;;;95799:7;:20::i;:::-;:34;;;95791:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;95906:13;:23;95920:8;95906:23;;;;;;;;;;;;95876:13;:26;95890:8;;95899:1;95890:11;;;;;;;:::i;:::-;;;;;;;;95876:26;;;;;;;;;;;;:53;95868:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;95994:8;95979;;95988:1;95979:11;;;;;;;:::i;:::-;;;;;;;;:23;95975:143;;96031:4;96023:12;;95975:143;;;96098:4;96089:13;;95975:143;95771:3;;;;;:::i;:::-;;;;95734:409;;;;96170:4;96161:13;;:5;:13;;;96153:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;96246:4;96236:14;;:6;:14;;;96228:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;96305:9;96300:327;96320:8;;:15;;96316:1;:19;96300:327;;;96376:8;96361;;96370:1;96361:11;;;;;;;:::i;:::-;;;;;;;;:23;96357:245;;96405:24;96411:8;;96420:1;96411:11;;;;;;;:::i;:::-;;;;;;;;96423:5;96405;:24::i;:::-;96479:8;96448:15;:28;96464:8;;96473:1;96464:11;;;;;;;:::i;:::-;;;;;;;;96448:28;;;;;;;;;;;:39;;;;96357:245;;;96585:1;96555:13;:26;96569:8;;96578:1;96569:11;;;;;;;:::i;:::-;;;;;;;;96555:26;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;96357:245;96337:3;;;;;:::i;:::-;;;;96300:327;;;;95552:1087;;95433:1206;;;:::o;72284:104::-;72340:13;72373:7;72366:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;72284:104;:::o;92561:31::-;;;;:::o;94370:563::-;63859:1;64457:7;;:19;64449:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;63859:1;64590:7;:18;;;;94449:12:::1;;;;;;;;;;;94441:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;94547:11;;94534:6;94500:19;:31;94520:10;94500:31;;;;;;;;;;;;;;;;:40;;;;:::i;:::-;94498:60;;94490:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;94661:9;;94651:6;94635:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;94613:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;94761:9;94751:6;94739:9;;:18;;;;:::i;:::-;:31;;94717:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;94836:29;94846:10;94858:6;94836:9;:29::i;:::-;94915:6;94880:19;:31;94900:10;94880:31;;;;;;;;;;;;;;;;:41;;;;;;;:::i;:::-;;;;;;;;63815:1:::0;64769:7;:22;;;;94370:563;:::o;93070:176::-;93174:8;91682:1;89740:42;91634:45;;;:49;91630:225;;;89740:42;91705;;;91756:4;91763:8;91705:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91700:144;;91819:8;91800:28;;;;;;;;;;;:::i;:::-;;;;;;;;91700:144;91630:225;93195:43:::1;93219:8;93229;93195:23;:43::i;:::-;93070:176:::0;;;:::o;92722:51::-;;;;;;;;;;;;;;;;;:::o;93769:228::-;93920:4;90936:1;89740:42;90888:45;;;:49;90884:539;;;91177:10;91169:18;;:4;:18;;;91165:85;;93942:47:::1;93965:4;93971:2;93975:7;93984:4;93942:22;:47::i;:::-;91228:7:::0;;91165:85;89740:42;91269;;;91320:4;91327:10;91269:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;91264:148;;91385:10;91366:30;;;;;;;;;;;:::i;:::-;;;;;;;;91264:148;90884:539;93942:47:::1;93965:4;93971:2;93975:7;93984:4;93942:22;:47::i;:::-;93769:228:::0;;;;;;:::o;97367:97::-;97416:7;97443:13;:11;:13::i;:::-;97436:20;;97367:97;:::o;92835:50::-;;;;;;;;;;;;;;;;;:::o;98041:491::-;98106:13;98210:23;98236:18;:7;:16;:18::i;:::-;98210:44;;98294:1;98269:13;:22;98283:7;98269:22;;;;;;;;;;;;:26;98265:260;;;98343:18;:42;98362:13;:22;98376:7;98362:22;;;;;;;;;;;;98343:42;;;;;;;;;;;98386:9;98326:79;;;;;;;;;:::i;:::-;;;;;;;;;;;;;98312:94;;;;;98265:260;98479:23;98494:7;98479:14;:23::i;:::-;98462:50;;;;;;;;:::i;:::-;;;;;;;;;;;;;98448:65;;;98041:491;;;;:::o;92599:32::-;;;;:::o;74260:164::-;74357:4;74381:18;:25;74400:5;74381:25;;;;;;;;;;;;;;;:35;74407:8;74381:35;;;;;;;;;;;;;;;;;;;;;;;;;74374:42;;74260:164;;;;:::o;92662:32::-;;;;;;;;;;;;;:::o;59383:201::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;59492:1:::1;59472:22;;:8;:22;;::::0;59464:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;59548:28;59567:8;59548:18;:28::i;:::-;59383:201:::0;:::o;95089:102::-;58705:12;:10;:12::i;:::-;58694:23;;:7;:5;:7::i;:::-;:23;;;58686:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;95173:10:::1;95161:9;:22;;;;95089:102:::0;:::o;36223:157::-;36308:4;36347:25;36332:40;;;:11;:40;;;;36325:47;;36223:157;;;:::o;33272:98::-;33325:7;33352:10;33345:17;;33272:98;:::o;75612:187::-;75669:4;75712:7;75693:15;:13;:15::i;:::-;:26;;:53;;;;;75733:13;;75723:7;:23;75693:53;:98;;;;;75764:11;:20;75776:7;75764:20;;;;;;;;;;;:27;;;;;;;;;;;;75763:28;75693:98;75686:105;;75612:187;;;:::o;73181:379::-;73262:13;73278:24;73294:7;73278:15;:24::i;:::-;73262:40;;73323:5;73317:11;;:2;:11;;;73313:48;;73337:24;;;;;;;;;;;;;;73313:48;73394:5;73378:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;73404:37;73421:5;73428:12;:10;:12::i;:::-;73404:16;:37::i;:::-;73403:38;73378:63;73374:138;;;73465:35;;;;;;;;;;;;;;73374:138;73524:28;73533:2;73537:7;73546:5;73524:8;:28::i;:::-;73251:309;73181:379;;:::o;98540:100::-;98605:7;98631:1;98624:8;;98540:100;:::o;74491:170::-;74625:28;74635:4;74641:2;74645:7;74625:9;:28::i;:::-;74491:170;;;:::o;74732:185::-;74870:39;74887:4;74893:2;74897:7;74870:39;;;;;;;;;;;;:16;:39::i;:::-;74732:185;;;:::o;75807:104::-;75876:27;75886:2;75890:8;75876:27;;;;;;;;;;;;:9;:27::i;:::-;75807:104;;:::o;70752:1109::-;70814:21;;:::i;:::-;70848:12;70863:7;70848:22;;70931:4;70912:15;:13;:15::i;:::-;:23;;:47;;;;;70946:13;;70939:4;:20;70912:47;70908:886;;;70980:31;71014:11;:17;71026:4;71014:17;;;;;;;;;;;70980:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71055:9;:16;;;71050:729;;71126:1;71100:28;;:9;:14;;;:28;;;71096:101;;71164:9;71157:16;;;;;;71096:101;71499:261;71506:4;71499:261;;;71539:6;;;;;;;;71584:11;:17;71596:4;71584:17;;;;;;;;;;;71572:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71658:1;71632:28;;:9;:14;;;:28;;;71628:109;;71700:9;71693:16;;;;;;71628:109;71499:261;;;71050:729;70961:833;70908:886;71822:31;;;;;;;;;;;;;;70752:1109;;;;:::o;59744:191::-;59818:16;59837:6;;;;;;;;;;;59818:25;;59863:8;59854:6;;:17;;;;;;;;;;;;;;;;;;59918:8;59887:40;;59908:8;59887:40;;;;;;;;;;;;59807:128;59744:191;:::o;81256:2408::-;81336:35;81374:21;81387:7;81374:12;:21::i;:::-;81336:59;;81408:12;81423:13;:18;;;81408:33;;81458:13;81454:290;;;81488:22;81530:4;81514:20;;:12;:10;:12::i;:::-;:20;;;:77;;;;81555:36;81572:4;81578:12;:10;:12::i;:::-;81555:16;:36::i;:::-;81514:77;:134;;;;81636:12;:10;:12::i;:::-;81612:36;;:20;81624:7;81612:11;:20::i;:::-;:36;;;81514:134;81488:161;;81671:17;81666:66;;81697:35;;;;;;;;;;;;;;81666:66;81473:271;81454:290;81756:51;81778:4;81792:1;81796:7;81805:1;81756:21;:51::i;:::-;81872:35;81889:1;81893:7;81902:4;81872:8;:35::i;:::-;82203:31;82237:12;:18;82250:4;82237:18;;;;;;;;;;;;;;;82203:52;;82293:1;82270:11;:19;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82337:1;82309:11;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;82437:31;82471:11;:20;82483:7;82471:20;;;;;;;;;;;82437:54;;82522:4;82506:8;:13;;;:20;;;;;;;;;;;;;;;;;;82574:15;82541:8;:23;;;:49;;;;;;;;;;;;;;;;;;82623:4;82605:8;:15;;;:22;;;;;;;;;;;;;;;;;;82875:19;82907:1;82897:7;:11;82875:33;;82923:31;82957:11;:24;82969:11;82957:24;;;;;;;;;;;82923:58;;83025:1;83000:27;;:8;:13;;;;;;;;;;;;:27;;;82996:384;;83210:13;;83195:11;:28;83191:174;;83264:4;83248:8;:13;;;:20;;;;;;;;;;;;;;;;;;83317:13;:28;;;83291:8;:23;;;:54;;;;;;;;;;;;;;;;;;83191:174;82996:384;82178:1213;;;;83435:7;83431:1;83408:35;;83417:4;83408:35;;;;;;;;;;;;83454:50;83475:4;83489:1;83493:7;83502:1;83454:20;:50::i;:::-;83631:12;;:14;;;;;;;;;;;;;81325:2339;;81256:2408;;:::o;73902:287::-;74013:12;:10;:12::i;:::-;74001:24;;:8;:24;;;73997:54;;74034:17;;;;;;;;;;;;;;73997:54;74109:8;74064:18;:32;74083:12;:10;:12::i;:::-;74064:32;;;;;;;;;;;;;;;:42;74097:8;74064:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;74162:8;74133:48;;74148:12;:10;:12::i;:::-;74133:48;;;74172:8;74133:48;;;;;;:::i;:::-;;;;;;;;73902:287;;:::o;74988:369::-;75155:28;75165:4;75171:2;75175:7;75155:9;:28::i;:::-;75198:15;:2;:13;;;:15::i;:::-;:76;;;;;75218:56;75249:4;75255:2;75259:7;75268:5;75218:30;:56::i;:::-;75217:57;75198:76;75194:156;;;75298:40;;;;;;;;;;;;;;75194:156;74988:369;;;;:::o;33739:723::-;33795:13;34025:1;34016:5;:10;34012:53;;34043:10;;;;;;;;;;;;;;;;;;;;;34012:53;34075:12;34090:5;34075:20;;34106:14;34131:78;34146:1;34138:4;:9;34131:78;;34164:8;;;;;:::i;:::-;;;;34195:2;34187:10;;;;;:::i;:::-;;;34131:78;;;34219:19;34251:6;34241:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34219:39;;34269:154;34285:1;34276:5;:10;34269:154;;34313:1;34303:11;;;;;:::i;:::-;;;34380:2;34372:5;:10;;;;:::i;:::-;34359:2;:24;;;;:::i;:::-;34346:39;;34329:6;34336;34329:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;34409:2;34400:11;;;;;:::i;:::-;;;34269:154;;;34447:6;34433:21;;;;;33739:723;;;;:::o;72459:318::-;72532:13;72563:16;72571:7;72563;:16::i;:::-;72558:59;;72588:29;;;;;;;;;;;;;;72558:59;72630:21;72654:10;:8;:10::i;:::-;72630:34;;72707:1;72688:7;72682:21;:26;:87;;;;;;;;;;;;;;;;;72735:7;72744:18;:7;:16;:18::i;:::-;72718:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72682:87;72675:94;;;72459:318;;;:::o;83782:196::-;83924:2;83897:15;:24;83913:7;83897:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;83962:7;83958:2;83942:28;;83951:5;83942:28;;;;;;;;;;;;83782:196;;;:::o;78725:2130::-;78840:35;78878:21;78891:7;78878:12;:21::i;:::-;78840:59;;78938:4;78916:26;;:13;:18;;;:26;;;78912:67;;78951:28;;;;;;;;;;;;;;78912:67;78992:22;79034:4;79018:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;79055:36;79072:4;79078:12;:10;:12::i;:::-;79055:16;:36::i;:::-;79018:73;:126;;;;79132:12;:10;:12::i;:::-;79108:36;;:20;79120:7;79108:11;:20::i;:::-;:36;;;79018:126;78992:153;;79163:17;79158:66;;79189:35;;;;;;;;;;;;;;79158:66;79253:1;79239:16;;:2;:16;;;79235:52;;79264:23;;;;;;;;;;;;;;79235:52;79300:43;79322:4;79328:2;79332:7;79341:1;79300:21;:43::i;:::-;79408:35;79425:1;79429:7;79438:4;79408:8;:35::i;:::-;79769:1;79739:12;:18;79752:4;79739:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79813:1;79785:12;:16;79798:2;79785:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;79831:31;79865:11;:20;79877:7;79865:20;;;;;;;;;;;79831:54;;79916:2;79900:8;:13;;;:18;;;;;;;;;;;;;;;;;;79966:15;79933:8;:23;;;:49;;;;;;;;;;;;;;;;;;80234:19;80266:1;80256:7;:11;80234:33;;80282:31;80316:11;:24;80328:11;80316:24;;;;;;;;;;;80282:58;;80384:1;80359:27;;:8;:13;;;;;;;;;;;;:27;;;80355:384;;80569:13;;80554:11;:28;80550:174;;80623:4;80607:8;:13;;;:20;;;;;;;;;;;;;;;;;;80676:13;:28;;;80650:8;:23;;;:54;;;;;;;;;;;;;;;;;;80550:174;80355:384;79714:1036;;;80786:7;80782:2;80767:27;;80776:4;80767:27;;;;;;;;;;;;80805:42;80826:4;80832:2;80836:7;80845:1;80805:20;:42::i;:::-;78829:2026;;78725:2130;;;:::o;76274:163::-;76397:32;76403:2;76407:8;76417:5;76424:4;76397:5;:32::i;:::-;76274:163;;;:::o;85785:159::-;;;;;:::o;86603:158::-;;;;;:::o;25374:387::-;25434:4;25642:12;25709:7;25697:20;25689:28;;25752:1;25745:4;:8;25738:15;;;25374:387;;;:::o;84470:667::-;84633:4;84670:2;84654:36;;;84691:12;:10;:12::i;:::-;84705:4;84711:7;84720:5;84654:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;84650:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;84905:1;84888:6;:13;:18;84884:235;;84934:40;;;;;;;;;;;;;;84884:235;85077:6;85071:13;85062:6;85058:2;85054:15;85047:38;84650:480;84783:45;;;84773:55;;;:6;:55;;;;84766:62;;;84470:667;;;;;;:::o;97584:114::-;97644:13;97677;97670:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;97584:114;:::o;76696:1775::-;76835:20;76858:13;;76835:36;;76900:1;76886:16;;:2;:16;;;76882:48;;76911:19;;;;;;;;;;;;;;76882:48;76957:1;76945:8;:13;76941:44;;76967:18;;;;;;;;;;;;;;76941:44;76998:61;77028:1;77032:2;77036:12;77050:8;76998:21;:61::i;:::-;77371:8;77336:12;:16;77349:2;77336:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77435:8;77395:12;:16;77408:2;77395:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77494:2;77461:11;:25;77473:12;77461:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;77561:15;77511:11;:25;77523:12;77511:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;77594:20;77617:12;77594:35;;77644:11;77673:8;77658:12;:23;77644:37;;77702:4;:23;;;;;77710:15;:2;:13;;;:15::i;:::-;77702:23;77698:641;;;77746:314;77802:12;77798:2;77777:38;;77794:1;77777:38;;;;;;;;;;;;77843:69;77882:1;77886:2;77890:14;;;;;;77906:5;77843:30;:69::i;:::-;77838:174;;77948:40;;;;;;;;;;;;;;77838:174;78055:3;78039:12;:19;77746:314;;78141:12;78124:13;;:29;78120:43;;78155:8;;;78120:43;77698:641;;;78204:120;78260:14;;;;;;78256:2;78235:40;;78252:1;78235:40;;;;;;;;;;;;78319:3;78303:12;:19;78204:120;;77698:641;78369:12;78353:13;:28;;;;77311:1082;;78403:60;78432:1;78436:2;78440:12;78454:8;78403:20;:60::i;:::-;76824:1647;76696:1775;;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:60::-;5895:3;5916:5;5909:12;;5867:60;;;:::o;5933:142::-;5983:9;6016:53;6034:34;6043:24;6061:5;6043:24;:::i;:::-;6034:34;:::i;:::-;6016:53;:::i;:::-;6003:66;;5933:142;;;:::o;6081:126::-;6131:9;6164:37;6195:5;6164:37;:::i;:::-;6151:50;;6081:126;;;:::o;6213:158::-;6295:9;6328:37;6359:5;6328:37;:::i;:::-;6315:50;;6213:158;;;:::o;6377:195::-;6496:69;6559:5;6496:69;:::i;:::-;6491:3;6484:82;6377:195;;:::o;6578:286::-;6703:4;6741:2;6730:9;6726:18;6718:26;;6754:103;6854:1;6843:9;6839:17;6830:6;6754:103;:::i;:::-;6578:286;;;;:::o;6870:117::-;6979:1;6976;6969:12;6993:117;7102:1;7099;7092:12;7116:180;7164:77;7161:1;7154:88;7261:4;7258:1;7251:15;7285:4;7282:1;7275:15;7302:281;7385:27;7407:4;7385:27;:::i;:::-;7377:6;7373:40;7515:6;7503:10;7500:22;7479:18;7467:10;7464:34;7461:62;7458:88;;;7526:18;;:::i;:::-;7458:88;7566:10;7562:2;7555:22;7345:238;7302:281;;:::o;7589:129::-;7623:6;7650:20;;:::i;:::-;7640:30;;7679:33;7707:4;7699:6;7679:33;:::i;:::-;7589:129;;;:::o;7724:308::-;7786:4;7876:18;7868:6;7865:30;7862:56;;;7898:18;;:::i;:::-;7862:56;7936:29;7958:6;7936:29;:::i;:::-;7928:37;;8020:4;8014;8010:15;8002:23;;7724:308;;;:::o;8038:146::-;8135:6;8130:3;8125;8112:30;8176:1;8167:6;8162:3;8158:16;8151:27;8038:146;;;:::o;8190:425::-;8268:5;8293:66;8309:49;8351:6;8309:49;:::i;:::-;8293:66;:::i;:::-;8284:75;;8382:6;8375:5;8368:21;8420:4;8413:5;8409:16;8458:3;8449:6;8444:3;8440:16;8437:25;8434:112;;;8465:79;;:::i;:::-;8434:112;8555:54;8602:6;8597:3;8592;8555:54;:::i;:::-;8274:341;8190:425;;;;;:::o;8635:340::-;8691:5;8740:3;8733:4;8725:6;8721:17;8717:27;8707:122;;8748:79;;:::i;:::-;8707:122;8865:6;8852:20;8890:79;8965:3;8957:6;8950:4;8942:6;8938:17;8890:79;:::i;:::-;8881:88;;8697:278;8635:340;;;;:::o;8981:654::-;9059:6;9067;9116:2;9104:9;9095:7;9091:23;9087:32;9084:119;;;9122:79;;:::i;:::-;9084:119;9270:1;9259:9;9255:17;9242:31;9300:18;9292:6;9289:30;9286:117;;;9322:79;;:::i;:::-;9286:117;9427:63;9482:7;9473:6;9462:9;9458:22;9427:63;:::i;:::-;9417:73;;9213:287;9539:2;9565:53;9610:7;9601:6;9590:9;9586:22;9565:53;:::i;:::-;9555:63;;9510:118;8981:654;;;;;:::o;9641:509::-;9710:6;9759:2;9747:9;9738:7;9734:23;9730:32;9727:119;;;9765:79;;:::i;:::-;9727:119;9913:1;9902:9;9898:17;9885:31;9943:18;9935:6;9932:30;9929:117;;;9965:79;;:::i;:::-;9929:117;10070:63;10125:7;10116:6;10105:9;10101:22;10070:63;:::i;:::-;10060:73;;9856:287;9641:509;;;;:::o;10156:329::-;10215:6;10264:2;10252:9;10243:7;10239:23;10235:32;10232:119;;;10270:79;;:::i;:::-;10232:119;10390:1;10415:53;10460:7;10451:6;10440:9;10436:22;10415:53;:::i;:::-;10405:63;;10361:117;10156:329;;;;:::o;10491:114::-;10558:6;10592:5;10586:12;10576:22;;10491:114;;;:::o;10611:184::-;10710:11;10744:6;10739:3;10732:19;10784:4;10779:3;10775:14;10760:29;;10611:184;;;;:::o;10801:132::-;10868:4;10891:3;10883:11;;10921:4;10916:3;10912:14;10904:22;;10801:132;;;:::o;10939:108::-;11016:24;11034:5;11016:24;:::i;:::-;11011:3;11004:37;10939:108;;:::o;11053:179::-;11122:10;11143:46;11185:3;11177:6;11143:46;:::i;:::-;11221:4;11216:3;11212:14;11198:28;;11053:179;;;;:::o;11238:113::-;11308:4;11340;11335:3;11331:14;11323:22;;11238:113;;;:::o;11387:732::-;11506:3;11535:54;11583:5;11535:54;:::i;:::-;11605:86;11684:6;11679:3;11605:86;:::i;:::-;11598:93;;11715:56;11765:5;11715:56;:::i;:::-;11794:7;11825:1;11810:284;11835:6;11832:1;11829:13;11810:284;;;11911:6;11905:13;11938:63;11997:3;11982:13;11938:63;:::i;:::-;11931:70;;12024:60;12077:6;12024:60;:::i;:::-;12014:70;;11870:224;11857:1;11854;11850:9;11845:14;;11810:284;;;11814:14;12110:3;12103:10;;11511:608;;;11387:732;;;;:::o;12125:373::-;12268:4;12306:2;12295:9;12291:18;12283:26;;12355:9;12349:4;12345:20;12341:1;12330:9;12326:17;12319:47;12383:108;12486:4;12477:6;12383:108;:::i;:::-;12375:116;;12125:373;;;;:::o;12504:117::-;12613:1;12610;12603:12;12627:117;12736:1;12733;12726:12;12767:568;12840:8;12850:6;12900:3;12893:4;12885:6;12881:17;12877:27;12867:122;;12908:79;;:::i;:::-;12867:122;13021:6;13008:20;12998:30;;13051:18;13043:6;13040:30;13037:117;;;13073:79;;:::i;:::-;13037:117;13187:4;13179:6;13175:17;13163:29;;13241:3;13233:4;13225:6;13221:17;13211:8;13207:32;13204:41;13201:128;;;13248:79;;:::i;:::-;13201:128;12767:568;;;;;:::o;13341:704::-;13436:6;13444;13452;13501:2;13489:9;13480:7;13476:23;13472:32;13469:119;;;13507:79;;:::i;:::-;13469:119;13627:1;13652:53;13697:7;13688:6;13677:9;13673:22;13652:53;:::i;:::-;13642:63;;13598:117;13782:2;13771:9;13767:18;13754:32;13813:18;13805:6;13802:30;13799:117;;;13835:79;;:::i;:::-;13799:117;13948:80;14020:7;14011:6;14000:9;13996:22;13948:80;:::i;:::-;13930:98;;;;13725:313;13341:704;;;;;:::o;14051:116::-;14121:21;14136:5;14121:21;:::i;:::-;14114:5;14111:32;14101:60;;14157:1;14154;14147:12;14101:60;14051:116;:::o;14173:133::-;14216:5;14254:6;14241:20;14232:29;;14270:30;14294:5;14270:30;:::i;:::-;14173:133;;;;:::o;14312:468::-;14377:6;14385;14434:2;14422:9;14413:7;14409:23;14405:32;14402:119;;;14440:79;;:::i;:::-;14402:119;14560:1;14585:53;14630:7;14621:6;14610:9;14606:22;14585:53;:::i;:::-;14575:63;;14531:117;14687:2;14713:50;14755:7;14746:6;14735:9;14731:22;14713:50;:::i;:::-;14703:60;;14658:115;14312:468;;;;;:::o;14786:307::-;14847:4;14937:18;14929:6;14926:30;14923:56;;;14959:18;;:::i;:::-;14923:56;14997:29;15019:6;14997:29;:::i;:::-;14989:37;;15081:4;15075;15071:15;15063:23;;14786:307;;;:::o;15099:423::-;15176:5;15201:65;15217:48;15258:6;15217:48;:::i;:::-;15201:65;:::i;:::-;15192:74;;15289:6;15282:5;15275:21;15327:4;15320:5;15316:16;15365:3;15356:6;15351:3;15347:16;15344:25;15341:112;;;15372:79;;:::i;:::-;15341:112;15462:54;15509:6;15504:3;15499;15462:54;:::i;:::-;15182:340;15099:423;;;;;:::o;15541:338::-;15596:5;15645:3;15638:4;15630:6;15626:17;15622:27;15612:122;;15653:79;;:::i;:::-;15612:122;15770:6;15757:20;15795:78;15869:3;15861:6;15854:4;15846:6;15842:17;15795:78;:::i;:::-;15786:87;;15602:277;15541:338;;;;:::o;15885:943::-;15980:6;15988;15996;16004;16053:3;16041:9;16032:7;16028:23;16024:33;16021:120;;;16060:79;;:::i;:::-;16021:120;16180:1;16205:53;16250:7;16241:6;16230:9;16226:22;16205:53;:::i;:::-;16195:63;;16151:117;16307:2;16333:53;16378:7;16369:6;16358:9;16354:22;16333:53;:::i;:::-;16323:63;;16278:118;16435:2;16461:53;16506:7;16497:6;16486:9;16482:22;16461:53;:::i;:::-;16451:63;;16406:118;16591:2;16580:9;16576:18;16563:32;16622:18;16614:6;16611:30;16608:117;;;16644:79;;:::i;:::-;16608:117;16749:62;16803:7;16794:6;16783:9;16779:22;16749:62;:::i;:::-;16739:72;;16534:287;15885:943;;;;;;;:::o;16834:474::-;16902:6;16910;16959:2;16947:9;16938:7;16934:23;16930:32;16927:119;;;16965:79;;:::i;:::-;16927:119;17085:1;17110:53;17155:7;17146:6;17135:9;17131:22;17110:53;:::i;:::-;17100:63;;17056:117;17212:2;17238:53;17283:7;17274:6;17263:9;17259:22;17238:53;:::i;:::-;17228:63;;17183:118;16834:474;;;;;:::o;17314:182::-;17454:34;17450:1;17442:6;17438:14;17431:58;17314:182;:::o;17502:366::-;17644:3;17665:67;17729:2;17724:3;17665:67;:::i;:::-;17658:74;;17741:93;17830:3;17741:93;:::i;:::-;17859:2;17854:3;17850:12;17843:19;;17502:366;;;:::o;17874:419::-;18040:4;18078:2;18067:9;18063:18;18055:26;;18127:9;18121:4;18117:20;18113:1;18102:9;18098:17;18091:47;18155:131;18281:4;18155:131;:::i;:::-;18147:139;;17874:419;;;:::o;18299:180::-;18347:77;18344:1;18337:88;18444:4;18441:1;18434:15;18468:4;18465:1;18458:15;18485:320;18529:6;18566:1;18560:4;18556:12;18546:22;;18613:1;18607:4;18603:12;18634:18;18624:81;;18690:4;18682:6;18678:17;18668:27;;18624:81;18752:2;18744:6;18741:14;18721:18;18718:38;18715:84;;18771:18;;:::i;:::-;18715:84;18536:269;18485:320;;;:::o;18811:332::-;18932:4;18970:2;18959:9;18955:18;18947:26;;18983:71;19051:1;19040:9;19036:17;19027:6;18983:71;:::i;:::-;19064:72;19132:2;19121:9;19117:18;19108:6;19064:72;:::i;:::-;18811:332;;;;;:::o;19149:137::-;19203:5;19234:6;19228:13;19219:22;;19250:30;19274:5;19250:30;:::i;:::-;19149:137;;;;:::o;19292:345::-;19359:6;19408:2;19396:9;19387:7;19383:23;19379:32;19376:119;;;19414:79;;:::i;:::-;19376:119;19534:1;19559:61;19612:7;19603:6;19592:9;19588:22;19559:61;:::i;:::-;19549:71;;19505:125;19292:345;;;;:::o;19643:180::-;19691:77;19688:1;19681:88;19788:4;19785:1;19778:15;19812:4;19809:1;19802:15;19829:191;19869:3;19888:20;19906:1;19888:20;:::i;:::-;19883:25;;19922:20;19940:1;19922:20;:::i;:::-;19917:25;;19965:1;19962;19958:9;19951:16;;19986:3;19983:1;19980:10;19977:36;;;19993:18;;:::i;:::-;19977:36;19829:191;;;;:::o;20026:158::-;20166:10;20162:1;20154:6;20150:14;20143:34;20026:158;:::o;20190:365::-;20332:3;20353:66;20417:1;20412:3;20353:66;:::i;:::-;20346:73;;20428:93;20517:3;20428:93;:::i;:::-;20546:2;20541:3;20537:12;20530:19;;20190:365;;;:::o;20561:419::-;20727:4;20765:2;20754:9;20750:18;20742:26;;20814:9;20808:4;20804:20;20800:1;20789:9;20785:17;20778:47;20842:131;20968:4;20842:131;:::i;:::-;20834:139;;20561:419;;;:::o;20986:141::-;21035:4;21058:3;21050:11;;21081:3;21078:1;21071:14;21115:4;21112:1;21102:18;21094:26;;20986:141;;;:::o;21133:93::-;21170:6;21217:2;21212;21205:5;21201:14;21197:23;21187:33;;21133:93;;;:::o;21232:107::-;21276:8;21326:5;21320:4;21316:16;21295:37;;21232:107;;;;:::o;21345:393::-;21414:6;21464:1;21452:10;21448:18;21487:97;21517:66;21506:9;21487:97;:::i;:::-;21605:39;21635:8;21624:9;21605:39;:::i;:::-;21593:51;;21677:4;21673:9;21666:5;21662:21;21653:30;;21726:4;21716:8;21712:19;21705:5;21702:30;21692:40;;21421:317;;21345:393;;;;;:::o;21744:142::-;21794:9;21827:53;21845:34;21854:24;21872:5;21854:24;:::i;:::-;21845:34;:::i;:::-;21827:53;:::i;:::-;21814:66;;21744:142;;;:::o;21892:75::-;21935:3;21956:5;21949:12;;21892:75;;;:::o;21973:269::-;22083:39;22114:7;22083:39;:::i;:::-;22144:91;22193:41;22217:16;22193:41;:::i;:::-;22185:6;22178:4;22172:11;22144:91;:::i;:::-;22138:4;22131:105;22049:193;21973:269;;;:::o;22248:73::-;22293:3;22248:73;:::o;22327:189::-;22404:32;;:::i;:::-;22445:65;22503:6;22495;22489:4;22445:65;:::i;:::-;22380:136;22327:189;;:::o;22522:186::-;22582:120;22599:3;22592:5;22589:14;22582:120;;;22653:39;22690:1;22683:5;22653:39;:::i;:::-;22626:1;22619:5;22615:13;22606:22;;22582:120;;;22522:186;;:::o;22714:543::-;22815:2;22810:3;22807:11;22804:446;;;22849:38;22881:5;22849:38;:::i;:::-;22933:29;22951:10;22933:29;:::i;:::-;22923:8;22919:44;23116:2;23104:10;23101:18;23098:49;;;23137:8;23122:23;;23098:49;23160:80;23216:22;23234:3;23216:22;:::i;:::-;23206:8;23202:37;23189:11;23160:80;:::i;:::-;22819:431;;22804:446;22714:543;;;:::o;23263:117::-;23317:8;23367:5;23361:4;23357:16;23336:37;;23263:117;;;;:::o;23386:169::-;23430:6;23463:51;23511:1;23507:6;23499:5;23496:1;23492:13;23463:51;:::i;:::-;23459:56;23544:4;23538;23534:15;23524:25;;23437:118;23386:169;;;;:::o;23560:295::-;23636:4;23782:29;23807:3;23801:4;23782:29;:::i;:::-;23774:37;;23844:3;23841:1;23837:11;23831:4;23828:21;23820:29;;23560:295;;;;:::o;23860:1395::-;23977:37;24010:3;23977:37;:::i;:::-;24079:18;24071:6;24068:30;24065:56;;;24101:18;;:::i;:::-;24065:56;24145:38;24177:4;24171:11;24145:38;:::i;:::-;24230:67;24290:6;24282;24276:4;24230:67;:::i;:::-;24324:1;24348:4;24335:17;;24380:2;24372:6;24369:14;24397:1;24392:618;;;;25054:1;25071:6;25068:77;;;25120:9;25115:3;25111:19;25105:26;25096:35;;25068:77;25171:67;25231:6;25224:5;25171:67;:::i;:::-;25165:4;25158:81;25027:222;24362:887;;24392:618;24444:4;24440:9;24432:6;24428:22;24478:37;24510:4;24478:37;:::i;:::-;24537:1;24551:208;24565:7;24562:1;24559:14;24551:208;;;24644:9;24639:3;24635:19;24629:26;24621:6;24614:42;24695:1;24687:6;24683:14;24673:24;;24742:2;24731:9;24727:18;24714:31;;24588:4;24585:1;24581:12;24576:17;;24551:208;;;24787:6;24778:7;24775:19;24772:179;;;24845:9;24840:3;24836:19;24830:26;24888:48;24930:4;24922:6;24918:17;24907:9;24888:48;:::i;:::-;24880:6;24873:64;24795:156;24772:179;24997:1;24993;24985:6;24981:14;24977:22;24971:4;24964:36;24399:611;;;24362:887;;23952:1303;;;23860:1395;;:::o;25261:180::-;25309:77;25306:1;25299:88;25406:4;25403:1;25396:15;25430:4;25427:1;25420:15;25447:165;25587:17;25583:1;25575:6;25571:14;25564:41;25447:165;:::o;25618:366::-;25760:3;25781:67;25845:2;25840:3;25781:67;:::i;:::-;25774:74;;25857:93;25946:3;25857:93;:::i;:::-;25975:2;25970:3;25966:12;25959:19;;25618:366;;;:::o;25990:419::-;26156:4;26194:2;26183:9;26179:18;26171:26;;26243:9;26237:4;26233:20;26229:1;26218:9;26214:17;26207:47;26271:131;26397:4;26271:131;:::i;:::-;26263:139;;25990:419;;;:::o;26415:176::-;26555:28;26551:1;26543:6;26539:14;26532:52;26415:176;:::o;26597:366::-;26739:3;26760:67;26824:2;26819:3;26760:67;:::i;:::-;26753:74;;26836:93;26925:3;26836:93;:::i;:::-;26954:2;26949:3;26945:12;26938:19;;26597:366;;;:::o;26969:419::-;27135:4;27173:2;27162:9;27158:18;27150:26;;27222:9;27216:4;27212:20;27208:1;27197:9;27193:17;27186:47;27250:131;27376:4;27250:131;:::i;:::-;27242:139;;26969:419;;;:::o;27394:233::-;27433:3;27456:24;27474:5;27456:24;:::i;:::-;27447:33;;27502:66;27495:5;27492:77;27489:103;;27572:18;;:::i;:::-;27489:103;27619:1;27612:5;27608:13;27601:20;;27394:233;;;:::o;27633:225::-;27773:34;27769:1;27761:6;27757:14;27750:58;27842:8;27837:2;27829:6;27825:15;27818:33;27633:225;:::o;27864:366::-;28006:3;28027:67;28091:2;28086:3;28027:67;:::i;:::-;28020:74;;28103:93;28192:3;28103:93;:::i;:::-;28221:2;28216:3;28212:12;28205:19;;27864:366;;;:::o;28236:419::-;28402:4;28440:2;28429:9;28425:18;28417:26;;28489:9;28483:4;28479:20;28475:1;28464:9;28460:17;28453:47;28517:131;28643:4;28517:131;:::i;:::-;28509:139;;28236:419;;;:::o;28661:221::-;28801:34;28797:1;28789:6;28785:14;28778:58;28870:4;28865:2;28857:6;28853:15;28846:29;28661:221;:::o;28888:366::-;29030:3;29051:67;29115:2;29110:3;29051:67;:::i;:::-;29044:74;;29127:93;29216:3;29127:93;:::i;:::-;29245:2;29240:3;29236:12;29229:19;;28888:366;;;:::o;29260:419::-;29426:4;29464:2;29453:9;29449:18;29441:26;;29513:9;29507:4;29503:20;29499:1;29488:9;29484:17;29477:47;29541:131;29667:4;29541:131;:::i;:::-;29533:139;;29260:419;;;:::o;29685:181::-;29825:33;29821:1;29813:6;29809:14;29802:57;29685:181;:::o;29872:366::-;30014:3;30035:67;30099:2;30094:3;30035:67;:::i;:::-;30028:74;;30111:93;30200:3;30111:93;:::i;:::-;30229:2;30224:3;30220:12;30213:19;;29872:366;;;:::o;30244:419::-;30410:4;30448:2;30437:9;30433:18;30425:26;;30497:9;30491:4;30487:20;30483:1;30472:9;30468:17;30461:47;30525:131;30651:4;30525:131;:::i;:::-;30517:139;;30244:419;;;:::o;30669:163::-;30809:15;30805:1;30797:6;30793:14;30786:39;30669:163;:::o;30838:366::-;30980:3;31001:67;31065:2;31060:3;31001:67;:::i;:::-;30994:74;;31077:93;31166:3;31077:93;:::i;:::-;31195:2;31190:3;31186:12;31179:19;;30838:366;;;:::o;31210:419::-;31376:4;31414:2;31403:9;31399:18;31391:26;;31463:9;31457:4;31453:20;31449:1;31438:9;31434:17;31427:47;31491:131;31617:4;31491:131;:::i;:::-;31483:139;;31210:419;;;:::o;31635:223::-;31775:34;31771:1;31763:6;31759:14;31752:58;31844:6;31839:2;31831:6;31827:15;31820:31;31635:223;:::o;31864:366::-;32006:3;32027:67;32091:2;32086:3;32027:67;:::i;:::-;32020:74;;32103:93;32192:3;32103:93;:::i;:::-;32221:2;32216:3;32212:12;32205:19;;31864:366;;;:::o;32236:419::-;32402:4;32440:2;32429:9;32425:18;32417:26;;32489:9;32483:4;32479:20;32475:1;32464:9;32460:17;32453:47;32517:131;32643:4;32517:131;:::i;:::-;32509:139;;32236:419;;;:::o;32661:410::-;32701:7;32724:20;32742:1;32724:20;:::i;:::-;32719:25;;32758:20;32776:1;32758:20;:::i;:::-;32753:25;;32813:1;32810;32806:9;32835:30;32853:11;32835:30;:::i;:::-;32824:41;;33014:1;33005:7;33001:15;32998:1;32995:22;32975:1;32968:9;32948:83;32925:139;;33044:18;;:::i;:::-;32925:139;32709:362;32661:410;;;;:::o;33077:171::-;33217:23;33213:1;33205:6;33201:14;33194:47;33077:171;:::o;33254:366::-;33396:3;33417:67;33481:2;33476:3;33417:67;:::i;:::-;33410:74;;33493:93;33582:3;33493:93;:::i;:::-;33611:2;33606:3;33602:12;33595:19;;33254:366;;;:::o;33626:419::-;33792:4;33830:2;33819:9;33815:18;33807:26;;33879:9;33873:4;33869:20;33865:1;33854:9;33850:17;33843:47;33907:131;34033:4;33907:131;:::i;:::-;33899:139;;33626:419;;;:::o;34051:148::-;34153:11;34190:3;34175:18;;34051:148;;;;:::o;34229:874::-;34332:3;34369:5;34363:12;34398:36;34424:9;34398:36;:::i;:::-;34450:89;34532:6;34527:3;34450:89;:::i;:::-;34443:96;;34570:1;34559:9;34555:17;34586:1;34581:166;;;;34761:1;34756:341;;;;34548:549;;34581:166;34665:4;34661:9;34650;34646:25;34641:3;34634:38;34727:6;34720:14;34713:22;34705:6;34701:35;34696:3;34692:45;34685:52;;34581:166;;34756:341;34823:38;34855:5;34823:38;:::i;:::-;34883:1;34897:154;34911:6;34908:1;34905:13;34897:154;;;34985:7;34979:14;34975:1;34970:3;34966:11;34959:35;35035:1;35026:7;35022:15;35011:26;;34933:4;34930:1;34926:12;34921:17;;34897:154;;;35080:6;35075:3;35071:16;35064:23;;34763:334;;34548:549;;34336:767;;34229:874;;;;:::o;35109:390::-;35215:3;35243:39;35276:5;35243:39;:::i;:::-;35298:89;35380:6;35375:3;35298:89;:::i;:::-;35291:96;;35396:65;35454:6;35449:3;35442:4;35435:5;35431:16;35396:65;:::i;:::-;35486:6;35481:3;35477:16;35470:23;;35219:280;35109:390;;;;:::o;35505:155::-;35645:7;35641:1;35633:6;35629:14;35622:31;35505:155;:::o;35666:400::-;35826:3;35847:84;35929:1;35924:3;35847:84;:::i;:::-;35840:91;;35940:93;36029:3;35940:93;:::i;:::-;36058:1;36053:3;36049:11;36042:18;;35666:400;;;:::o;36072:695::-;36350:3;36372:92;36460:3;36451:6;36372:92;:::i;:::-;36365:99;;36481:95;36572:3;36563:6;36481:95;:::i;:::-;36474:102;;36593:148;36737:3;36593:148;:::i;:::-;36586:155;;36758:3;36751:10;;36072:695;;;;;:::o;36773:541::-;37006:3;37028:95;37119:3;37110:6;37028:95;:::i;:::-;37021:102;;37140:148;37284:3;37140:148;:::i;:::-;37133:155;;37305:3;37298:10;;36773:541;;;;:::o;37320:225::-;37460:34;37456:1;37448:6;37444:14;37437:58;37529:8;37524:2;37516:6;37512:15;37505:33;37320:225;:::o;37551:366::-;37693:3;37714:67;37778:2;37773:3;37714:67;:::i;:::-;37707:74;;37790:93;37879:3;37790:93;:::i;:::-;37908:2;37903:3;37899:12;37892:19;;37551:366;;;:::o;37923:419::-;38089:4;38127:2;38116:9;38112:18;38104:26;;38176:9;38170:4;38166:20;38162:1;38151:9;38147:17;38140:47;38204:131;38330:4;38204:131;:::i;:::-;38196:139;;37923:419;;;:::o;38348:180::-;38396:77;38393:1;38386:88;38493:4;38490:1;38483:15;38517:4;38514:1;38507:15;38534:185;38574:1;38591:20;38609:1;38591:20;:::i;:::-;38586:25;;38625:20;38643:1;38625:20;:::i;:::-;38620:25;;38664:1;38654:35;;38669:18;;:::i;:::-;38654:35;38711:1;38708;38704:9;38699:14;;38534:185;;;;:::o;38725:194::-;38765:4;38785:20;38803:1;38785:20;:::i;:::-;38780:25;;38819:20;38837:1;38819:20;:::i;:::-;38814:25;;38863:1;38860;38856:9;38848:17;;38887:1;38881:4;38878:11;38875:37;;;38892:18;;:::i;:::-;38875:37;38725:194;;;;:::o;38925:176::-;38957:1;38974:20;38992:1;38974:20;:::i;:::-;38969:25;;39008:20;39026:1;39008:20;:::i;:::-;39003:25;;39047:1;39037:35;;39052:18;;:::i;:::-;39037:35;39093:1;39090;39086:9;39081:14;;38925:176;;;;:::o;39107:435::-;39287:3;39309:95;39400:3;39391:6;39309:95;:::i;:::-;39302:102;;39421:95;39512:3;39503:6;39421:95;:::i;:::-;39414:102;;39533:3;39526:10;;39107:435;;;;;:::o;39548:98::-;39599:6;39633:5;39627:12;39617:22;;39548:98;;;:::o;39652:168::-;39735:11;39769:6;39764:3;39757:19;39809:4;39804:3;39800:14;39785:29;;39652:168;;;;:::o;39826:373::-;39912:3;39940:38;39972:5;39940:38;:::i;:::-;39994:70;40057:6;40052:3;39994:70;:::i;:::-;39987:77;;40073:65;40131:6;40126:3;40119:4;40112:5;40108:16;40073:65;:::i;:::-;40163:29;40185:6;40163:29;:::i;:::-;40158:3;40154:39;40147:46;;39916:283;39826:373;;;;:::o;40205:640::-;40400:4;40438:3;40427:9;40423:19;40415:27;;40452:71;40520:1;40509:9;40505:17;40496:6;40452:71;:::i;:::-;40533:72;40601:2;40590:9;40586:18;40577:6;40533:72;:::i;:::-;40615;40683:2;40672:9;40668:18;40659:6;40615:72;:::i;:::-;40734:9;40728:4;40724:20;40719:2;40708:9;40704:18;40697:48;40762:76;40833:4;40824:6;40762:76;:::i;:::-;40754:84;;40205:640;;;;;;;:::o;40851:141::-;40907:5;40938:6;40932:13;40923:22;;40954:32;40980:5;40954:32;:::i;:::-;40851:141;;;;:::o;40998:349::-;41067:6;41116:2;41104:9;41095:7;41091:23;41087:32;41084:119;;;41122:79;;:::i;:::-;41084:119;41242:1;41267:63;41322:7;41313:6;41302:9;41298:22;41267:63;:::i;:::-;41257:73;;41213:127;40998:349;;;;:::o
Swarm Source
ipfs://8bbf4eeb1563bc5bf70735d70ba8dec490ec0ed4f9809caadf7a47269829297f
Loading...
Loading
Loading...
Loading
OVERVIEW
This art may or may not be ducksHosting On Chain Duck Races soon follow us on Twitter and Join us in Discord: https://discord.gg/2q7znqBTxj to learn how to play for freehttps://www.quacksqq.io/Multichain Portfolio | 30 Chains
Chain | Token | Portfolio % | Price | Amount | Value |
---|---|---|---|---|---|
POL | 100.00% | $0.46901 | 0.8 | $0.375208 |
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.