Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 Sora
Holders
3,566
Market
Volume (24H)
0.004 ETH
Min Price (24H)
$6.76 @ 0.002000 ETH
Max Price (24H)
$6.76 @ 0.002000 ETH
Other Info
Token Contract
Balance
1 SoraLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
Sora
Compiler Version
v0.7.6+commit.7338295f
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-10-07 */ // SPDX-License-Identifier: MIT // Scroll down to the bottom to find the contract of interest. // File: @openzeppelin/[email protected]/introspection/IERC165.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/[email protected]/utils/Context.sol pragma solidity >=0.6.0 <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 GSN 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 payable) { return msg.sender; } function _msgData() internal view virtual returns (bytes memory) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/[email protected]/token/ERC721/IERC721.sol pragma solidity >=0.6.2 <0.8.0; // import "@openzeppelin/[email protected]/introspection/IERC165.sol"; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Metadata.sol pragma solidity >=0.6.2 <0.8.0; // import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Enumerable.sol pragma solidity >=0.6.2 <0.8.0; // import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol"; /** * @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); } // File: @openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol pragma solidity >=0.6.0 <0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } // File: @openzeppelin/[email protected]/introspection/ERC165.sol pragma solidity >=0.6.0 <0.8.0; // import "@openzeppelin/[email protected]/introspection/IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts may inherit from this and call {_registerInterface} to declare * their support of an interface. */ abstract contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See {IERC165-supportsInterface}. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See {IERC165-supportsInterface}. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal virtual { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } // File: @openzeppelin/[email protected]/utils/Address.sol pragma solidity >=0.6.2 <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; // solhint-disable-next-line no-inline-assembly 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"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (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"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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 // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/[email protected]/utils/EnumerableSet.sol pragma solidity >=0.6.0 <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; // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. 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] = toDeleteIndex + 1; // All indexes are 1-based // 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) { require(set._values.length > index, "EnumerableSet: index out of bounds"); return set._values[index]; } // 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); } // 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)))); } // 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)); } } // File: @openzeppelin/[email protected]/utils/EnumerableMap.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Library for managing an enumerable variant of Solidity's * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`] * type. * * Maps have the following properties: * * - Entries are added, removed, and checked for existence in constant time * (O(1)). * - Entries are enumerated in O(n). No guarantees are made on the ordering. * * ``` * contract Example { * // Add the library methods * using EnumerableMap for EnumerableMap.UintToAddressMap; * * // Declare a set state variable * EnumerableMap.UintToAddressMap private myMap; * } * ``` * * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are * supported. */ library EnumerableMap { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Map type with // bytes32 keys and values. // The Map implementation uses private functions, and user-facing // implementations (such as Uint256ToAddressMap) are just wrappers around // the underlying Map. // This means that we can only create new EnumerableMaps for types that fit // in bytes32. struct MapEntry { bytes32 _key; bytes32 _value; } struct Map { // Storage of map keys and values MapEntry[] _entries; // Position of the entry defined by a key in the `entries` array, plus 1 // because index 0 means a key is not in the map. mapping (bytes32 => uint256) _indexes; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) { // Equivalent to !contains(map, key) map._entries.push(MapEntry({ _key: key, _value: value })); // The entry is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value map._indexes[key] = map._entries.length; return true; } else { map._entries[keyIndex - 1]._value = value; return false; } } /** * @dev Removes a key-value pair from a map. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function _remove(Map storage map, bytes32 key) private returns (bool) { // We read and store the key's index to prevent multiple reads from the same storage slot uint256 keyIndex = map._indexes[key]; if (keyIndex != 0) { // Equivalent to contains(map, key) // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one // in the array, and then remove the last entry (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = keyIndex - 1; uint256 lastIndex = map._entries.length - 1; // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement. MapEntry storage lastEntry = map._entries[lastIndex]; // Move the last entry to the index where the entry to delete is map._entries[toDeleteIndex] = lastEntry; // Update the index for the moved entry map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based // Delete the slot where the moved entry was stored map._entries.pop(); // Delete the index for the deleted slot delete map._indexes[key]; return true; } else { return false; } } /** * @dev Returns true if the key is in the map. O(1). */ function _contains(Map storage map, bytes32 key) private view returns (bool) { return map._indexes[key] != 0; } /** * @dev Returns the number of key-value pairs in the map. O(1). */ function _length(Map storage map) private view returns (uint256) { return map._entries.length; } /** * @dev Returns the key-value pair stored at position `index` in the map. O(1). * * Note that there are no guarantees on the ordering of entries inside the * array, and it may change when more entries are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) { require(map._entries.length > index, "EnumerableMap: index out of bounds"); MapEntry storage entry = map._entries[index]; return (entry._key, entry._value); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. */ function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) { uint256 keyIndex = map._indexes[key]; if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key) return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function _get(Map storage map, bytes32 key) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } /** * @dev Same as {_get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {_tryGet}. */ function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) { uint256 keyIndex = map._indexes[key]; require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key) return map._entries[keyIndex - 1]._value; // All indexes are 1-based } // UintToAddressMap struct UintToAddressMap { Map _inner; } /** * @dev Adds a key-value pair to a map, or updates the value for an existing * key. O(1). * * Returns true if the key was added to the map, that is if it was not * already present. */ function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) { return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the key was removed from the map, that is if it was present. */ function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) { return _remove(map._inner, bytes32(key)); } /** * @dev Returns true if the key is in the map. O(1). */ function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) { return _contains(map._inner, bytes32(key)); } /** * @dev Returns the number of elements in the map. O(1). */ function length(UintToAddressMap storage map) internal view returns (uint256) { return _length(map._inner); } /** * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) { (bytes32 key, bytes32 value) = _at(map._inner, index); return (uint256(key), address(uint160(uint256(value)))); } /** * @dev Tries to returns the value associated with `key`. O(1). * Does not revert if `key` is not in the map. * * _Available since v3.4._ */ function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) { (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key)); return (success, address(uint160(uint256(value)))); } /** * @dev Returns the value associated with `key`. O(1). * * Requirements: * * - `key` must be in the map. */ function get(UintToAddressMap storage map, uint256 key) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key))))); } /** * @dev Same as {get}, with a custom error message when `key` is not in the map. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryGet}. */ function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) { return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage)))); } } // File: @openzeppelin/[email protected]/utils/Strings.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev String operations. */ library Strings { /** * @dev Converts a `uint256` to its ASCII `string` 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); uint256 index = digits - 1; temp = value; while (temp != 0) { buffer[index--] = bytes1(uint8(48 + temp % 10)); temp /= 10; } return string(buffer); } } // File: @chainlink/[email protected]/src/v0.7/vendor/SafeMathChainlink.sol pragma solidity ^0.7.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMathChainlink { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add( uint256 a, uint256 b ) internal pure returns ( uint256 ) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub( uint256 a, uint256 b ) internal pure returns ( uint256 ) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul( uint256 a, uint256 b ) internal pure returns ( uint256 ) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-solidity/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div( uint256 a, uint256 b ) internal pure returns ( uint256 ) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod( uint256 a, uint256 b ) internal pure returns ( uint256 ) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } // File: @chainlink/[email protected]/src/v0.7/interfaces/LinkTokenInterface.sol pragma solidity ^0.7.0; interface LinkTokenInterface { function allowance( address owner, address spender ) external view returns ( uint256 remaining ); function approve( address spender, uint256 value ) external returns ( bool success ); function balanceOf( address owner ) external view returns ( uint256 balance ); function decimals() external view returns ( uint8 decimalPlaces ); function decreaseApproval( address spender, uint256 addedValue ) external returns ( bool success ); function increaseApproval( address spender, uint256 subtractedValue ) external; function name() external view returns ( string memory tokenName ); function symbol() external view returns ( string memory tokenSymbol ); function totalSupply() external view returns ( uint256 totalTokensIssued ); function transfer( address to, uint256 value ) external returns ( bool success ); function transferAndCall( address to, uint256 value, bytes calldata data ) external returns ( bool success ); function transferFrom( address from, address to, uint256 value ) external returns ( bool success ); } // File: @chainlink/[email protected]/src/v0.7/VRFRequestIDBase.sol pragma solidity ^0.7.0; contract VRFRequestIDBase { /** * @notice returns the seed which is actually input to the VRF coordinator * * @dev To prevent repetition of VRF output due to repetition of the * @dev user-supplied seed, that seed is combined in a hash with the * @dev user-specific nonce, and the address of the consuming contract. The * @dev risk of repetition is mostly mitigated by inclusion of a blockhash in * @dev the final seed, but the nonce does protect against repetition in * @dev requests which are included in a single block. * * @param _userSeed VRF seed input provided by user * @param _requester Address of the requesting contract * @param _nonce User-specific nonce at the time of the request */ function makeVRFInputSeed( bytes32 _keyHash, uint256 _userSeed, address _requester, uint256 _nonce ) internal pure returns ( uint256 ) { return uint256(keccak256(abi.encode(_keyHash, _userSeed, _requester, _nonce))); } /** * @notice Returns the id for this request * @param _keyHash The serviceAgreement ID to be used for this request * @param _vRFInputSeed The seed to be passed directly to the VRF * @return The id for this request * * @dev Note that _vRFInputSeed is not the seed passed by the consuming * @dev contract, but the one generated by makeVRFInputSeed */ function makeRequestId( bytes32 _keyHash, uint256 _vRFInputSeed ) internal pure returns ( bytes32 ) { return keccak256(abi.encodePacked(_keyHash, _vRFInputSeed)); } } // File: @chainlink/[email protected]/src/v0.7/VRFConsumerBase.sol pragma solidity ^0.7.0; // import "@chainlink/[email protected]/src/v0.7/vendor/SafeMathChainlink.sol"; // import "@chainlink/[email protected]/src/v0.7/interfaces/LinkTokenInterface.sol"; // import "@chainlink/[email protected]/src/v0.7/VRFRequestIDBase.sol"; /** **************************************************************************** * @notice Interface for contracts using VRF randomness * ***************************************************************************** * @dev PURPOSE * * @dev Reggie the Random Oracle (not his real job) wants to provide randomness * @dev to Vera the verifier in such a way that Vera can be sure he's not * @dev making his output up to suit himself. Reggie provides Vera a public key * @dev to which he knows the secret key. Each time Vera provides a seed to * @dev Reggie, he gives back a value which is computed completely * @dev deterministically from the seed and the secret key. * * @dev Reggie provides a proof by which Vera can verify that the output was * @dev correctly computed once Reggie tells it to her, but without that proof, * @dev the output is indistinguishable to her from a uniform random sample * @dev from the output space. * * @dev The purpose of this contract is to make it easy for unrelated contracts * @dev to talk to Vera the verifier about the work Reggie is doing, to provide * @dev simple access to a verifiable source of randomness. * ***************************************************************************** * @dev USAGE * * @dev Calling contracts must inherit from VRFConsumerBase, and can * @dev initialize VRFConsumerBase's attributes in their constructor as * @dev shown: * * @dev contract VRFConsumer { * @dev constuctor(<other arguments>, address _vrfCoordinator, address _link) * @dev VRFConsumerBase(_vrfCoordinator, _link) public { * @dev <initialization with other arguments goes here> * @dev } * @dev } * * @dev The oracle will have given you an ID for the VRF keypair they have * @dev committed to (let's call it keyHash), and have told you the minimum LINK * @dev price for VRF service. Make sure your contract has sufficient LINK, and * @dev call requestRandomness(keyHash, fee, seed), where seed is the input you * @dev want to generate randomness from. * * @dev Once the VRFCoordinator has received and validated the oracle's response * @dev to your request, it will call your contract's fulfillRandomness method. * * @dev The randomness argument to fulfillRandomness is the actual random value * @dev generated from your seed. * * @dev The requestId argument is generated from the keyHash and the seed by * @dev makeRequestId(keyHash, seed). If your contract could have concurrent * @dev requests open, you can use the requestId to track which seed is * @dev associated with which randomness. See VRFRequestIDBase.sol for more * @dev details. (See "SECURITY CONSIDERATIONS" for principles to keep in mind, * @dev if your contract could have multiple requests in flight simultaneously.) * * @dev Colliding `requestId`s are cryptographically impossible as long as seeds * @dev differ. (Which is critical to making unpredictable randomness! See the * @dev next section.) * * ***************************************************************************** * @dev SECURITY CONSIDERATIONS * * @dev A method with the ability to call your fulfillRandomness method directly * @dev could spoof a VRF response with any random value, so it's critical that * @dev it cannot be directly called by anything other than this base contract * @dev (specifically, by the VRFConsumerBase.rawFulfillRandomness method). * * @dev For your users to trust that your contract's random behavior is free * @dev from malicious interference, it's best if you can write it so that all * @dev behaviors implied by a VRF response are executed *during* your * @dev fulfillRandomness method. If your contract must store the response (or * @dev anything derived from it) and use it later, you must ensure that any * @dev user-significant behavior which depends on that stored value cannot be * @dev manipulated by a subsequent VRF request. * * @dev Similarly, both miners and the VRF oracle itself have some influence * @dev over the order in which VRF responses appear on the blockchain, so if * @dev your contract could have multiple VRF requests in flight simultaneously, * @dev you must ensure that the order in which the VRF responses arrive cannot * @dev be used to manipulate your contract's user-significant behavior. * * @dev Since the ultimate input to the VRF is mixed with the block hash of the * @dev block in which the request is made, user-provided seeds have no impact * @dev on its economic security properties. They are only included for API * @dev compatability with previous versions of this contract. * * @dev Since the block hash of the block which contains the requestRandomness * @dev call is mixed into the input to the VRF *last*, a sufficiently powerful * @dev miner could, in principle, fork the blockchain to evict the block * @dev containing the request, forcing the request to be included in a * @dev different block with a different hash, and therefore a different input * @dev to the VRF. However, such an attack would incur a substantial economic * @dev cost. This cost scales with the number of blocks the VRF oracle waits * @dev until it calls responds to a request. */ abstract contract VRFConsumerBase is VRFRequestIDBase { using SafeMathChainlink for uint256; /** * @notice fulfillRandomness handles the VRF response. Your contract must * @notice implement it. See "SECURITY CONSIDERATIONS" above for important * @notice principles to keep in mind when implementing your fulfillRandomness * @notice method. * * @dev VRFConsumerBase expects its subcontracts to have a method with this * @dev signature, and will call it once it has verified the proof * @dev associated with the randomness. (It is triggered via a call to * @dev rawFulfillRandomness, below.) * * @param requestId The Id initially returned by requestRandomness * @param randomness the VRF output */ function fulfillRandomness( bytes32 requestId, uint256 randomness ) internal virtual; /** * @dev In order to keep backwards compatibility we have kept the user * seed field around. We remove the use of it because given that the blockhash * enters later, it overrides whatever randomness the used seed provides. * Given that it adds no security, and can easily lead to misunderstandings, * we have removed it from usage and can now provide a simpler API. */ uint256 constant private USER_SEED_PLACEHOLDER = 0; /** * @notice requestRandomness initiates a request for VRF output given _seed * * @dev The fulfillRandomness method receives the output, once it's provided * @dev by the Oracle, and verified by the vrfCoordinator. * * @dev The _keyHash must already be registered with the VRFCoordinator, and * @dev the _fee must exceed the fee specified during registration of the * @dev _keyHash. * * @dev The _seed parameter is vestigial, and is kept only for API * @dev compatibility with older versions. It can't *hurt* to mix in some of * @dev your own randomness, here, but it's not necessary because the VRF * @dev oracle will mix the hash of the block containing your request into the * @dev VRF seed it ultimately uses. * * @param _keyHash ID of public key against which randomness is generated * @param _fee The amount of LINK to send with the request * * @return requestId unique ID for this request * * @dev The returned requestId can be used to distinguish responses to * @dev concurrent requests. It is passed as the first argument to * @dev fulfillRandomness. */ function requestRandomness( bytes32 _keyHash, uint256 _fee ) internal returns ( bytes32 requestId ) { LINK.transferAndCall(vrfCoordinator, _fee, abi.encode(_keyHash, USER_SEED_PLACEHOLDER)); // This is the seed passed to VRFCoordinator. The oracle will mix this with // the hash of the block containing this request to obtain the seed/input // which is finally passed to the VRF cryptographic machinery. uint256 vRFSeed = makeVRFInputSeed(_keyHash, USER_SEED_PLACEHOLDER, address(this), nonces[_keyHash]); // nonces[_keyHash] must stay in sync with // VRFCoordinator.nonces[_keyHash][this], which was incremented by the above // successful LINK.transferAndCall (in VRFCoordinator.randomnessRequest). // This provides protection against the user repeating their input seed, // which would result in a predictable/duplicate output, if multiple such // requests appeared in the same block. nonces[_keyHash] = nonces[_keyHash].add(1); return makeRequestId(_keyHash, vRFSeed); } LinkTokenInterface immutable internal LINK; address immutable private vrfCoordinator; // Nonces for each VRF key from which randomness has been requested. // // Must stay in sync with VRFCoordinator[_keyHash][this] mapping(bytes32 /* keyHash */ => uint256 /* nonce */) private nonces; /** * @param _vrfCoordinator address of VRFCoordinator contract * @param _link address of LINK token contract * * @dev https://docs.chain.link/docs/link-token-contracts */ constructor( address _vrfCoordinator, address _link ) { vrfCoordinator = _vrfCoordinator; LINK = LinkTokenInterface(_link); } // rawFulfillRandomness is called by VRFCoordinator when it receives a valid VRF // proof. rawFulfillRandomness then calls fulfillRandomness, after validating // the origin of the call function rawFulfillRandomness( bytes32 requestId, uint256 randomness ) external { require(msg.sender == vrfCoordinator, "Only VRFCoordinator can fulfill"); fulfillRandomness(requestId, randomness); } } // File: @openzeppelin/[email protected]/math/SafeMath.sol pragma solidity >=0.6.0 <0.8.0; /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { uint256 c = a + b; if (c < a) return (false, 0); return (true, c); } /** * @dev Returns the substraction of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b > a) return (false, 0); return (true, a - b); } /** * @dev Returns the multiplication of two unsigned integers, with an overflow flag. * * _Available since v3.4._ */ function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) return (true, 0); uint256 c = a * b; if (c / a != b) return (false, 0); return (true, c); } /** * @dev Returns the division of two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a / b); } /** * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. * * _Available since v3.4._ */ function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { if (b == 0) return (false, 0); return (true, a % b); } /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); return a - b; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { if (a == 0) return 0; uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers, reverting on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: division by zero"); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b > 0, "SafeMath: modulo by zero"); return a % b; } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on * overflow (when the result is negative). * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {trySub}. * * Counterpart to Solidity's `-` operator. * * Requirements: * * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); return a - b; } /** * @dev Returns the integer division of two unsigned integers, reverting with custom message on * division by zero. The result is rounded towards zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryDiv}. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a / b; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * reverting with custom message when dividing by zero. * * CAUTION: This function is deprecated because it requires allocating memory for the error * message unnecessarily. For custom revert reasons use {tryMod}. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b > 0, errorMessage); return a % b; } } // File: @openzeppelin/[email protected]/token/ERC721/ERC721.sol pragma solidity >=0.6.0 <0.8.0; // import "@openzeppelin/[email protected]/utils/Context.sol"; // import "@openzeppelin/[email protected]/token/ERC721/IERC721.sol"; // import "@openzeppelin/[email protected]/token/ERC721/IERC721Metadata.sol"; // import "@openzeppelin/[email protected]/token/ERC721/IERC721Enumerable.sol"; // import "@openzeppelin/[email protected]/token/ERC721/IERC721Receiver.sol"; // import "@openzeppelin/[email protected]/introspection/ERC165.sol"; // import "@openzeppelin/[email protected]/math/SafeMath.sol"; // import "@openzeppelin/[email protected]/utils/Address.sol"; // import "@openzeppelin/[email protected]/utils/EnumerableSet.sol"; // import "@openzeppelin/[email protected]/utils/EnumerableMap.sol"; // import "@openzeppelin/[email protected]/utils/Strings.sol"; /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable { using SafeMath for uint256; using Address for address; using EnumerableSet for EnumerableSet.UintSet; using EnumerableMap for EnumerableMap.UintToAddressMap; using Strings for uint256; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from holder address to their (enumerable) set of owned tokens mapping (address => EnumerableSet.UintSet) private _holderTokens; // Enumerable mapping from token ids to their owners EnumerableMap.UintToAddressMap private _tokenOwners; // 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; // Token name string private _name; // Token symbol string private _symbol; // Optional mapping for token URIs mapping (uint256 => string) private _tokenURIs; // Base URI string private _baseURI; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c5 * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c5 ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; /* * bytes4(keccak256('name()')) == 0x06fdde03 * bytes4(keccak256('symbol()')) == 0x95d89b41 * bytes4(keccak256('tokenURI(uint256)')) == 0xc87b56dd * * => 0x06fdde03 ^ 0x95d89b41 ^ 0xc87b56dd == 0x5b5e139f */ bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f; /* * bytes4(keccak256('totalSupply()')) == 0x18160ddd * bytes4(keccak256('tokenOfOwnerByIndex(address,uint256)')) == 0x2f745c59 * bytes4(keccak256('tokenByIndex(uint256)')) == 0x4f6ccce7 * * => 0x18160ddd ^ 0x2f745c59 ^ 0x4f6ccce7 == 0x780e9d63 */ bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor (string memory name_, string memory symbol_) public { _name = name_; _symbol = symbol_; // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); _registerInterface(_INTERFACE_ID_ERC721_METADATA); _registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE); } /** * @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 _holderTokens[owner].length(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token"); } /** * @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 _tokenURI = _tokenURIs[tokenId]; string memory base = baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString())); } /** * @dev Returns the base URI set via {_setBaseURI}. This will be * automatically added as a prefix in {tokenURI} to each token's URI, or * to the token ID if no specific URI is set for that token ID. */ function baseURI() public view virtual returns (string memory) { return _baseURI; } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { return _holderTokens[owner].at(index); } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds return _tokenOwners.length(); } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { (uint256 tokenId, ) = _tokenOwners.at(index); return tokenId; } /** * @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 || ERC721.isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom(address from, address to, uint256 tokenId) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer(address from, address to, uint256 tokenId, bytes memory _data) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _tokenOwners.contains(tokenId); } /** * @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 || ERC721.isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: d* * - `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); _holderTokens[to].add(tokenId); _tokenOwners.set(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); // internal owner _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } _holderTokens[owner].remove(tokenId); _tokenOwners.remove(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"); // internal owner require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _holderTokens[from].remove(tokenId); _holderTokens[to].add(tokenId); _tokenOwners.set(tokenId, to); emit Transfer(from, to, tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Internal function to set the base URI for all token IDs. It is * automatically added as a prefix to the value returned in {tokenURI}, * or to the token ID if {tokenURI} is empty. */ function _setBaseURI(string memory baseURI_) internal virtual { _baseURI = baseURI_; } /** * @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()) { return true; } bytes memory returndata = to.functionCall(abi.encodeWithSelector( IERC721Receiver(to).onERC721Received.selector, _msgSender(), from, tokenId, _data ), "ERC721: transfer to non ERC721Receiver implementer"); bytes4 retval = abi.decode(returndata, (bytes4)); return (retval == _ERC721_RECEIVED); } /** * @dev Approve `to` to operate on `tokenId` * * Emits an {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { } } // File: @openzeppelin/[email protected]/access/Ownable.sol pragma solidity >=0.6.0 <0.8.0; // import "@openzeppelin/[email protected]/utils/Context.sol"; /** * @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 () internal { address msgSender = _msgSender(); _owner = msgSender; emit OwnershipTransferred(address(0), 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 { emit OwnershipTransferred(_owner, address(0)); _owner = 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"); emit OwnershipTransferred(_owner, newOwner); _owner = newOwner; } } // File: Sora.sol pragma solidity >=0.6.0 <0.8.0; pragma abicoder v2; // import "@chainlink/[email protected]/src/v0.7/vendor/SafeMathChainlink.sol"; // import "@chainlink/[email protected]/src/v0.7/interfaces/LinkTokenInterface.sol"; // import "@chainlink/[email protected]/src/v0.7/VRFRequestIDBase.sol"; // import "@chainlink/[email protected]/src/v0.7/VRFConsumerBase.sol"; // import "@openzeppelin/[email protected]/math/SafeMath.sol"; // import "@openzeppelin/[email protected]/token/ERC721/ERC721.sol"; // import "@openzeppelin/[email protected]/access/Ownable.sol"; contract Sora is VRFConsumerBase, ERC721, Ownable { using SafeMath for uint256; uint public constant TOKEN_PRICE = 80000000000000000; // 0.08 ETH uint public constant MAX_TOKENS_PER_PUBLIC_MINT = 10; // Only applies during public sale. uint public constant MAX_TOKENS = 10000; uint public saleState = 0; // 0: closed, 1: presale, 2: public sale. mapping(uint => string) public tokenNames; mapping(address => uint) public presaleReservations; uint public numPreSaleReservations = 0; string public LICENSE = "https://www.nftlicense.org"; // The license text/url for every token. string public PROVENANCE = ""; // Link to a json of all the sha256 hashes of the tokens. uint public RNG_VRF_RESULT; // rng is seeded with sha256( base10(RNG_VRF_RESULT) + RNG_SEED_KEY ) uint public RNG_SEED_KEY_HASH; // sha256(RNG_SEED_KEY) uint public RNG_CODE_HASH; // sha256(rng code's zip) string public RNG_SEED_KEY = ""; // revealed after all sale is over. string public RNG_CODE_URI = ""; // The place where you can download the rng code's zip. bytes32 internal vrfkeyHash; uint256 internal vrfFee; event TokenNameChanged(address _by, uint _tokenId, string _name); event LicenseChanged(string _license); event ProvenanceChanged(string _provenance); event RNGSeedRequested(uint _rngSeedKeyHash, uint _rngCodeHash, string _rngCodeURI); event RNGSeedFufilled(uint _vrfResult); event RNGCodeUriChanged(string _rngCodeURI); event RNGSeedKeyRevealed(string _rngSeedKey); event SaleClosed(); event PreSaleOpened(); event PublicSaleOpened(); // See https://docs.chain.link/docs/vrf-contracts/ for the values you need. constructor() ERC721("Sora's Dreamworld", "Sora") VRFConsumerBase( 0xf0d54349aDdcf704F77AE15b96510dEA15cb7952, // VRF Coordinator 0x514910771AF9Ca656af840dff83E8264EcF986CA // LINK Token ) { vrfkeyHash = 0xAA77729D3466CA35AE8D28B3BBAC7CC36A5031EFDC430821C02BC31A238AF445; vrfFee = 2 * 10 ** 18; // 2 LINK (Varies by network) _setBaseURI("https://sorasdreamworld.io/tokens/"); } function getRngSeed(uint _rngSeedKeyHash, uint _rngCodeHash, string memory _rngCodeURI) public onlyOwner returns (bytes32 requestId) { require(RNG_VRF_RESULT == 0, "Already generated!"); require(LINK.balanceOf(address(this)) >= vrfFee, "Not enough LINK."); RNG_SEED_KEY_HASH = _rngSeedKeyHash; RNG_CODE_HASH = _rngCodeHash; RNG_CODE_URI = _rngCodeURI; emit RNGSeedRequested(_rngSeedKeyHash, _rngCodeHash, _rngCodeURI); return requestRandomness(vrfkeyHash, vrfFee); } // Callback function used by VRF Coordinator function fulfillRandomness(bytes32 _requestId, uint256 _randomness) internal override { RNG_VRF_RESULT = _randomness; emit RNGSeedFufilled(_randomness); } // Reveal the RNG seed key. function setRNGSeedKey(string memory _rngSeedKey) public onlyOwner { RNG_SEED_KEY = _rngSeedKey; emit RNGSeedKeyRevealed(_rngSeedKey); } // Just incase we need to move the location of the code. function setRNGCodeUri(string memory _rngCodeURI) public onlyOwner { RNG_CODE_URI = _rngCodeURI; emit RNGCodeUriChanged(_rngCodeURI); } // Withdraws Ether for the owner. function withdraw() public onlyOwner { uint balance = address(this).balance; msg.sender.transfer(balance); } // Sets the provenance. function setProvenance(string memory _provenance) public onlyOwner { PROVENANCE = _provenance; emit ProvenanceChanged(_provenance); } // Sets base URI for all token IDs. // e.g. https://sorasdreamworld.io/tokens/ function setBaseURI(string memory _baseURI) public onlyOwner { _setBaseURI(_baseURI); } // Open the pre-sale. Only addresses with pre-sale reservations can mint. function openPreSale() public onlyOwner { saleState = 1; emit PreSaleOpened(); } // Open the public sale. Any address can mint. function openPublicSale() public onlyOwner { saleState = 2; emit PublicSaleOpened(); } // Close the sale. function closeSale() public onlyOwner { saleState = 0; emit SaleClosed(); } // Force mint for the addresses. // Can be called anytime. // If called right after the creation of the contract, the tokens // are assigned sequentially starting from id 0. function forceMint(address[] memory _addresses) public onlyOwner { require(totalSupply().add(_addresses.length) <= MAX_TOKENS, "Not enough slots."); for (uint i = 0; i < _addresses.length; i++) { uint mintIndex = totalSupply(); if (mintIndex < MAX_TOKENS) { _safeMint(_addresses[i], mintIndex); } } } // Self mint for the owner. // Can be called anytime. // This does not require the sale to be open. function selfMint(uint _numTokens) public onlyOwner { require(totalSupply().add(_numTokens) <= MAX_TOKENS, "Not enough slots."); for (uint i = 0; i < _numTokens; i++) { uint mintIndex = totalSupply(); if (mintIndex < MAX_TOKENS) { _safeMint(msg.sender, mintIndex); } } } // Reserves pre-sale slots for the addresses. function reserveForPreSale(address[] memory _addresses, uint _numPerAddress) public onlyOwner { uint numNeeded = _numPerAddress.mul(_addresses.length); require(numPreSaleReservations.add(numNeeded) <= MAX_TOKENS, "Not enough slots."); for (uint i = 0; i < _addresses.length; i++) { presaleReservations[_addresses[i]] += _numPerAddress; } numPreSaleReservations += numNeeded; } // Remove all the pre-sale reservations for the addresses. function removePreSaleReservations(address[] memory _addresses) public onlyOwner { uint numRemoved = 0; for (uint i = 0; i < _addresses.length; i++) { numRemoved += presaleReservations[_addresses[i]]; presaleReservations[_addresses[i]] = 0; } numPreSaleReservations -= numRemoved; } // Returns an array of the token ids under the owner. function tokensOfOwner(address _owner) external view returns(uint[] memory) { uint tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new uint[](0); } else { uint[] memory result = new uint[](tokenCount); for (uint index = 0; index < tokenCount; index++) { result[index] = tokenOfOwnerByIndex(_owner, index); } return result; } } // Sets the license text. function setLicense(string memory _license) public onlyOwner { LICENSE = _license; emit LicenseChanged(_license); } // Returns the license for tokens. function tokenLicense(uint _id) public view returns(string memory) { require(_id < totalSupply(), "Token not found."); return LICENSE; } // Mints tokens. function mint(uint _numTokens) public payable { require(_numTokens > 0, "Minimum number to mint is 1."); require(saleState > 0, "Sale not open."); require(totalSupply().add(_numTokens) <= MAX_TOKENS, "Not enough slots."); // This line ensures the minter is paying at enough to cover the tokens. require(msg.value >= TOKEN_PRICE.mul(_numTokens), "Wrong Ether value."); if (saleState == 1) { require(presaleReservations[msg.sender] >= _numTokens, "Not enough presale slots."); presaleReservations[msg.sender] -= _numTokens; } else { // 2 require(_numTokens <= MAX_TOKENS_PER_PUBLIC_MINT, "Tokens per mint exceeded."); } for (uint i = 0; i < _numTokens; i++) { uint mintIndex = totalSupply(); if (mintIndex < MAX_TOKENS) { _safeMint(msg.sender, mintIndex); } } } // Change the token name. function changeTokenName(uint _id, string memory _name) public { require(ownerOf(_id) == msg.sender, "You do not own this token."); require(sha256(bytes(_name)) != sha256(bytes(tokenNames[_id])), "Name unchanged."); tokenNames[_id] = _name; emit TokenNameChanged(msg.sender, _id, _name); } // Returns the token name. function viewTokenName(uint _id) public view returns (string memory) { require(_id < totalSupply(), "Token not found."); return tokenNames[_id]; } // Returns an array of the token names under the owner. function tokenNamesOfOwner(address _owner) external view returns (string[] memory) { uint tokenCount = balanceOf(_owner); if (tokenCount == 0) { return new string[](0); } else { string[] memory result = new string[](tokenCount); for (uint index = 0; index < tokenCount; index++) { result[index] = tokenNames[tokenOfOwnerByIndex(_owner, index)]; } return result; } } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_license","type":"string"}],"name":"LicenseChanged","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":[],"name":"PreSaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_provenance","type":"string"}],"name":"ProvenanceChanged","type":"event"},{"anonymous":false,"inputs":[],"name":"PublicSaleOpened","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_rngCodeURI","type":"string"}],"name":"RNGCodeUriChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_vrfResult","type":"uint256"}],"name":"RNGSeedFufilled","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_rngSeedKey","type":"string"}],"name":"RNGSeedKeyRevealed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"_rngSeedKeyHash","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_rngCodeHash","type":"uint256"},{"indexed":false,"internalType":"string","name":"_rngCodeURI","type":"string"}],"name":"RNGSeedRequested","type":"event"},{"anonymous":false,"inputs":[],"name":"SaleClosed","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_by","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"_name","type":"string"}],"name":"TokenNameChanged","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":"LICENSE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_PUBLIC_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNG_CODE_HASH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNG_CODE_URI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNG_SEED_KEY","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNG_SEED_KEY_HASH","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RNG_VRF_RESULT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"changeTokenName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"closeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"forceMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rngSeedKeyHash","type":"uint256"},{"internalType":"uint256","name":"_rngCodeHash","type":"uint256"},{"internalType":"string","name":"_rngCodeURI","type":"string"}],"name":"getRngSeed","outputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"}],"stateMutability":"nonpayable","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":"_numTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"numPreSaleReservations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openPreSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"openPublicSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleReservations","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"requestId","type":"bytes32"},{"internalType":"uint256","name":"randomness","type":"uint256"}],"name":"rawFulfillRandomness","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"removePreSaleReservations","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256","name":"_numPerAddress","type":"uint256"}],"name":"reserveForPreSale","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":"saleState","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_numTokens","type":"uint256"}],"name":"selfMint","outputs":[],"stateMutability":"nonpayable","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":"string","name":"_license","type":"string"}],"name":"setLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_rngCodeURI","type":"string"}],"name":"setRNGCodeUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_rngSeedKey","type":"string"}],"name":"setRNGSeedKey","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenNames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokenNamesOfOwner","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"viewTokenName","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6000600c819055600f55610100604052601a60c08190527f68747470733a2f2f7777772e6e66746c6963656e73652e6f726700000000000060e09081526200004b9160109190620002f0565b506040805160208101918290526000908190526200006c91601191620002f0565b506040805160208101918290526000908190526200008d91601591620002f0565b50604080516020810191829052600090819052620000ae91601691620002f0565b50348015620000bc57600080fd5b50604080518082018252601181527014dbdc9849dcc8111c99585b5ddbdc9b19607a1b60208083019190915282518084019093526004835263536f726160e01b908301527ff0d54349addcf704f77ae15b96510dea15cb795200000000000000000000000060a0527f514910771af9ca656af840dff83e8264ecf986ca000000000000000000000000608052906200015b6301ffc9a760e01b62000275565b815162000170906007906020850190620002f0565b50805162000186906008906020840190620002f0565b50620001996380ac58cd60e01b62000275565b620001ab635b5e139f60e01b62000275565b620001bd63780e9d6360e01b62000275565b5060009050620001cc620002d3565b600b80546001600160a01b0319166001600160a01b038316908117909155604051919250906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3507faa77729d3466ca35ae8d28b3bbac7cc36a5031efdc430821c02bc31a238af445601755671bc16d674ec80000601855604080516060810190915260228082526200026f9190620041d76020830139620002d7565b620003d3565b6001600160e01b03198082161415620002ab5760405162461bcd60e51b8152600401620002a2906200039c565b60405180910390fd5b6001600160e01b0319166000908152600160208190526040909120805460ff19169091179055565b3390565b8051620002ec90600a906020840190620002f0565b5050565b828054600181600116156101000203166002900490600052602060002090601f01602090048101928262000328576000855562000373565b82601f106200034357805160ff191683800117855562000373565b8280016001018555821562000373579182015b828111156200037357825182559160200191906001019062000356565b506200038192915062000385565b5090565b5b8082111562000381576000815560010162000386565b6020808252601c908201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604082015260600190565b60805160601c60a05160601c613dd062000407600039806115c8528061269d525080611e1c528061266e5250613dd06000f3fe6080604052600436106103505760003560e01c806370a08231116101c6578063c87b56dd116100f7578063ecb7ffd411610095578063f47c84c51161006f578063f47c84c514610925578063f84b40dc1461093a578063fd0ae1cc1461095a578063ffe630b51461096f57610350565b8063ecb7ffd4146108d0578063ee55efee146108f0578063f2fde38b1461090557610350565b8063d2d8cb67116100d1578063d2d8cb671461085b578063d84fedd314610870578063d9b137b214610890578063e985e9c5146108b057610350565b8063c87b56dd14610806578063cf2d0e0f14610826578063cf4022081461084657610350565b8063a0712d6811610164578063b88d4fde1161013e578063b88d4fde1461079c578063b98877e2146107bc578063c2e760d2146107dc578063c5da5cbe146107f157610350565b8063a0712d6814610754578063a22cb46514610767578063b585209b1461078757610350565b80638da5cb5b116101a05780638da5cb5b146106f557806394985ddd1461070a57806395d89b411461072a5780639a7a29dd1461073f57610350565b806370a0823114610693578063715018a6146106b35780638462151c146106c857610350565b80633ccfd60b116102a0578063564c2c591161023e5780636352211e116102185780636352211e146106345780636373a6b11461065457806367f8567d146106695780636c0360eb1461067e57610350565b8063564c2c59146105df5780635a3c7d26146105ff578063603f4d521461061f57610350565b806347a2e62a1161027a57806347a2e62a1461055d5780634f678dfc146105725780634f6ccce71461059f57806355f804b3146105bf57610350565b80633ccfd60b1461050857806342842e0e1461051d57806342bdb7601461053d57610350565b806318160ddd1161030d5780632f745c59116102e75780632f745c59146104935780632fbe04d1146104b3578063310495ab146104d357806333bffccc146104f357610350565b806318160ddd14610431578063202a32971461045357806323b872dd1461047357610350565b806301ffc9a71461035557806306fdde031461038b578063081812fc146103ad578063095ea7b3146103da5780630a912fc4146103fc5780630d3c69b414610411575b600080fd5b34801561036157600080fd5b506103756103703660046131a6565b61098f565b60405161038291906134d6565b60405180910390f35b34801561039757600080fd5b506103a06109b2565b604051610382919061350e565b3480156103b957600080fd5b506103cd6103c8366004613211565b610a48565b60405161038291906133b1565b3480156103e657600080fd5b506103fa6103f53660046130b2565b610a94565b005b34801561040857600080fd5b506103a0610b2c565b34801561041d57600080fd5b506103fa61042c366004613211565b610bba565b34801561043d57600080fd5b50610446610c64565b60405161038291906134e1565b34801561045f57600080fd5b506103fa61046e3660046130db565b610c75565b34801561047f57600080fd5b506103fa61048e366004612fc8565b610d4a565b34801561049f57600080fd5b506104466104ae3660046130b2565b610d82565b3480156104bf57600080fd5b506103fa6104ce36600461310e565b610dad565b3480156104df57600080fd5b506103a06104ee366004613211565b610e97565b3480156104ff57600080fd5b506103fa610eff565b34801561051457600080fd5b506103fa610f6e565b34801561052957600080fd5b506103fa610538366004612fc8565b610fdc565b34801561054957600080fd5b506103fa6105583660046131de565b610ff7565b34801561056957600080fd5b506103a0611084565b34801561057e57600080fd5b5061059261058d366004612f7c565b6110df565b6040516103829190613432565b3480156105ab57600080fd5b506104466105ba366004613211565b611253565b3480156105cb57600080fd5b506103fa6105da3660046131de565b611269565b3480156105eb57600080fd5b506104466105fa366004612f7c565b6112b4565b34801561060b57600080fd5b506103fa61061a3660046131de565b6112c6565b34801561062b57600080fd5b50610446611348565b34801561064057600080fd5b506103cd61064f366004613211565b61134e565b34801561066057600080fd5b506103a0611376565b34801561067557600080fd5b506104466113d1565b34801561068a57600080fd5b506103a06113d7565b34801561069f57600080fd5b506104466106ae366004612f7c565b611438565b3480156106bf57600080fd5b506103fa611481565b3480156106d457600080fd5b506106e86106e3366004612f7c565b61150a565b6040516103829190613492565b34801561070157600080fd5b506103cd6115ae565b34801561071657600080fd5b506103fa610725366004613185565b6115bd565b34801561073657600080fd5b506103a061160f565b34801561074b57600080fd5b50610446611670565b6103fa610762366004613211565b611676565b34801561077357600080fd5b506103fa61078236600461307c565b6117c0565b34801561079357600080fd5b506103fa61188e565b3480156107a857600080fd5b506103fa6107b7366004613003565b6118fd565b3480156107c857600080fd5b506103fa6107d73660046130db565b61193c565b3480156107e857600080fd5b506103a06119f1565b3480156107fd57600080fd5b50610446611a4c565b34801561081257600080fd5b506103a0610821366004613211565b611a51565b34801561083257600080fd5b506103fa6108413660046131de565b611b95565b34801561085257600080fd5b50610446611c17565b34801561086757600080fd5b50610446611c1d565b34801561087c57600080fd5b506103a061088b366004613211565b611c29565b34801561089c57600080fd5b506103a06108ab366004613211565b611cf0565b3480156108bc57600080fd5b506103756108cb366004612f96565b611d73565b3480156108dc57600080fd5b506104466108eb36600461326e565b611da1565b3480156108fc57600080fd5b506103fa611f30565b34801561091157600080fd5b506103fa610920366004612f7c565b611f9f565b34801561093157600080fd5b50610446612060565b34801561094657600080fd5b506103fa610955366004613229565b612066565b34801561096657600080fd5b506104466121c1565b34801561097b57600080fd5b506103fa61098a3660046131de565b6121c7565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a5382612249565b610a785760405162461bcd60e51b8152600401610a6f90613948565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a9f8261134e565b9050806001600160a01b0316836001600160a01b03161415610ad35760405162461bcd60e51b8152600401610a6f90613b59565b806001600160a01b0316610ae5612256565b6001600160a01b03161480610b015750610b01816108cb612256565b610b1d5760405162461bcd60e51b8152600401610a6f90613791565b610b27838361225a565b505050565b6010805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b820191906000526020600020905b815481529060010190602001808311610b9557829003601f168201915b505050505081565b610bc2612256565b6001600160a01b0316610bd36115ae565b6001600160a01b031614610bf95760405162461bcd60e51b8152600401610a6f90613994565b612710610c0e82610c08610c64565b906122c8565b1115610c2c5760405162461bcd60e51b8152600401610a6f906139f1565b60005b81811015610c60576000610c41610c64565b9050612710811015610c5757610c5733826122ed565b50600101610c2f565b5050565b6000610c706003612307565b905090565b610c7d612256565b6001600160a01b0316610c8e6115ae565b6001600160a01b031614610cb45760405162461bcd60e51b8152600401610a6f90613994565b6000805b8251811015610d3c57600e6000848381518110610cd157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054820191506000600e6000858481518110610d1057fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610cb8565b50600f805491909103905550565b610d5b610d55612256565b82612312565b610d775760405162461bcd60e51b8152600401610a6f90613bc4565b610b27838383612397565b6001600160a01b0382166000908152600260205260408120610da490836124a5565b90505b92915050565b610db5612256565b6001600160a01b0316610dc66115ae565b6001600160a01b031614610dec5760405162461bcd60e51b8152600401610a6f90613994565b6000610e028351836124b190919063ffffffff16565b9050612710610e1c82600f546122c890919063ffffffff16565b1115610e3a5760405162461bcd60e51b8152600401610a6f906139f1565b60005b8351811015610e895782600e6000868481518110610e5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002080549091019055600101610e3d565b50600f805490910190555050565b600d6020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b610f07612256565b6001600160a01b0316610f186115ae565b6001600160a01b031614610f3e5760405162461bcd60e51b8152600401610a6f90613994565b6001600c556040517faa7f66109fc44f83151144a97120f5d50861e58565b5fba86db13d2157273f3790600090a1565b610f76612256565b6001600160a01b0316610f876115ae565b6001600160a01b031614610fad5760405162461bcd60e51b8152600401610a6f90613994565b6040514790339082156108fc029083906000818181858888f19350505050158015610c60573d6000803e3d6000fd5b610b27838383604051806020016040528060008152506118fd565b610fff612256565b6001600160a01b03166110106115ae565b6001600160a01b0316146110365760405162461bcd60e51b8152600401610a6f90613994565b8051611049906016906020840190612dd0565b507f4ae2fb25e0ecc3759cb0e63fb179359f3e0646d4ddee9cb0c9915ef47964149d81604051611079919061350e565b60405180910390a150565b6015805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b606060006110ec83611438565b90508061112757604080516000808252602082019092529061111e565b60608152602001906001900390816111095790505b509150506109ad565b60008167ffffffffffffffff8111801561114057600080fd5b5060405190808252806020026020018201604052801561117457816020015b606081526020019060019003908161115f5790505b50905060005b8281101561124957600d60006111908784610d82565b815260208082019290925260409081016000208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156112255780601f106111fa57610100808354040283529160200191611225565b820191906000526020600020905b81548152906001019060200180831161120857829003601f168201915b505050505082828151811061123657fe5b602090810291909101015260010161117a565b5091506109ad9050565b6000806112616003846124eb565b509392505050565b611271612256565b6001600160a01b03166112826115ae565b6001600160a01b0316146112a85760405162461bcd60e51b8152600401610a6f90613994565b6112b181612507565b50565b600e6020526000908152604090205481565b6112ce612256565b6001600160a01b03166112df6115ae565b6001600160a01b0316146113055760405162461bcd60e51b8152600401610a6f90613994565b8051611318906010906020840190612dd0565b507f6d5337e4a0a058a426b169914a1f2e27fd85c05af27a72d8838a70ac1670dbe481604051611079919061350e565b600c5481565b6000610da782604051806060016040528060298152602001613d72602991396003919061251a565b6011805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b60125481565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b60006001600160a01b0382166114605760405162461bcd60e51b8152600401610a6f9061381a565b6001600160a01b0382166000908152600260205260409020610da790612307565b611489612256565b6001600160a01b031661149a6115ae565b6001600160a01b0316146114c05760405162461bcd60e51b8152600401610a6f90613994565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6060600061151783611438565b90508061153457604080516000808252602082019092529061111e565b60008167ffffffffffffffff8111801561154d57600080fd5b50604051908082528060200260200182016040528015611577578160200160208202803683370190505b50905060005b828110156112495761158f8582610d82565b82828151811061159b57fe5b602090810291909101015260010161157d565b600b546001600160a01b031690565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116055760405162461bcd60e51b8152600401610a6f90613b22565b610c608282612527565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b600f5481565b600081116116965760405162461bcd60e51b8152600401610a6f90613a65565b6000600c54116116b85760405162461bcd60e51b8152600401610a6f906139c9565b6127106116c782610c08610c64565b11156116e55760405162461bcd60e51b8152600401610a6f906139f1565b6116f767011c37937e080000826124b1565b3410156117165760405162461bcd60e51b8152600401610a6f906137ee565b600c546001141561176b57336000908152600e60205260409020548111156117505760405162461bcd60e51b8152600401610a6f90613c75565b336000908152600e602052604090208054829003905561178c565b600a81111561178c5760405162461bcd60e51b8152600401610a6f90613563565b60005b81811015610c605760006117a1610c64565b90506127108110156117b7576117b733826122ed565b5060010161178f565b6117c8612256565b6001600160a01b0316826001600160a01b031614156117f95760405162461bcd60e51b8152600401610a6f9061370e565b8060066000611806612256565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561184a612256565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188291906134d6565b60405180910390a35050565b611896612256565b6001600160a01b03166118a76115ae565b6001600160a01b0316146118cd5760405162461bcd60e51b8152600401610a6f90613994565b6002600c556040517f66dabe1eaf0e80a2a0d527275b6044a2c4dce05b26d4cd19aaaaacc623aa714c90600090a1565b61190e611908612256565b83612312565b61192a5760405162461bcd60e51b8152600401610a6f90613bc4565b6119368484848461255c565b50505050565b611944612256565b6001600160a01b03166119556115ae565b6001600160a01b03161461197b5760405162461bcd60e51b8152600401610a6f90613994565b61271061198b8251610c08610c64565b11156119a95760405162461bcd60e51b8152600401610a6f906139f1565b60005b8151811015610c605760006119bf610c64565b90506127108110156119e8576119e88383815181106119da57fe5b6020026020010151826122ed565b506001016119ac565b6016805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b600a81565b6060611a5c82612249565b611a785760405162461bcd60e51b8152600401610a6f90613a9c565b60008281526009602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611b0b5780601f10611ae057610100808354040283529160200191611b0b565b820191906000526020600020905b815481529060010190602001808311611aee57829003601f168201915b505050505090506000611b1c6113d7565b9050805160001415611b30575090506109ad565b815115611b62578082604051602001611b4a929190613382565b604051602081830303815290604052925050506109ad565b80611b6c8561258f565b604051602001611b7d929190613382565b60405160208183030381529060405292505050919050565b611b9d612256565b6001600160a01b0316611bae6115ae565b6001600160a01b031614611bd45760405162461bcd60e51b8152600401610a6f90613994565b8051611be7906015906020840190612dd0565b507f5c33824969e963659445bd0d91970306ad4b60a7c25be321ad4a4651f5285a1b81604051611079919061350e565b60145481565b67011c37937e08000081565b6060611c33610c64565b8210611c515760405162461bcd60e51b8152600401610a6f906136a0565b6000828152600d602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015611ce45780601f10611cb957610100808354040283529160200191611ce4565b820191906000526020600020905b815481529060010190602001808311611cc757829003601f168201915b50505050509050919050565b6060611cfa610c64565b8210611d185760405162461bcd60e51b8152600401610a6f906136a0565b6010805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ce45780601f10611cb957610100808354040283529160200191611ce4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000611dab612256565b6001600160a01b0316611dbc6115ae565b6001600160a01b031614611de25760405162461bcd60e51b8152600401610a6f90613994565b60125415611e025760405162461bcd60e51b8152600401610a6f90613864565b6018546040516370a0823160e01b81526001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016906370a0823190611e519030906004016133b1565b60206040518083038186803b158015611e6957600080fd5b505afa158015611e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea1919061316d565b1015611ebf5760405162461bcd60e51b8152600401610a6f90613b9a565b601384905560148390558151611edc906016906020850190612dd0565b507fa51f229eedbc9aa3f1974f8f535414b949044267b22d67cad38e09bcae990aef848484604051611f1093929190613cac565b60405180910390a1611f2660175460185461266a565b90505b9392505050565b611f38612256565b6001600160a01b0316611f496115ae565b6001600160a01b031614611f6f5760405162461bcd60e51b8152600401610a6f90613994565b6000600c8190556040517f4c013bd73202fde3c7cfe26ca486d0882f2c5b2fc9c761b15212f759bd2347dd9190a1565b611fa7612256565b6001600160a01b0316611fb86115ae565b6001600160a01b031614611fde5760405162461bcd60e51b8152600401610a6f90613994565b6001600160a01b0381166120045760405162461bcd60e51b8152600401610a6f906135ec565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61271081565b336120708361134e565b6001600160a01b0316146120965760405162461bcd60e51b8152600401610a6f90613aeb565b6000828152600d60205260409081902090516002916120b491613312565b602060405180830381855afa1580156120d1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906120f4919061316d565b60028260405161210491906132f6565b602060405180830381855afa158015612121573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612144919061316d565b14156121625760405162461bcd60e51b8152600401610a6f90613c4c565b6000828152600d60209081526040909120825161218192840190612dd0565b507f8ee52ca76ee5f3a802fa7f1ca9573eafe8571546623ccf3b2aaaae2f9eb619f83383836040516121b593929190613402565b60405180910390a15050565b60135481565b6121cf612256565b6001600160a01b03166121e06115ae565b6001600160a01b0316146122065760405162461bcd60e51b8152600401610a6f90613994565b8051612219906011906020840190612dd0565b507f7d8e7c278677e200882d514f752879d020e3ee563eb109afea717fe01b5b640081604051611079919061350e565b6000610da76003836127a8565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061228f8261134e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082820183811015610da45760405162461bcd60e51b8152600401610a6f90613669565b610c608282604051806020016040528060008152506127b4565b6000610da7826127e7565b600061231d82612249565b6123395760405162461bcd60e51b8152600401610a6f90613745565b60006123448361134e565b9050806001600160a01b0316846001600160a01b0316148061237f5750836001600160a01b031661237484610a48565b6001600160a01b0316145b8061238f575061238f8185611d73565b949350505050565b826001600160a01b03166123aa8261134e565b6001600160a01b0316146123d05760405162461bcd60e51b8152600401610a6f90613a1c565b6001600160a01b0382166123f65760405162461bcd60e51b8152600401610a6f906136ca565b612401838383610b27565b61240c60008261225a565b6001600160a01b038316600090815260026020526040902061242e90826127eb565b506001600160a01b038216600090815260026020526040902061245190826127f7565b5061245e60038284612803565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610da48383612819565b6000826124c057506000610da7565b828202828482816124cd57fe5b0414610da45760405162461bcd60e51b8152600401610a6f90613907565b60008080806124fa868661285e565b9097909650945050505050565b8051610c6090600a906020840190612dd0565b6000611f268484846128ba565b60128190556040517ff84cb0c48433e4edd710ec64be090fe45b65e233484d4f60fbad4e93255cb7ef906121b59083906134e1565b612567848484612397565b61257384848484612919565b6119365760405162461bcd60e51b8152600401610a6f9061359a565b6060816125b457506040805180820190915260018152600360fc1b60208201526109ad565b8160005b81156125cc57600101600a820491506125b8565b60008167ffffffffffffffff811180156125e557600080fd5b506040519080825280601f01601f191660200182016040528015612610576020820181803683370190505b50859350905060001982015b831561266157600a840660300160f81b8282806001900393508151811061263f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061261c565b50949350505050565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316634000aea07f0000000000000000000000000000000000000000000000000000000000000000848660006040516020016126d19291906132e8565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016126fe93929190613402565b602060405180830381600087803b15801561271857600080fd5b505af115801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613151565b50600061277284600030600080898152602001908152602001600020546129f8565b60008581526020819052604090205490915061278f9060016122c8565b60008581526020819052604090205561238f8482612a32565b6000610da48383612a65565b6127be8383612a7d565b6127cb6000848484612919565b610b275760405162461bcd60e51b8152600401610a6f9061359a565b5490565b6000610da48383612b41565b6000610da48383612c07565b6000611f2684846001600160a01b038516612c51565b8154600090821061283c5760405162461bcd60e51b8152600401610a6f90613521565b82600001828154811061284b57fe5b9060005260206000200154905092915050565b8154600090819083106128835760405162461bcd60e51b8152600401610a6f90613890565b600084600001848154811061289457fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816128ea5760405162461bcd60e51b8152600401610a6f919061350e565b508460000160018203815481106128fd57fe5b9060005260206000209060020201600101549150509392505050565b600061292d846001600160a01b0316612ce8565b6129395750600161238f565b60006129c1630a85bd0160e11b61294e612256565b88878760405160240161296494939291906133c5565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613d40603291396001600160a01b0388169190612cee565b90506000818060200190518101906129d991906131c2565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b600084848484604051602001612a1194939291906134ea565b60408051601f19818403018152919052805160209091012095945050505050565b60008282604051602001612a479291906132e8565b60405160208183030381529060405280519060200120905092915050565b60009081526001919091016020526040902054151590565b6001600160a01b038216612aa35760405162461bcd60e51b8152600401610a6f906138d2565b612aac81612249565b15612ac95760405162461bcd60e51b8152600401610a6f90613632565b612ad560008383610b27565b6001600160a01b0382166000908152600260205260409020612af790826127f7565b50612b0460038284612803565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015612bfd5783546000198083019190810190600090879083908110612b7457fe5b9060005260206000200154905080876000018481548110612b9157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612bc157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610da7565b6000915050610da7565b6000612c138383612a65565b612c4957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610da7565b506000610da7565b600082815260018401602052604081205480612cb6575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611f29565b82856000016001830381548110612cc957fe5b9060005260206000209060020201600101819055506000915050611f29565b3b151590565b6060611f26848460008585612d0285612ce8565b612d1e5760405162461bcd60e51b8152600401610a6f90613c15565b600080866001600160a01b03168587604051612d3a91906132f6565b60006040518083038185875af1925050503d8060008114612d77576040519150601f19603f3d011682016040523d82523d6000602084013e612d7c565b606091505b5091509150612d8c828286612d97565b979650505050505050565b60608315612da6575081611f29565b825115612db65782518084602001fd5b8160405162461bcd60e51b8152600401610a6f919061350e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612e065760008555612e4c565b82601f10612e1f57805160ff1916838001178555612e4c565b82800160010185558215612e4c579182015b82811115612e4c578251825591602001919060010190612e31565b50612e58929150612e5c565b5090565b5b80821115612e585760008155600101612e5d565b600067ffffffffffffffff831115612e8557fe5b612e98601f8401601f1916602001613ccb565b9050828152838383011115612eac57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146109ad57600080fd5b600082601f830112612eea578081fd5b8135602067ffffffffffffffff821115612f0057fe5b808202612f0e828201613ccb565b838152828101908684018388018501891015612f28578687fd5b8693505b85841015612f5157612f3d81612ec3565b835260019390930192918401918401612f2c565b50979650505050505050565b600082601f830112612f6d578081fd5b610da483833560208501612e71565b600060208284031215612f8d578081fd5b610da482612ec3565b60008060408385031215612fa8578081fd5b612fb183612ec3565b9150612fbf60208401612ec3565b90509250929050565b600080600060608486031215612fdc578081fd5b612fe584612ec3565b9250612ff360208501612ec3565b9150604084013590509250925092565b60008060008060808587031215613018578081fd5b61302185612ec3565b935061302f60208601612ec3565b925060408501359150606085013567ffffffffffffffff811115613051578182fd5b8501601f81018713613061578182fd5b61307087823560208401612e71565b91505092959194509250565b6000806040838503121561308e578182fd5b61309783612ec3565b915060208301356130a781613d1b565b809150509250929050565b600080604083850312156130c4578182fd5b6130cd83612ec3565b946020939093013593505050565b6000602082840312156130ec578081fd5b813567ffffffffffffffff811115613102578182fd5b61238f84828501612eda565b60008060408385031215613120578182fd5b823567ffffffffffffffff811115613136578283fd5b61314285828601612eda565b95602094909401359450505050565b600060208284031215613162578081fd5b8151610da481613d1b565b60006020828403121561317e578081fd5b5051919050565b60008060408385031215613197578182fd5b50508035926020909101359150565b6000602082840312156131b7578081fd5b8135610da481613d29565b6000602082840312156131d3578081fd5b8151610da481613d29565b6000602082840312156131ef578081fd5b813567ffffffffffffffff811115613205578182fd5b61238f84828501612f5d565b600060208284031215613222578081fd5b5035919050565b6000806040838503121561323b578182fd5b82359150602083013567ffffffffffffffff811115613258578182fd5b61326485828601612f5d565b9150509250929050565b600080600060608486031215613282578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156132a6578182fd5b6132b286828701612f5d565b9150509250925092565b600081518084526132d4816020860160208601613cef565b601f01601f19169290920160200192915050565b918252602082015260400190565b60008251613308818460208701613cef565b9190910192915050565b6000808354600180821660008114613331576001811461334857613377565b60ff198316865260028304607f1686019350613377565b600283048786526020808720875b8381101561336f5781548a820152908501908201613356565b505050860193505b509195945050505050565b60008351613394818460208801613cef565b8351908301906133a8818360208801613cef565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133f8908301846132bc565b9695505050505050565b600060018060a01b03851682528360208301526060604083015261342960608301846132bc565b95945050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561348557603f198886030184526134738583516132bc565b94509285019290850190600101613457565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134ca578351835292840192918401916001016134ae565b50909695505050505050565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b600060208252610da460208301846132bc565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526019908201527f546f6b656e7320706572206d696e742065786365656465642e00000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f2a37b5b2b7103737ba103337bab7321760811b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601290820152712bb937b7339022ba3432b9103b30b63ab29760711b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b602080825260129082015271416c72656164792067656e6572617465642160701b604082015260600190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600e908201526d29b0b632903737ba1037b832b71760911b604082015260600190565b6020808252601190820152702737ba1032b737bab3b41039b637ba399760791b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601c908201527f4d696e696d756d206e756d62657220746f206d696e7420697320312e00000000604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f596f7520646f206e6f74206f776e207468697320746f6b656e2e000000000000604082015260600190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2737ba1032b737bab3b4102624a7259760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e2730b6b2903ab731b430b733b2b21760891b604082015260600190565b60208082526019908201527f4e6f7420656e6f7567682070726573616c6520736c6f74732e00000000000000604082015260600190565b60008482528360208301526060604083015261342960608301846132bc565b60405181810167ffffffffffffffff81118282101715613ce757fe5b604052919050565b60005b83811015613d0a578181015183820152602001613cf2565b838111156119365750506000910152565b80151581146112b157600080fd5b6001600160e01b0319811681146112b157600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d930a904147616aec2f027ffbbf188969396190edb5aa6ea9058bd23440c583b64736f6c6343000706003368747470733a2f2f736f726173647265616d776f726c642e696f2f746f6b656e732f
Deployed Bytecode
0x6080604052600436106103505760003560e01c806370a08231116101c6578063c87b56dd116100f7578063ecb7ffd411610095578063f47c84c51161006f578063f47c84c514610925578063f84b40dc1461093a578063fd0ae1cc1461095a578063ffe630b51461096f57610350565b8063ecb7ffd4146108d0578063ee55efee146108f0578063f2fde38b1461090557610350565b8063d2d8cb67116100d1578063d2d8cb671461085b578063d84fedd314610870578063d9b137b214610890578063e985e9c5146108b057610350565b8063c87b56dd14610806578063cf2d0e0f14610826578063cf4022081461084657610350565b8063a0712d6811610164578063b88d4fde1161013e578063b88d4fde1461079c578063b98877e2146107bc578063c2e760d2146107dc578063c5da5cbe146107f157610350565b8063a0712d6814610754578063a22cb46514610767578063b585209b1461078757610350565b80638da5cb5b116101a05780638da5cb5b146106f557806394985ddd1461070a57806395d89b411461072a5780639a7a29dd1461073f57610350565b806370a0823114610693578063715018a6146106b35780638462151c146106c857610350565b80633ccfd60b116102a0578063564c2c591161023e5780636352211e116102185780636352211e146106345780636373a6b11461065457806367f8567d146106695780636c0360eb1461067e57610350565b8063564c2c59146105df5780635a3c7d26146105ff578063603f4d521461061f57610350565b806347a2e62a1161027a57806347a2e62a1461055d5780634f678dfc146105725780634f6ccce71461059f57806355f804b3146105bf57610350565b80633ccfd60b1461050857806342842e0e1461051d57806342bdb7601461053d57610350565b806318160ddd1161030d5780632f745c59116102e75780632f745c59146104935780632fbe04d1146104b3578063310495ab146104d357806333bffccc146104f357610350565b806318160ddd14610431578063202a32971461045357806323b872dd1461047357610350565b806301ffc9a71461035557806306fdde031461038b578063081812fc146103ad578063095ea7b3146103da5780630a912fc4146103fc5780630d3c69b414610411575b600080fd5b34801561036157600080fd5b506103756103703660046131a6565b61098f565b60405161038291906134d6565b60405180910390f35b34801561039757600080fd5b506103a06109b2565b604051610382919061350e565b3480156103b957600080fd5b506103cd6103c8366004613211565b610a48565b60405161038291906133b1565b3480156103e657600080fd5b506103fa6103f53660046130b2565b610a94565b005b34801561040857600080fd5b506103a0610b2c565b34801561041d57600080fd5b506103fa61042c366004613211565b610bba565b34801561043d57600080fd5b50610446610c64565b60405161038291906134e1565b34801561045f57600080fd5b506103fa61046e3660046130db565b610c75565b34801561047f57600080fd5b506103fa61048e366004612fc8565b610d4a565b34801561049f57600080fd5b506104466104ae3660046130b2565b610d82565b3480156104bf57600080fd5b506103fa6104ce36600461310e565b610dad565b3480156104df57600080fd5b506103a06104ee366004613211565b610e97565b3480156104ff57600080fd5b506103fa610eff565b34801561051457600080fd5b506103fa610f6e565b34801561052957600080fd5b506103fa610538366004612fc8565b610fdc565b34801561054957600080fd5b506103fa6105583660046131de565b610ff7565b34801561056957600080fd5b506103a0611084565b34801561057e57600080fd5b5061059261058d366004612f7c565b6110df565b6040516103829190613432565b3480156105ab57600080fd5b506104466105ba366004613211565b611253565b3480156105cb57600080fd5b506103fa6105da3660046131de565b611269565b3480156105eb57600080fd5b506104466105fa366004612f7c565b6112b4565b34801561060b57600080fd5b506103fa61061a3660046131de565b6112c6565b34801561062b57600080fd5b50610446611348565b34801561064057600080fd5b506103cd61064f366004613211565b61134e565b34801561066057600080fd5b506103a0611376565b34801561067557600080fd5b506104466113d1565b34801561068a57600080fd5b506103a06113d7565b34801561069f57600080fd5b506104466106ae366004612f7c565b611438565b3480156106bf57600080fd5b506103fa611481565b3480156106d457600080fd5b506106e86106e3366004612f7c565b61150a565b6040516103829190613492565b34801561070157600080fd5b506103cd6115ae565b34801561071657600080fd5b506103fa610725366004613185565b6115bd565b34801561073657600080fd5b506103a061160f565b34801561074b57600080fd5b50610446611670565b6103fa610762366004613211565b611676565b34801561077357600080fd5b506103fa61078236600461307c565b6117c0565b34801561079357600080fd5b506103fa61188e565b3480156107a857600080fd5b506103fa6107b7366004613003565b6118fd565b3480156107c857600080fd5b506103fa6107d73660046130db565b61193c565b3480156107e857600080fd5b506103a06119f1565b3480156107fd57600080fd5b50610446611a4c565b34801561081257600080fd5b506103a0610821366004613211565b611a51565b34801561083257600080fd5b506103fa6108413660046131de565b611b95565b34801561085257600080fd5b50610446611c17565b34801561086757600080fd5b50610446611c1d565b34801561087c57600080fd5b506103a061088b366004613211565b611c29565b34801561089c57600080fd5b506103a06108ab366004613211565b611cf0565b3480156108bc57600080fd5b506103756108cb366004612f96565b611d73565b3480156108dc57600080fd5b506104466108eb36600461326e565b611da1565b3480156108fc57600080fd5b506103fa611f30565b34801561091157600080fd5b506103fa610920366004612f7c565b611f9f565b34801561093157600080fd5b50610446612060565b34801561094657600080fd5b506103fa610955366004613229565b612066565b34801561096657600080fd5b506104466121c1565b34801561097b57600080fd5b506103fa61098a3660046131de565b6121c7565b6001600160e01b0319811660009081526001602052604090205460ff165b919050565b60078054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b820191906000526020600020905b815481529060010190602001808311610a2157829003601f168201915b5050505050905090565b6000610a5382612249565b610a785760405162461bcd60e51b8152600401610a6f90613948565b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610a9f8261134e565b9050806001600160a01b0316836001600160a01b03161415610ad35760405162461bcd60e51b8152600401610a6f90613b59565b806001600160a01b0316610ae5612256565b6001600160a01b03161480610b015750610b01816108cb612256565b610b1d5760405162461bcd60e51b8152600401610a6f90613791565b610b27838361225a565b505050565b6010805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b820191906000526020600020905b815481529060010190602001808311610b9557829003601f168201915b505050505081565b610bc2612256565b6001600160a01b0316610bd36115ae565b6001600160a01b031614610bf95760405162461bcd60e51b8152600401610a6f90613994565b612710610c0e82610c08610c64565b906122c8565b1115610c2c5760405162461bcd60e51b8152600401610a6f906139f1565b60005b81811015610c60576000610c41610c64565b9050612710811015610c5757610c5733826122ed565b50600101610c2f565b5050565b6000610c706003612307565b905090565b610c7d612256565b6001600160a01b0316610c8e6115ae565b6001600160a01b031614610cb45760405162461bcd60e51b8152600401610a6f90613994565b6000805b8251811015610d3c57600e6000848381518110610cd157fe5b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002054820191506000600e6000858481518110610d1057fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002055600101610cb8565b50600f805491909103905550565b610d5b610d55612256565b82612312565b610d775760405162461bcd60e51b8152600401610a6f90613bc4565b610b27838383612397565b6001600160a01b0382166000908152600260205260408120610da490836124a5565b90505b92915050565b610db5612256565b6001600160a01b0316610dc66115ae565b6001600160a01b031614610dec5760405162461bcd60e51b8152600401610a6f90613994565b6000610e028351836124b190919063ffffffff16565b9050612710610e1c82600f546122c890919063ffffffff16565b1115610e3a5760405162461bcd60e51b8152600401610a6f906139f1565b60005b8351811015610e895782600e6000868481518110610e5757fe5b6020908102919091018101516001600160a01b0316825281019190915260400160002080549091019055600101610e3d565b50600f805490910190555050565b600d6020908152600091825260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b610f07612256565b6001600160a01b0316610f186115ae565b6001600160a01b031614610f3e5760405162461bcd60e51b8152600401610a6f90613994565b6001600c556040517faa7f66109fc44f83151144a97120f5d50861e58565b5fba86db13d2157273f3790600090a1565b610f76612256565b6001600160a01b0316610f876115ae565b6001600160a01b031614610fad5760405162461bcd60e51b8152600401610a6f90613994565b6040514790339082156108fc029083906000818181858888f19350505050158015610c60573d6000803e3d6000fd5b610b27838383604051806020016040528060008152506118fd565b610fff612256565b6001600160a01b03166110106115ae565b6001600160a01b0316146110365760405162461bcd60e51b8152600401610a6f90613994565b8051611049906016906020840190612dd0565b507f4ae2fb25e0ecc3759cb0e63fb179359f3e0646d4ddee9cb0c9915ef47964149d81604051611079919061350e565b60405180910390a150565b6015805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b606060006110ec83611438565b90508061112757604080516000808252602082019092529061111e565b60608152602001906001900390816111095790505b509150506109ad565b60008167ffffffffffffffff8111801561114057600080fd5b5060405190808252806020026020018201604052801561117457816020015b606081526020019060019003908161115f5790505b50905060005b8281101561124957600d60006111908784610d82565b815260208082019290925260409081016000208054825160026001831615610100026000190190921691909104601f8101859004850282018501909352828152929091908301828280156112255780601f106111fa57610100808354040283529160200191611225565b820191906000526020600020905b81548152906001019060200180831161120857829003601f168201915b505050505082828151811061123657fe5b602090810291909101015260010161117a565b5091506109ad9050565b6000806112616003846124eb565b509392505050565b611271612256565b6001600160a01b03166112826115ae565b6001600160a01b0316146112a85760405162461bcd60e51b8152600401610a6f90613994565b6112b181612507565b50565b600e6020526000908152604090205481565b6112ce612256565b6001600160a01b03166112df6115ae565b6001600160a01b0316146113055760405162461bcd60e51b8152600401610a6f90613994565b8051611318906010906020840190612dd0565b507f6d5337e4a0a058a426b169914a1f2e27fd85c05af27a72d8838a70ac1670dbe481604051611079919061350e565b600c5481565b6000610da782604051806060016040528060298152602001613d72602991396003919061251a565b6011805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b60125481565b600a8054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b60006001600160a01b0382166114605760405162461bcd60e51b8152600401610a6f9061381a565b6001600160a01b0382166000908152600260205260409020610da790612307565b611489612256565b6001600160a01b031661149a6115ae565b6001600160a01b0316146114c05760405162461bcd60e51b8152600401610a6f90613994565b600b546040516000916001600160a01b0316907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600b80546001600160a01b0319169055565b6060600061151783611438565b90508061153457604080516000808252602082019092529061111e565b60008167ffffffffffffffff8111801561154d57600080fd5b50604051908082528060200260200182016040528015611577578160200160208202803683370190505b50905060005b828110156112495761158f8582610d82565b82828151811061159b57fe5b602090810291909101015260010161157d565b600b546001600160a01b031690565b336001600160a01b037f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb795216146116055760405162461bcd60e51b8152600401610a6f90613b22565b610c608282612527565b60088054604080516020601f6002600019610100600188161502019095169490940493840181900481028201810190925282815260609390929091830182828015610a3e5780601f10610a1357610100808354040283529160200191610a3e565b600f5481565b600081116116965760405162461bcd60e51b8152600401610a6f90613a65565b6000600c54116116b85760405162461bcd60e51b8152600401610a6f906139c9565b6127106116c782610c08610c64565b11156116e55760405162461bcd60e51b8152600401610a6f906139f1565b6116f767011c37937e080000826124b1565b3410156117165760405162461bcd60e51b8152600401610a6f906137ee565b600c546001141561176b57336000908152600e60205260409020548111156117505760405162461bcd60e51b8152600401610a6f90613c75565b336000908152600e602052604090208054829003905561178c565b600a81111561178c5760405162461bcd60e51b8152600401610a6f90613563565b60005b81811015610c605760006117a1610c64565b90506127108110156117b7576117b733826122ed565b5060010161178f565b6117c8612256565b6001600160a01b0316826001600160a01b031614156117f95760405162461bcd60e51b8152600401610a6f9061370e565b8060066000611806612256565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561184a612256565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161188291906134d6565b60405180910390a35050565b611896612256565b6001600160a01b03166118a76115ae565b6001600160a01b0316146118cd5760405162461bcd60e51b8152600401610a6f90613994565b6002600c556040517f66dabe1eaf0e80a2a0d527275b6044a2c4dce05b26d4cd19aaaaacc623aa714c90600090a1565b61190e611908612256565b83612312565b61192a5760405162461bcd60e51b8152600401610a6f90613bc4565b6119368484848461255c565b50505050565b611944612256565b6001600160a01b03166119556115ae565b6001600160a01b03161461197b5760405162461bcd60e51b8152600401610a6f90613994565b61271061198b8251610c08610c64565b11156119a95760405162461bcd60e51b8152600401610a6f906139f1565b60005b8151811015610c605760006119bf610c64565b90506127108110156119e8576119e88383815181106119da57fe5b6020026020010151826122ed565b506001016119ac565b6016805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015610bb25780601f10610b8757610100808354040283529160200191610bb2565b600a81565b6060611a5c82612249565b611a785760405162461bcd60e51b8152600401610a6f90613a9c565b60008281526009602090815260408083208054825160026001831615610100026000190190921691909104601f810185900485028201850190935282815292909190830182828015611b0b5780601f10611ae057610100808354040283529160200191611b0b565b820191906000526020600020905b815481529060010190602001808311611aee57829003601f168201915b505050505090506000611b1c6113d7565b9050805160001415611b30575090506109ad565b815115611b62578082604051602001611b4a929190613382565b604051602081830303815290604052925050506109ad565b80611b6c8561258f565b604051602001611b7d929190613382565b60405160208183030381529060405292505050919050565b611b9d612256565b6001600160a01b0316611bae6115ae565b6001600160a01b031614611bd45760405162461bcd60e51b8152600401610a6f90613994565b8051611be7906015906020840190612dd0565b507f5c33824969e963659445bd0d91970306ad4b60a7c25be321ad4a4651f5285a1b81604051611079919061350e565b60145481565b67011c37937e08000081565b6060611c33610c64565b8210611c515760405162461bcd60e51b8152600401610a6f906136a0565b6000828152600d602090815260409182902080548351601f600260001961010060018616150201909316929092049182018490048402810184019094528084529091830182828015611ce45780601f10611cb957610100808354040283529160200191611ce4565b820191906000526020600020905b815481529060010190602001808311611cc757829003601f168201915b50505050509050919050565b6060611cfa610c64565b8210611d185760405162461bcd60e51b8152600401610a6f906136a0565b6010805460408051602060026001851615610100026000190190941693909304601f81018490048402820184019092528181529291830182828015611ce45780601f10611cb957610100808354040283529160200191611ce4565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b6000611dab612256565b6001600160a01b0316611dbc6115ae565b6001600160a01b031614611de25760405162461bcd60e51b8152600401610a6f90613994565b60125415611e025760405162461bcd60e51b8152600401610a6f90613864565b6018546040516370a0823160e01b81526001600160a01b037f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca16906370a0823190611e519030906004016133b1565b60206040518083038186803b158015611e6957600080fd5b505afa158015611e7d573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611ea1919061316d565b1015611ebf5760405162461bcd60e51b8152600401610a6f90613b9a565b601384905560148390558151611edc906016906020850190612dd0565b507fa51f229eedbc9aa3f1974f8f535414b949044267b22d67cad38e09bcae990aef848484604051611f1093929190613cac565b60405180910390a1611f2660175460185461266a565b90505b9392505050565b611f38612256565b6001600160a01b0316611f496115ae565b6001600160a01b031614611f6f5760405162461bcd60e51b8152600401610a6f90613994565b6000600c8190556040517f4c013bd73202fde3c7cfe26ca486d0882f2c5b2fc9c761b15212f759bd2347dd9190a1565b611fa7612256565b6001600160a01b0316611fb86115ae565b6001600160a01b031614611fde5760405162461bcd60e51b8152600401610a6f90613994565b6001600160a01b0381166120045760405162461bcd60e51b8152600401610a6f906135ec565b600b546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600b80546001600160a01b0319166001600160a01b0392909216919091179055565b61271081565b336120708361134e565b6001600160a01b0316146120965760405162461bcd60e51b8152600401610a6f90613aeb565b6000828152600d60205260409081902090516002916120b491613312565b602060405180830381855afa1580156120d1573d6000803e3d6000fd5b5050506040513d601f19601f820116820180604052508101906120f4919061316d565b60028260405161210491906132f6565b602060405180830381855afa158015612121573d6000803e3d6000fd5b5050506040513d601f19601f82011682018060405250810190612144919061316d565b14156121625760405162461bcd60e51b8152600401610a6f90613c4c565b6000828152600d60209081526040909120825161218192840190612dd0565b507f8ee52ca76ee5f3a802fa7f1ca9573eafe8571546623ccf3b2aaaae2f9eb619f83383836040516121b593929190613402565b60405180910390a15050565b60135481565b6121cf612256565b6001600160a01b03166121e06115ae565b6001600160a01b0316146122065760405162461bcd60e51b8152600401610a6f90613994565b8051612219906011906020840190612dd0565b507f7d8e7c278677e200882d514f752879d020e3ee563eb109afea717fe01b5b640081604051611079919061350e565b6000610da76003836127a8565b3390565b600081815260056020526040902080546001600160a01b0319166001600160a01b038416908117909155819061228f8261134e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600082820183811015610da45760405162461bcd60e51b8152600401610a6f90613669565b610c608282604051806020016040528060008152506127b4565b6000610da7826127e7565b600061231d82612249565b6123395760405162461bcd60e51b8152600401610a6f90613745565b60006123448361134e565b9050806001600160a01b0316846001600160a01b0316148061237f5750836001600160a01b031661237484610a48565b6001600160a01b0316145b8061238f575061238f8185611d73565b949350505050565b826001600160a01b03166123aa8261134e565b6001600160a01b0316146123d05760405162461bcd60e51b8152600401610a6f90613a1c565b6001600160a01b0382166123f65760405162461bcd60e51b8152600401610a6f906136ca565b612401838383610b27565b61240c60008261225a565b6001600160a01b038316600090815260026020526040902061242e90826127eb565b506001600160a01b038216600090815260026020526040902061245190826127f7565b5061245e60038284612803565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610da48383612819565b6000826124c057506000610da7565b828202828482816124cd57fe5b0414610da45760405162461bcd60e51b8152600401610a6f90613907565b60008080806124fa868661285e565b9097909650945050505050565b8051610c6090600a906020840190612dd0565b6000611f268484846128ba565b60128190556040517ff84cb0c48433e4edd710ec64be090fe45b65e233484d4f60fbad4e93255cb7ef906121b59083906134e1565b612567848484612397565b61257384848484612919565b6119365760405162461bcd60e51b8152600401610a6f9061359a565b6060816125b457506040805180820190915260018152600360fc1b60208201526109ad565b8160005b81156125cc57600101600a820491506125b8565b60008167ffffffffffffffff811180156125e557600080fd5b506040519080825280601f01601f191660200182016040528015612610576020820181803683370190505b50859350905060001982015b831561266157600a840660300160f81b8282806001900393508151811061263f57fe5b60200101906001600160f81b031916908160001a905350600a8404935061261c565b50949350505050565b60007f000000000000000000000000514910771af9ca656af840dff83e8264ecf986ca6001600160a01b0316634000aea07f000000000000000000000000f0d54349addcf704f77ae15b96510dea15cb7952848660006040516020016126d19291906132e8565b6040516020818303038152906040526040518463ffffffff1660e01b81526004016126fe93929190613402565b602060405180830381600087803b15801561271857600080fd5b505af115801561272c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906127509190613151565b50600061277284600030600080898152602001908152602001600020546129f8565b60008581526020819052604090205490915061278f9060016122c8565b60008581526020819052604090205561238f8482612a32565b6000610da48383612a65565b6127be8383612a7d565b6127cb6000848484612919565b610b275760405162461bcd60e51b8152600401610a6f9061359a565b5490565b6000610da48383612b41565b6000610da48383612c07565b6000611f2684846001600160a01b038516612c51565b8154600090821061283c5760405162461bcd60e51b8152600401610a6f90613521565b82600001828154811061284b57fe5b9060005260206000200154905092915050565b8154600090819083106128835760405162461bcd60e51b8152600401610a6f90613890565b600084600001848154811061289457fe5b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816128ea5760405162461bcd60e51b8152600401610a6f919061350e565b508460000160018203815481106128fd57fe5b9060005260206000209060020201600101549150509392505050565b600061292d846001600160a01b0316612ce8565b6129395750600161238f565b60006129c1630a85bd0160e11b61294e612256565b88878760405160240161296494939291906133c5565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001613d40603291396001600160a01b0388169190612cee565b90506000818060200190518101906129d991906131c2565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b600084848484604051602001612a1194939291906134ea565b60408051601f19818403018152919052805160209091012095945050505050565b60008282604051602001612a479291906132e8565b60405160208183030381529060405280519060200120905092915050565b60009081526001919091016020526040902054151590565b6001600160a01b038216612aa35760405162461bcd60e51b8152600401610a6f906138d2565b612aac81612249565b15612ac95760405162461bcd60e51b8152600401610a6f90613632565b612ad560008383610b27565b6001600160a01b0382166000908152600260205260409020612af790826127f7565b50612b0460038284612803565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60008181526001830160205260408120548015612bfd5783546000198083019190810190600090879083908110612b7457fe5b9060005260206000200154905080876000018481548110612b9157fe5b600091825260208083209091019290925582815260018981019092526040902090840190558654879080612bc157fe5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610da7565b6000915050610da7565b6000612c138383612a65565b612c4957508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610da7565b506000610da7565b600082815260018401602052604081205480612cb6575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611f29565b82856000016001830381548110612cc957fe5b9060005260206000209060020201600101819055506000915050611f29565b3b151590565b6060611f26848460008585612d0285612ce8565b612d1e5760405162461bcd60e51b8152600401610a6f90613c15565b600080866001600160a01b03168587604051612d3a91906132f6565b60006040518083038185875af1925050503d8060008114612d77576040519150601f19603f3d011682016040523d82523d6000602084013e612d7c565b606091505b5091509150612d8c828286612d97565b979650505050505050565b60608315612da6575081611f29565b825115612db65782518084602001fd5b8160405162461bcd60e51b8152600401610a6f919061350e565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282612e065760008555612e4c565b82601f10612e1f57805160ff1916838001178555612e4c565b82800160010185558215612e4c579182015b82811115612e4c578251825591602001919060010190612e31565b50612e58929150612e5c565b5090565b5b80821115612e585760008155600101612e5d565b600067ffffffffffffffff831115612e8557fe5b612e98601f8401601f1916602001613ccb565b9050828152838383011115612eac57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b03811681146109ad57600080fd5b600082601f830112612eea578081fd5b8135602067ffffffffffffffff821115612f0057fe5b808202612f0e828201613ccb565b838152828101908684018388018501891015612f28578687fd5b8693505b85841015612f5157612f3d81612ec3565b835260019390930192918401918401612f2c565b50979650505050505050565b600082601f830112612f6d578081fd5b610da483833560208501612e71565b600060208284031215612f8d578081fd5b610da482612ec3565b60008060408385031215612fa8578081fd5b612fb183612ec3565b9150612fbf60208401612ec3565b90509250929050565b600080600060608486031215612fdc578081fd5b612fe584612ec3565b9250612ff360208501612ec3565b9150604084013590509250925092565b60008060008060808587031215613018578081fd5b61302185612ec3565b935061302f60208601612ec3565b925060408501359150606085013567ffffffffffffffff811115613051578182fd5b8501601f81018713613061578182fd5b61307087823560208401612e71565b91505092959194509250565b6000806040838503121561308e578182fd5b61309783612ec3565b915060208301356130a781613d1b565b809150509250929050565b600080604083850312156130c4578182fd5b6130cd83612ec3565b946020939093013593505050565b6000602082840312156130ec578081fd5b813567ffffffffffffffff811115613102578182fd5b61238f84828501612eda565b60008060408385031215613120578182fd5b823567ffffffffffffffff811115613136578283fd5b61314285828601612eda565b95602094909401359450505050565b600060208284031215613162578081fd5b8151610da481613d1b565b60006020828403121561317e578081fd5b5051919050565b60008060408385031215613197578182fd5b50508035926020909101359150565b6000602082840312156131b7578081fd5b8135610da481613d29565b6000602082840312156131d3578081fd5b8151610da481613d29565b6000602082840312156131ef578081fd5b813567ffffffffffffffff811115613205578182fd5b61238f84828501612f5d565b600060208284031215613222578081fd5b5035919050565b6000806040838503121561323b578182fd5b82359150602083013567ffffffffffffffff811115613258578182fd5b61326485828601612f5d565b9150509250929050565b600080600060608486031215613282578081fd5b8335925060208401359150604084013567ffffffffffffffff8111156132a6578182fd5b6132b286828701612f5d565b9150509250925092565b600081518084526132d4816020860160208601613cef565b601f01601f19169290920160200192915050565b918252602082015260400190565b60008251613308818460208701613cef565b9190910192915050565b6000808354600180821660008114613331576001811461334857613377565b60ff198316865260028304607f1686019350613377565b600283048786526020808720875b8381101561336f5781548a820152908501908201613356565b505050860193505b509195945050505050565b60008351613394818460208801613cef565b8351908301906133a8818360208801613cef565b01949350505050565b6001600160a01b0391909116815260200190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906133f8908301846132bc565b9695505050505050565b600060018060a01b03851682528360208301526060604083015261342960608301846132bc565b95945050505050565b6000602080830181845280855180835260408601915060408482028701019250838701855b8281101561348557603f198886030184526134738583516132bc565b94509285019290850190600101613457565b5092979650505050505050565b6020808252825182820181905260009190848201906040850190845b818110156134ca578351835292840192918401916001016134ae565b50909695505050505050565b901515815260200190565b90815260200190565b93845260208401929092526001600160a01b03166040830152606082015260800190565b600060208252610da460208301846132bc565b60208082526022908201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b60208082526019908201527f546f6b656e7320706572206d696e742065786365656465642e00000000000000604082015260600190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201526564647265737360d01b606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b6020808252601b908201527f536166654d6174683a206164646974696f6e206f766572666c6f770000000000604082015260600190565b60208082526010908201526f2a37b5b2b7103737ba103337bab7321760811b604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252601290820152712bb937b7339022ba3432b9103b30b63ab29760711b604082015260600190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604082015269726f206164647265737360b01b606082015260800190565b602080825260129082015271416c72656164792067656e6572617465642160701b604082015260600190565b60208082526022908201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604082015261647360f01b606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b60208082526021908201527f536166654d6174683a206d756c7469706c69636174696f6e206f766572666c6f6040820152607760f81b606082015260800190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252600e908201526d29b0b632903737ba1037b832b71760911b604082015260600190565b6020808252601190820152702737ba1032b737bab3b41039b637ba399760791b604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201526839903737ba1037bbb760b91b606082015260800190565b6020808252601c908201527f4d696e696d756d206e756d62657220746f206d696e7420697320312e00000000604082015260600190565b6020808252602f908201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60408201526e3732bc34b9ba32b73a103a37b5b2b760891b606082015260800190565b6020808252601a908201527f596f7520646f206e6f74206f776e207468697320746f6b656e2e000000000000604082015260600190565b6020808252601f908201527f4f6e6c7920565246436f6f7264696e61746f722063616e2066756c66696c6c00604082015260600190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526010908201526f2737ba1032b737bab3b4102624a7259760811b604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020808252601d908201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604082015260600190565b6020808252600f908201526e2730b6b2903ab731b430b733b2b21760891b604082015260600190565b60208082526019908201527f4e6f7420656e6f7567682070726573616c6520736c6f74732e00000000000000604082015260600190565b60008482528360208301526060604083015261342960608301846132bc565b60405181810167ffffffffffffffff81118282101715613ce757fe5b604052919050565b60005b83811015613d0a578181015183820152602001613cf2565b838111156119365750506000910152565b80151581146112b157600080fd5b6001600160e01b0319811681146112b157600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea2646970667358221220d930a904147616aec2f027ffbbf188969396190edb5aa6ea9058bd23440c583b64736f6c63430007060033
Deployed Bytecode Sourcemap
86081:9628:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10622:150;;;;;;;;;;-1:-1:-1;10622:150:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70168:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;72954:221::-;;;;;;;;;;-1:-1:-1;72954:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;72484:404::-;;;;;;;;;;-1:-1:-1;72484:404:0;;;;;:::i;:::-;;:::i;:::-;;86630:52;;;;;;;;;;;;;:::i;91351:359::-;;;;;;;;;;-1:-1:-1;91351:359:0;;;;;:::i;:::-;;:::i;71962:211::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;92290:350::-;;;;;;;;;;-1:-1:-1;92290:350:0;;;;;:::i;:::-;;:::i;73844:305::-;;;;;;;;;;-1:-1:-1;73844:305:0;;;;;:::i;:::-;;:::i;71724:162::-;;;;;;;;;;-1:-1:-1;71724:162:0;;;;;:::i;:::-;;:::i;91769:449::-;;;;;;;;;;-1:-1:-1;91769:449:0;;;;;:::i;:::-;;:::i;86473:41::-;;;;;;;;;;-1:-1:-1;86473:41:0;;;;;:::i;:::-;;:::i;90227:103::-;;;;;;;;;;;;;:::i;89617:131::-;;;;;;;;;;;;;:::i;74220:151::-;;;;;;;;;;-1:-1:-1;74220:151:0;;;;;:::i;:::-;;:::i;89404:158::-;;;;;;;;;;-1:-1:-1;89404:158:0;;;;;:::i;:::-;;:::i;87055:31::-;;;;;;;;;;;;;:::i;95218:488::-;;;;;;;;;;-1:-1:-1;95218:488:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;72250:172::-;;;;;;;;;;-1:-1:-1;72250:172:0;;;;;:::i;:::-;;:::i;90039:101::-;;;;;;;;;;-1:-1:-1;90039:101:0;;;;;:::i;:::-;;:::i;86523:51::-;;;;;;;;;;-1:-1:-1;86523:51:0;;;;;:::i;:::-;;:::i;93217:138::-;;;;;;;;;;-1:-1:-1;93217:138:0;;;;;:::i;:::-;;:::i;86397:25::-;;;;;;;;;;;;;:::i;69924:177::-;;;;;;;;;;-1:-1:-1;69924:177:0;;;;;:::i;:::-;;:::i;86732:29::-;;;;;;;;;;;;;:::i;86828:26::-;;;;;;;;;;;;;:::i;71543:97::-;;;;;;;;;;;;;:::i;69641:221::-;;;;;;;;;;-1:-1:-1;69641:221:0;;;;;:::i;:::-;;:::i;84947:148::-;;;;;;;;;;;;;:::i;92711:463::-;;;;;;;;;;-1:-1:-1;92711:463:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;84296:87::-;;;;;;;;;;;;;:::i;57419:233::-;;;;;;;;;;-1:-1:-1;57419:233:0;;;;;:::i;:::-;;:::i;70337:104::-;;;;;;;;;;;;;:::i;86583:38::-;;;;;;;;;;;;;:::i;93596:963::-;;;;;;:::i;:::-;;:::i;73247:295::-;;;;;;;;;;-1:-1:-1;73247:295:0;;;;;:::i;:::-;;:::i;90390:109::-;;;;;;;;;;;;;:::i;74442:285::-;;;;;;;;;;-1:-1:-1;74442:285:0;;;;;:::i;:::-;;:::i;90834:389::-;;;;;;;;;;-1:-1:-1;90834:389:0;;;;;:::i;:::-;;:::i;87131:31::-;;;;;;;;;;;;;:::i;86252:52::-;;;;;;;;;;;;;:::i;70512:792::-;;;;;;;;;;-1:-1:-1;70512:792:0;;;;;:::i;:::-;;:::i;89174:159::-;;;;;;;;;;-1:-1:-1;89174:159:0;;;;;:::i;:::-;;:::i;86995:25::-;;;;;;;;;;;;;:::i;86179:52::-;;;;;;;;;;;;;:::i;94976:169::-;;;;;;;;;;-1:-1:-1;94976:169:0;;;;;:::i;:::-;;:::i;93403:159::-;;;;;;;;;;-1:-1:-1;93403:159:0;;;;;:::i;:::-;;:::i;73613:164::-;;;;;;;;;;-1:-1:-1;73613:164:0;;;;;:::i;:::-;;:::i;88354:544::-;;;;;;;;;;-1:-1:-1;88354:544:0;;;;;:::i;:::-;;:::i;90531:98::-;;;;;;;;;;;;;:::i;85250:244::-;;;;;;;;;;-1:-1:-1;85250:244:0;;;;;:::i;:::-;;:::i;86349:39::-;;;;;;;;;;;;;:::i;94602:330::-;;;;;;;;;;-1:-1:-1;94602:330:0;;;;;:::i;:::-;;:::i;86933:29::-;;;;;;;;;;;;;:::i;89785:156::-;;;;;;;;;;-1:-1:-1;89785:156:0;;;;;:::i;:::-;;:::i;10622:150::-;-1:-1:-1;;;;;;10731:33:0;;10707:4;10731:33;;;:20;:33;;;;;;;;10622:150;;;;:::o;70168:100::-;70255:5;70248:12;;;;;;;;-1:-1:-1;;70248:12:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70222:13;;70248:12;;70255:5;;70248:12;;70255:5;70248:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70168:100;:::o;72954:221::-;73030:7;73058:16;73066:7;73058;:16::i;:::-;73050:73;;;;-1:-1:-1;;;73050:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;73143:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;73143:24:0;;72954:221::o;72484:404::-;72565:13;72581:23;72596:7;72581:14;:23::i;:::-;72565:39;;72629:5;-1:-1:-1;;;;;72623:11:0;:2;-1:-1:-1;;;;;72623:11:0;;;72615:57;;;;-1:-1:-1;;;72615:57:0;;;;;;;:::i;:::-;72709:5;-1:-1:-1;;;;;72693:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;72693:21:0;;:69;;;;72718:44;72742:5;72749:12;:10;:12::i;72718:44::-;72685:161;;;;-1:-1:-1;;;72685:161:0;;;;;;;:::i;:::-;72859:21;72868:2;72872:7;72859:8;:21::i;:::-;72484:404;;;:::o;86630:52::-;;;;;;;;;;;;;;;-1:-1:-1;;86630:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;91351:359::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;86383:5:::1;91423:29;91441:10;91423:13;:11;:13::i;:::-;:17:::0;::::1;:29::i;:::-;:43;;91415:73;;;;-1:-1:-1::0;;;91415:73:0::1;;;;;;;:::i;:::-;91504:6;91499:204;91520:10;91516:1;:14;91499:204;;;91552:14;91569:13;:11;:13::i;:::-;91552:30;;86383:5;91601:9;:22;91597:95;;;91644:32;91654:10;91666:9;91644;:32::i;:::-;-1:-1:-1::0;91532:3:0::1;;91499:204;;;;91351:359:::0;:::o;71962:211::-;72023:7;72144:21;:12;:19;:21::i;:::-;72137:28;;71962:211;:::o;92290:350::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;92382:15:::1;92417:6:::0;92412:173:::1;92433:10;:17;92429:1;:21;92412:173;;;92486:19;:34;92506:10;92517:1;92506:13;;;;;;;;;;;;;;-1:-1:-1::0;;;;;92486:34:0::1;-1:-1:-1::0;;;;;92486:34:0::1;;;;;;;;;;;;;92472:48;;;;92572:1;92535:19;:34;92555:10;92566:1;92555:13;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;92535:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;92535:34:0;:38;92452:3:::1;;92412:173;;;-1:-1:-1::0;92595:22:0::1;:36:::0;;;;;::::1;::::0;;-1:-1:-1;92290:350:0:o;73844:305::-;74005:41;74024:12;:10;:12::i;:::-;74038:7;74005:18;:41::i;:::-;73997:103;;;;-1:-1:-1;;;73997:103:0;;;;;;;:::i;:::-;74113:28;74123:4;74129:2;74133:7;74113:9;:28::i;71724:162::-;-1:-1:-1;;;;;71848:20:0;;71821:7;71848:20;;;:13;:20;;;;;:30;;71872:5;71848:23;:30::i;:::-;71841:37;;71724:162;;;;;:::o;91769:449::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;91874:14:::1;91891:37;91910:10;:17;91891:14;:18;;:37;;;;:::i;:::-;91874:54;;86383:5;91947:37;91974:9;91947:22;;:26;;:37;;;;:::i;:::-;:51;;91939:81;;;;-1:-1:-1::0;;;91939:81:0::1;;;;;;;:::i;:::-;92046:6;92041:124;92062:10;:17;92058:1;:21;92041:124;;;92139:14;92101:19;:34;92121:10;92132:1;92121:13;;;;;;;;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;92101:34:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;92101:34:0;:52;;;;::::1;::::0;;-1:-1:-1;92081:3:0::1;92041:124;;;-1:-1:-1::0;92175:22:0::1;:35:::0;;;;::::1;::::0;;-1:-1:-1;;91769:449:0:o;86473:41::-;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;86473:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;90227:103;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;90290:1:::1;90278:9;:13:::0;90307:15:::1;::::0;::::1;::::0;;;::::1;90227:103::o:0;89617:131::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;89712:28:::1;::::0;89680:21:::1;::::0;89712:10:::1;::::0;:28;::::1;;;::::0;89680:21;;89665:12:::1;89712:28:::0;89665:12;89712:28;89680:21;89712:10;:28;::::1;;;;;;;;;;;;;::::0;::::1;;;;74220:151:::0;74324:39;74341:4;74347:2;74351:7;74324:39;;;;;;;;;;;;:16;:39::i;89404:158::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;89482:26;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;89524:30;89542:11;89524:30;;;;;;:::i;:::-;;;;;;;;89404:158:::0;:::o;87055:31::-;;;;;;;;;;;;;;;-1:-1:-1;;87055:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95218:488;95284:15;95312;95330:17;95340:6;95330:9;:17::i;:::-;95312:35;-1:-1:-1;95362:15:0;95358:341;;95401:15;;;95414:1;95401:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95394:22;;;;;95358:341;95449:22;95487:10;95474:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95449:49;;95518:10;95513:147;95542:10;95534:5;:18;95513:147;;;95598:10;:46;95609:34;95629:6;95637:5;95609:19;:34::i;:::-;95598:46;;;;;;;;;;;;;;-1:-1:-1;95598:46:0;95582:62;;;;;;;;;;;-1:-1:-1;;95582:62:0;;;;;;;;;;;;;;;;;;;;;;;;;;;95598:46;;95582:62;;;95598:46;95582:62;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:6;95589:5;95582:13;;;;;;;;;;;;;;;;;:62;95554:7;;95513:147;;;-1:-1:-1;95681:6:0;-1:-1:-1;95674:13:0;;-1:-1:-1;95674:13:0;72250:172;72325:7;;72367:22;:12;72383:5;72367:15;:22::i;:::-;-1:-1:-1;72345:44:0;72250:172;-1:-1:-1;;;72250:172:0:o;90039:101::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;90111:21:::1;90123:8;90111:11;:21::i;:::-;90039:101:::0;:::o;86523:51::-;;;;;;;;;;;;;:::o;93217:138::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;93289:18;;::::1;::::0;:7:::1;::::0;:18:::1;::::0;::::1;::::0;::::1;:::i;:::-;;93323:24;93338:8;93323:24;;;;;;:::i;86397:25::-:0;;;;:::o;69924:177::-;69996:7;70023:70;70040:7;70023:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;86732:29::-;;;;;;;;;;;;;;;-1:-1:-1;;86732:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86828:26;;;;:::o;71543:97::-;71624:8;71617:15;;;;;;;;-1:-1:-1;;71617:15:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71591:13;;71617:15;;71624:8;;71617:15;;71624:8;71617:15;;;;;;;;;;;;;;;;;;;;;;;;69641:221;69713:7;-1:-1:-1;;;;;69741:19:0;;69733:74;;;;-1:-1:-1;;;69733:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;69825:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;84947:148::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;85038:6:::1;::::0;85017:40:::1;::::0;85054:1:::1;::::0;-1:-1:-1;;;;;85038:6:0::1;::::0;85017:40:::1;::::0;85054:1;;85017:40:::1;85068:6;:19:::0;;-1:-1:-1;;;;;;85068:19:0::1;::::0;;84947:148::o;92711:463::-;92772:13;92798:15;92816:17;92826:6;92816:9;:17::i;:::-;92798:35;-1:-1:-1;92848:15:0;92844:323;;92887:13;;;92898:1;92887:13;;;;;;;;;;;;92844:323;92933:20;92967:10;92956:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;92956:22:0;;92933:45;;92998:10;92993:135;93022:10;93014:5;:18;92993:135;;;93078:34;93098:6;93106:5;93078:19;:34::i;:::-;93062:6;93069:5;93062:13;;;;;;;;;;;;;;;;;:50;93034:7;;92993:135;;84296:87;84369:6;;-1:-1:-1;;;;;84369:6:0;84296:87;:::o;57419:233::-;57535:10;-1:-1:-1;;;;;57549:14:0;57535:28;;57527:72;;;;-1:-1:-1;;;57527:72:0;;;;;;;:::i;:::-;57606:40;57624:9;57635:10;57606:17;:40::i;70337:104::-;70426:7;70419:14;;;;;;;;-1:-1:-1;;70419:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70393:13;;70419:14;;70426:7;;70419:14;;70426:7;70419:14;;;;;;;;;;;;;;;;;;;;;;;;86583:38;;;;:::o;93596:963::-;93674:1;93661:10;:14;93653:55;;;;-1:-1:-1;;;93653:55:0;;;;;;;:::i;:::-;93739:1;93727:9;;:13;93719:40;;;;-1:-1:-1;;;93719:40:0;;;;;;;:::i;:::-;86383:5;93778:29;93796:10;93778:13;:11;:13::i;:29::-;:43;;93770:73;;;;-1:-1:-1;;;93770:73:0;;;;;;;:::i;:::-;93959:27;86214:17;93975:10;93959:15;:27::i;:::-;93946:9;:40;;93938:71;;;;-1:-1:-1;;;93938:71:0;;;;;;;:::i;:::-;94026:9;;94039:1;94026:14;94022:306;;;94085:10;94065:31;;;;:19;:31;;;;;;:45;-1:-1:-1;94065:45:0;94057:83;;;;-1:-1:-1;;;94057:83:0;;;;;;;:::i;:::-;94175:10;94155:31;;;;:19;:31;;;;;:45;;;;;;;94022:306;;;86302:2;94246:10;:40;;94238:78;;;;-1:-1:-1;;;94238:78:0;;;;;;;:::i;:::-;94353:6;94348:204;94369:10;94365:1;:14;94348:204;;;94401:14;94418:13;:11;:13::i;:::-;94401:30;;86383:5;94450:9;:22;94446:95;;;94493:32;94503:10;94515:9;94493;:32::i;:::-;-1:-1:-1;94381:3:0;;94348:204;;73247:295;73362:12;:10;:12::i;:::-;-1:-1:-1;;;;;73350:24:0;:8;-1:-1:-1;;;;;73350:24:0;;;73342:62;;;;-1:-1:-1;;;73342:62:0;;;;;;;:::i;:::-;73462:8;73417:18;:32;73436:12;:10;:12::i;:::-;-1:-1:-1;;;;;73417:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;73417:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;73417:53:0;;;;;;;;;;;73501:12;:10;:12::i;:::-;-1:-1:-1;;;;;73486:48:0;;73525:8;73486:48;;;;;;:::i;:::-;;;;;;;;73247:295;;:::o;90390:109::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;90456:1:::1;90444:9;:13:::0;90473:18:::1;::::0;::::1;::::0;;;::::1;90390:109::o:0;74442:285::-;74574:41;74593:12;:10;:12::i;:::-;74607:7;74574:18;:41::i;:::-;74566:103;;;;-1:-1:-1;;;74566:103:0;;;;;;;:::i;:::-;74680:39;74694:4;74700:2;74704:7;74713:5;74680:13;:39::i;:::-;74442:285;;;;:::o;90834:389::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;86383:5:::1;90919:36;90937:10;:17;90919:13;:11;:13::i;:36::-;:50;;90911:80;;;;-1:-1:-1::0;;;90911:80:0::1;;;;;;;:::i;:::-;91007:6;91002:214;91023:10;:17;91019:1;:21;91002:214;;;91062:14;91079:13;:11;:13::i;:::-;91062:30;;86383:5;91111:9;:22;91107:98;;;91154:35;91164:10;91175:1;91164:13;;;;;;;;;;;;;;91179:9;91154;:35::i;:::-;-1:-1:-1::0;91042:3:0::1;;91002:214;;87131:31:::0;;;;;;;;;;;;;;;-1:-1:-1;;87131:31:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86252:52;86302:2;86252:52;:::o;70512:792::-;70585:13;70619:16;70627:7;70619;:16::i;:::-;70611:76;;;;-1:-1:-1;;;70611:76:0;;;;;;;:::i;:::-;70700:23;70726:19;;;:10;:19;;;;;;;;70700:45;;;;;;;;;;;-1:-1:-1;;70700:45:0;;;;;;;;;;;;;;;;;;;;;;;;;;;70726:19;;70700:45;;;70726:19;70700:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70756:18;70777:9;:7;:9::i;:::-;70756:30;;70868:4;70862:18;70884:1;70862:23;70858:72;;;-1:-1:-1;70909:9:0;-1:-1:-1;70902:16:0;;70858:72;71034:23;;:27;71030:108;;71109:4;71115:9;71092:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71078:48;;;;;;71030:108;71270:4;71276:18;:7;:16;:18::i;:::-;71253:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;71239:57;;;;70512:792;;;:::o;89174:159::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;89252:26;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;89294:31;89313:11;89294:31;;;;;;:::i;86995:25::-:0;;;;:::o;86179:52::-;86214:17;86179:52;:::o;94976:169::-;95030:13;95070;:11;:13::i;:::-;95064:3;:19;95056:48;;;;-1:-1:-1;;;95056:48:0;;;;;;;:::i;:::-;95122:15;;;;:10;:15;;;;;;;;;95115:22;;;;;;-1:-1:-1;;95115:22:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;95122:15;;95115:22;;95122:15;95115:22;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;94976:169;;;:::o;93403:159::-;93455:13;93495;:11;:13::i;:::-;93489:3;:19;93481:48;;;;-1:-1:-1;;;93481:48:0;;;;;;;:::i;:::-;93547:7;93540:14;;;;;;;;;;;;;-1:-1:-1;;93540:14:0;;;;;;;;;;;;;;;;;;;;;;;;;;;93547:7;93540:14;;93547:7;93540:14;;;;;;;;;;;;;;;;;;;;;;;;73613:164;-1:-1:-1;;;;;73734:25:0;;;73710:4;73734:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;73613:164::o;88354:544::-;88468:17;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;88506:14:::1;::::0;:19;88498:50:::1;;;;-1:-1:-1::0;;;88498:50:0::1;;;;;;;:::i;:::-;88600:6;::::0;88567:29:::1;::::0;-1:-1:-1;;;88567:29:0;;-1:-1:-1;;;;;88567:4:0::1;:14;::::0;::::1;::::0;:29:::1;::::0;88590:4:::1;::::0;88567:29:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:39;;88559:68;;;;-1:-1:-1::0;;;88559:68:0::1;;;;;;;:::i;:::-;88648:17;:35:::0;;;88694:13:::1;:28:::0;;;88733:26;;::::1;::::0;:12:::1;::::0;:26:::1;::::0;::::1;::::0;::::1;:::i;:::-;;88775:60;88792:15;88809:12;88823:11;88775:60;;;;;;;;:::i;:::-;;;;;;;;88853:37;88871:10;;88883:6;;88853:17;:37::i;:::-;88846:44;;84587:1;88354:544:::0;;;;;:::o;90531:98::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;90592:1:::1;90580:9;:13:::0;;;90609:12:::1;::::0;::::1;::::0;90592:1;90609:12:::1;90531:98::o:0;85250:244::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;85339:22:0;::::1;85331:73;;;;-1:-1:-1::0;;;85331:73:0::1;;;;;;;:::i;:::-;85441:6;::::0;85420:38:::1;::::0;-1:-1:-1;;;;;85420:38:0;;::::1;::::0;85441:6:::1;::::0;85420:38:::1;::::0;85441:6:::1;::::0;85420:38:::1;85469:6;:17:::0;;-1:-1:-1;;;;;;85469:17:0::1;-1:-1:-1::0;;;;;85469:17:0;;;::::1;::::0;;;::::1;::::0;;85250:244::o;86349:39::-;86383:5;86349:39;:::o;94602:330::-;94700:10;94684:12;94692:3;94684:7;:12::i;:::-;-1:-1:-1;;;;;94684:26:0;;94676:65;;;;-1:-1:-1;;;94676:65:0;;;;;;;:::i;:::-;94797:15;;;;:10;:15;;;;;;;94784:30;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;94760:20;94773:5;94760:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;;94752:82;;;;-1:-1:-1;;;94752:82:0;;;;;;;:::i;:::-;94845:15;;;;:10;:15;;;;;;;;:23;;;;;;;;:::i;:::-;;94884:40;94901:10;94913:3;94918:5;94884:40;;;;;;;;:::i;:::-;;;;;;;;94602:330;;:::o;86933:29::-;;;;:::o;89785:156::-;84527:12;:10;:12::i;:::-;-1:-1:-1;;;;;84516:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;84516:23:0;;84508:68;;;;-1:-1:-1;;;84508:68:0;;;;;;;:::i;:::-;89863:24;;::::1;::::0;:10:::1;::::0;:24:::1;::::0;::::1;::::0;::::1;:::i;:::-;;89903:30;89921:11;89903:30;;;;;;:::i;76194:127::-:0;76259:4;76283:30;:12;76305:7;76283:21;:30::i;1597:106::-;1685:10;1597:106;:::o;82212:192::-;82287:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;82287:29:0;-1:-1:-1;;;;;82287:29:0;;;;;;;;:24;;82341:23;82287:24;82341:14;:23::i;:::-;-1:-1:-1;;;;;82332:46:0;;;;;;;;;;;82212:192;;:::o;60464:179::-;60522:7;60554:5;;;60578:6;;;;60570:46;;;;-1:-1:-1;;;60570:46:0;;;;;;;:::i;77186:110::-;77262:26;77272:2;77276:7;77262:26;;;;;;;;;;;;:9;:26::i;37219:123::-;37288:7;37315:19;37323:3;37315:7;:19::i;76488:355::-;76581:4;76606:16;76614:7;76606;:16::i;:::-;76598:73;;;;-1:-1:-1;;;76598:73:0;;;;;;;:::i;:::-;76682:13;76698:23;76713:7;76698:14;:23::i;:::-;76682:39;;76751:5;-1:-1:-1;;;;;76740:16:0;:7;-1:-1:-1;;;;;76740:16:0;;:51;;;;76784:7;-1:-1:-1;;;;;76760:31:0;:20;76772:7;76760:11;:20::i;:::-;-1:-1:-1;;;;;76760:31:0;;76740:51;:94;;;;76795:39;76819:5;76826:7;76795:23;:39::i;:::-;76732:103;76488:355;-1:-1:-1;;;;76488:355:0:o;79624:599::-;79749:4;-1:-1:-1;;;;;79722:31:0;:23;79737:7;79722:14;:23::i;:::-;-1:-1:-1;;;;;79722:31:0;;79714:85;;;;-1:-1:-1;;;79714:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;79836:16:0;;79828:65;;;;-1:-1:-1;;;79828:65:0;;;;;;;:::i;:::-;79906:39;79927:4;79933:2;79937:7;79906:20;:39::i;:::-;80010:29;80027:1;80031:7;80010:8;:29::i;:::-;-1:-1:-1;;;;;80052:19:0;;;;;;:13;:19;;;;;:35;;80079:7;80052:26;:35::i;:::-;-1:-1:-1;;;;;;80098:17:0;;;;;;:13;:17;;;;;:30;;80120:7;80098:21;:30::i;:::-;-1:-1:-1;80141:29:0;:12;80158:7;80167:2;80141:16;:29::i;:::-;;80207:7;80203:2;-1:-1:-1;;;;;80188:27:0;80197:4;-1:-1:-1;;;;;80188:27:0;;;;;;;;;;;79624:599;;;:::o;29004:137::-;29075:7;29110:22;29114:3;29126:5;29110:3;:22::i;61343:220::-;61401:7;61425:6;61421:20;;-1:-1:-1;61440:1:0;61433:8;;61421:20;61464:5;;;61468:1;61464;:5;:1;61488:5;;;;;:10;61480:56;;;;-1:-1:-1;;;61480:56:0;;;;;;;:::i;37681:236::-;37761:7;;;;37821:22;37825:3;37837:5;37821:3;:22::i;:::-;37790:53;;;;-1:-1:-1;37681:236:0;-1:-1:-1;;;;;37681:236:0:o;80824:100::-;80897:19;;;;:8;;:19;;;;;:::i;38967:213::-;39074:7;39125:44;39130:3;39150;39156:12;39125:4;:44::i;88956:177::-;89053:14;:28;;;89097;;;;;;89070:11;;89097:28;:::i;75609:272::-;75723:28;75733:4;75739:2;75743:7;75723:9;:28::i;:::-;75770:48;75793:4;75799:2;75803:7;75812:5;75770:22;:48::i;:::-;75762:111;;;;-1:-1:-1;;;75762:111:0;;;;;;;:::i;39437:746::-;39493:13;39714:10;39710:53;;-1:-1:-1;39741:10:0;;;;;;;;;;;;-1:-1:-1;;;39741:10:0;;;;;;39710:53;39788:5;39773:12;39829:78;39836:9;;39829:78;;39862:8;;39893:2;39885:10;;;;39829:78;;;39917:19;39949:6;39939:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39939:17:0;-1:-1:-1;40011:5:0;;-1:-1:-1;39917:39:0;-1:-1:-1;;;39983:10:0;;40027:117;40034:9;;40027:117;;40103:2;40096:4;:9;40091:2;:14;40078:29;;40060:6;40067:7;;;;;;;40060:15;;;;;;;;;;;:47;-1:-1:-1;;;;;40060:47:0;;;;;;;;-1:-1:-1;40130:2:0;40122:10;;;;40027:117;;;-1:-1:-1;40168:6:0;39437:746;-1:-1:-1;;;;39437:746:0:o;55480:1080::-;55590:17;55625:4;-1:-1:-1;;;;;55625:20:0;;55646:14;55662:4;55679:8;54310:1;55668:43;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55625:87;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;55947:15;55966:82;55983:8;54310:1;56024:4;56031:6;:16;56038:8;56031:16;;;;;;;;;;;;55966;:82::i;:::-;56485:6;:16;;;;;;;;;;;55947:101;;-1:-1:-1;56485:23:0;;56506:1;56485:20;:23::i;:::-;56466:6;:16;;;;;;;;;;:42;56522:32;56473:8;56546:7;56522:13;:32::i;36980:151::-;37064:4;37088:35;37098:3;37118;37088:9;:35::i;77523:250::-;77619:18;77625:2;77629:7;77619:5;:18::i;:::-;77656:54;77687:1;77691:2;77695:7;77704:5;77656:22;:54::i;:::-;77648:117;;;;-1:-1:-1;;;77648:117:0;;;;;;;:::i;33798:110::-;33881:19;;33798:110::o;28091:137::-;28161:4;28185:35;28193:3;28213:5;28185:7;:35::i;27784:131::-;27851:4;27875:32;27880:3;27900:5;27875:4;:32::i;36403:185::-;36492:4;36516:64;36521:3;36541;-1:-1:-1;;;;;36555:23:0;;36516:4;:64::i;24042:204::-;24137:18;;24109:7;;24137:26;-1:-1:-1;24129:73:0;;;;-1:-1:-1;;;24129:73:0;;;;;;;:::i;:::-;24220:3;:11;;24232:5;24220:18;;;;;;;;;;;;;;;;24213:25;;24042:204;;;;:::o;34263:279::-;34367:19;;34330:7;;;;34367:27;-1:-1:-1;34359:74:0;;;;-1:-1:-1;;;34359:74:0;;;;;;;:::i;:::-;34446:22;34471:3;:12;;34484:5;34471:19;;;;;;;;;;;;;;;;;;34446:44;;34509:5;:10;;;34521:5;:12;;;34501:33;;;;;34263:279;;;;;:::o;35760:319::-;35854:7;35893:17;;;:12;;;:17;;;;;;35944:12;35929:13;35921:36;;;;-1:-1:-1;;;35921:36:0;;;;;;;;:::i;:::-;;36011:3;:12;;36035:1;36024:8;:12;36011:26;;;;;;;;;;;;;;;;;;:33;;;36004:40;;;35760:319;;;;;:::o;81489:604::-;81610:4;81637:15;:2;-1:-1:-1;;;;;81637:13:0;;:15::i;:::-;81632:60;;-1:-1:-1;81676:4:0;81669:11;;81632:60;81702:23;81728:252;-1:-1:-1;;;81841:12:0;:10;:12::i;:::-;81868:4;81887:7;81909:5;81744:181;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;81744:181:0;;;;;;;-1:-1:-1;;;;;81744:181:0;;;;;;;;;;;81728:252;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;81728:15:0;;;:252;:15;:252::i;:::-;81702:278;;81991:13;82018:10;82007:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;82058:26:0;-1:-1:-1;;;82058:26:0;;-1:-1:-1;;;81489:604:0;;;;;;:::o;46445:279::-;46615:7;46676:8;46686:9;46697:10;46709:6;46665:51;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;46665:51:0;;;;;;;;;46655:62;;46665:51;46655:62;;;;;46445:279;-1:-1:-1;;;;;46445:279:0:o;47115:215::-;47240:7;47299:8;47309:13;47282:41;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47272:52;;;;;;47265:59;;47115:215;;;;:::o;33578:125::-;33649:4;33673:17;;;:12;;;;;:17;;;;;;:22;;;33578:125::o;78109:404::-;-1:-1:-1;;;;;78189:16:0;;78181:61;;;;-1:-1:-1;;;78181:61:0;;;;;;;:::i;:::-;78262:16;78270:7;78262;:16::i;:::-;78261:17;78253:58;;;;-1:-1:-1;;;78253:58:0;;;;;;;:::i;:::-;78324:45;78353:1;78357:2;78361:7;78324:20;:45::i;:::-;-1:-1:-1;;;;;78382:17:0;;;;;;:13;:17;;;;;:30;;78404:7;78382:21;:30::i;:::-;-1:-1:-1;78425:29:0;:12;78442:7;78451:2;78425:16;:29::i;:::-;-1:-1:-1;78472:33:0;;78497:7;;-1:-1:-1;;;;;78472:33:0;;;78489:1;;78472:33;;78489:1;;78472:33;78109:404;;:::o;21744:1544::-;21810:4;21949:19;;;:12;;;:19;;;;;;21985:15;;21981:1300;;22420:18;;-1:-1:-1;;22371:14:0;;;;22420:22;;;;22347:21;;22420:3;;:22;;22707;;;;;;;;;;;;;;22687:42;;22853:9;22824:3;:11;;22836:13;22824:26;;;;;;;;;;;;;;;;;;;:38;;;;22930:23;;;22972:1;22930:12;;;:23;;;;;;22956:17;;;22930:43;;23082:17;;22930:3;;23082:17;;;;;;;;;;;;;;;;;;;;;;23177:3;:12;;:19;23190:5;23177:19;;;;;;;;;;;23170:26;;;23220:4;23213:11;;;;;;;;21981:1300;23264:5;23257:12;;;;;21154:414;21217:4;21239:21;21249:3;21254:5;21239:9;:21::i;:::-;21234:327;;-1:-1:-1;21277:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;21460:18;;21438:19;;;:12;;;:19;;;;;;:40;;;;21493:11;;21234:327;-1:-1:-1;21544:5:0;21537:12;;31078:692;31154:4;31289:17;;;:12;;;:17;;;;;;31323:13;31319:444;;-1:-1:-1;;31408:38:0;;;;;;;;;;;;;;;;;;31390:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;31605:19;;31585:17;;;:12;;;:17;;;;;;;:39;31639:11;;31319:444;31719:5;31683:3;:12;;31707:1;31696:8;:12;31683:26;;;;;;;;;;;;;;;;;;:33;;:41;;;;31746:5;31739:12;;;;;12167:422;12534:20;12573:8;;;12167:422::o;15085:195::-;15188:12;15220:52;15242:6;15250:4;15256:1;15259:12;15188;16389:18;16400:6;16389:10;:18::i;:::-;16381:60;;;;-1:-1:-1;;;16381:60:0;;;;;;;:::i;:::-;16515:12;16529:23;16556:6;-1:-1:-1;;;;;16556:11:0;16576:5;16584:4;16556:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16514:75;;;;16607:52;16625:7;16634:10;16646:12;16607:17;:52::i;:::-;16600:59;16137:530;-1:-1:-1;;;;;;;16137:530:0:o;18677:742::-;18792:12;18821:7;18817:595;;;-1:-1:-1;18852:10:0;18845:17;;18817:595;18966:17;;:21;18962:439;;19229:10;19223:17;19290:15;19277:10;19273:2;19269:19;19262:44;19177:148;19372:12;19365:20;;-1:-1:-1;;;19365:20:0;;;;;;;;:::i;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:400:1;;114:18;106:6;103:30;100:2;;;136:9;100:2;165:58;211:2;188:17;;-1:-1:-1;;184:31:1;217:4;180:42;165:58;:::i;:::-;156:67;;246:6;239:5;232:21;286:3;277:6;272:3;268:16;265:25;262:2;;;303:1;300;293:12;262:2;352:6;347:3;340:4;333:5;329:16;316:43;406:1;399:4;390:6;383:5;379:18;375:29;368:40;90:324;;;;;:::o;419:175::-;489:20;;-1:-1:-1;;;;;538:31:1;;528:42;;518:2;;584:1;581;574:12;599:748;;712:3;705:4;697:6;693:17;689:27;679:2;;734:5;727;720:20;679:2;774:6;761:20;800:4;823:18;819:2;816:26;813:2;;;845:9;813:2;883;879;875:11;906:27;929:2;925;921:11;906:27;:::i;:::-;967:15;;;998:12;;;;1030:15;;;1064;;;1060:24;;1057:33;-1:-1:-1;1054:2:1;;;1107:5;1100;1093:20;1054:2;1133:5;1124:14;;1147:171;1161:2;1158:1;1155:9;1147:171;;;1218:25;1239:3;1218:25;:::i;:::-;1206:38;;1179:1;1172:9;;;;;1264:12;;;;1296;;1147:171;;;-1:-1:-1;1336:5:1;669:678;-1:-1:-1;;;;;;;669:678:1:o;1352:233::-;;1450:3;1443:4;1435:6;1431:17;1427:27;1417:2;;1472:5;1465;1458:20;1417:2;1498:81;1575:3;1566:6;1553:20;1546:4;1538:6;1534:17;1498:81;:::i;1590:198::-;;1702:2;1690:9;1681:7;1677:23;1673:32;1670:2;;;1723:6;1715;1708:22;1670:2;1751:31;1772:9;1751:31;:::i;1793:274::-;;;1922:2;1910:9;1901:7;1897:23;1893:32;1890:2;;;1943:6;1935;1928:22;1890:2;1971:31;1992:9;1971:31;:::i;:::-;1961:41;;2021:40;2057:2;2046:9;2042:18;2021:40;:::i;:::-;2011:50;;1880:187;;;;;:::o;2072:342::-;;;;2218:2;2206:9;2197:7;2193:23;2189:32;2186:2;;;2239:6;2231;2224:22;2186:2;2267:31;2288:9;2267:31;:::i;:::-;2257:41;;2317:40;2353:2;2342:9;2338:18;2317:40;:::i;:::-;2307:50;;2404:2;2393:9;2389:18;2376:32;2366:42;;2176:238;;;;;:::o;2419:702::-;;;;;2591:3;2579:9;2570:7;2566:23;2562:33;2559:2;;;2613:6;2605;2598:22;2559:2;2641:31;2662:9;2641:31;:::i;:::-;2631:41;;2691:40;2727:2;2716:9;2712:18;2691:40;:::i;:::-;2681:50;;2778:2;2767:9;2763:18;2750:32;2740:42;;2833:2;2822:9;2818:18;2805:32;2860:18;2852:6;2849:30;2846:2;;;2897:6;2889;2882:22;2846:2;2925:22;;2978:4;2970:13;;2966:27;-1:-1:-1;2956:2:1;;3012:6;3004;2997:22;2956:2;3040:75;3107:7;3102:2;3089:16;3084:2;3080;3076:11;3040:75;:::i;:::-;3030:85;;;2549:572;;;;;;;:::o;3126:329::-;;;3252:2;3240:9;3231:7;3227:23;3223:32;3220:2;;;3273:6;3265;3258:22;3220:2;3301:31;3322:9;3301:31;:::i;:::-;3291:41;;3382:2;3371:9;3367:18;3354:32;3395:30;3419:5;3395:30;:::i;:::-;3444:5;3434:15;;;3210:245;;;;;:::o;3460:266::-;;;3589:2;3577:9;3568:7;3564:23;3560:32;3557:2;;;3610:6;3602;3595:22;3557:2;3638:31;3659:9;3638:31;:::i;:::-;3628:41;3716:2;3701:18;;;;3688:32;;-1:-1:-1;;;3547:179:1:o;3731:374::-;;3868:2;3856:9;3847:7;3843:23;3839:32;3836:2;;;3889:6;3881;3874:22;3836:2;3934:9;3921:23;3967:18;3959:6;3956:30;3953:2;;;4004:6;3996;3989:22;3953:2;4032:67;4091:7;4082:6;4071:9;4067:22;4032:67;:::i;4110:442::-;;;4264:2;4252:9;4243:7;4239:23;4235:32;4232:2;;;4285:6;4277;4270:22;4232:2;4330:9;4317:23;4363:18;4355:6;4352:30;4349:2;;;4400:6;4392;4385:22;4349:2;4428:67;4487:7;4478:6;4467:9;4463:22;4428:67;:::i;:::-;4418:77;4542:2;4527:18;;;;4514:32;;-1:-1:-1;;;;4222:330:1:o;4557:257::-;;4677:2;4665:9;4656:7;4652:23;4648:32;4645:2;;;4698:6;4690;4683:22;4645:2;4735:9;4729:16;4754:30;4778:5;4754:30;:::i;4819:194::-;;4942:2;4930:9;4921:7;4917:23;4913:32;4910:2;;;4963:6;4955;4948:22;4910:2;-1:-1:-1;4991:16:1;;4900:113;-1:-1:-1;4900:113:1:o;5018:258::-;;;5147:2;5135:9;5126:7;5122:23;5118:32;5115:2;;;5168:6;5160;5153:22;5115:2;-1:-1:-1;;5196:23:1;;;5266:2;5251:18;;;5238:32;;-1:-1:-1;5105:171:1:o;5281:257::-;;5392:2;5380:9;5371:7;5367:23;5363:32;5360:2;;;5413:6;5405;5398:22;5360:2;5457:9;5444:23;5476:32;5502:5;5476:32;:::i;5543:261::-;;5665:2;5653:9;5644:7;5640:23;5636:32;5633:2;;;5686:6;5678;5671:22;5633:2;5723:9;5717:16;5742:32;5768:5;5742:32;:::i;5809:344::-;;5931:2;5919:9;5910:7;5906:23;5902:32;5899:2;;;5952:6;5944;5937:22;5899:2;5997:9;5984:23;6030:18;6022:6;6019:30;6016:2;;;6067:6;6059;6052:22;6016:2;6095:52;6139:7;6130:6;6119:9;6115:22;6095:52;:::i;6158:190::-;;6270:2;6258:9;6249:7;6245:23;6241:32;6238:2;;;6291:6;6283;6276:22;6238:2;-1:-1:-1;6319:23:1;;6228:120;-1:-1:-1;6228:120:1:o;6552:412::-;;;6691:2;6679:9;6670:7;6666:23;6662:32;6659:2;;;6712:6;6704;6697:22;6659:2;6753:9;6740:23;6730:33;;6814:2;6803:9;6799:18;6786:32;6841:18;6833:6;6830:30;6827:2;;;6878:6;6870;6863:22;6827:2;6906:52;6950:7;6941:6;6930:9;6926:22;6906:52;:::i;:::-;6896:62;;;6649:315;;;;;:::o;6969:480::-;;;;7125:2;7113:9;7104:7;7100:23;7096:32;7093:2;;;7146:6;7138;7131:22;7093:2;7187:9;7174:23;7164:33;;7244:2;7233:9;7229:18;7216:32;7206:42;;7299:2;7288:9;7284:18;7271:32;7326:18;7318:6;7315:30;7312:2;;;7363:6;7355;7348:22;7312:2;7391:52;7435:7;7426:6;7415:9;7411:22;7391:52;:::i;:::-;7381:62;;;7083:366;;;;;:::o;7454:259::-;;7535:5;7529:12;7562:6;7557:3;7550:19;7578:63;7634:6;7627:4;7622:3;7618:14;7611:4;7604:5;7600:16;7578:63;:::i;:::-;7695:2;7674:15;-1:-1:-1;;7670:29:1;7661:39;;;;7702:4;7657:50;;7505:208;-1:-1:-1;;7505:208:1:o;7718:247::-;7875:19;;;7919:2;7910:12;;7903:28;7956:2;7947:12;;7865:100::o;7970:274::-;;8137:6;8131:13;8153:53;8199:6;8194:3;8187:4;8179:6;8175:17;8153:53;:::i;:::-;8222:16;;;;;8107:137;-1:-1:-1;;8107:137:1:o;8249:830::-;;8408:3;8443:6;8437:13;8469:1;8501:2;8490:9;8486:18;8518:1;8513:126;;;;8653:1;8648:406;;;;8479:575;;8513:126;-1:-1:-1;;8546:24:1;;8534:37;;8619:1;8604:17;;8623:4;8600:28;8591:38;;;-1:-1:-1;8513:126:1;;8648:406;8698:1;8687:9;8683:17;8725:6;8720:3;8713:19;8755:4;8802:2;8797:3;8787:18;8827:3;8843:165;8857:6;8854:1;8851:13;8843:165;;;8935:14;;8922:11;;;8915:35;8978:16;;;;8872:10;;8843:165;;;-1:-1:-1;;;9028:16:1;;;-1:-1:-1;8479:575:1;-1:-1:-1;9070:3:1;;8387:692;-1:-1:-1;;;;;8387:692:1:o;9084:470::-;;9301:6;9295:13;9317:53;9363:6;9358:3;9351:4;9343:6;9339:17;9317:53;:::i;:::-;9433:13;;9392:16;;;;9455:57;9433:13;9392:16;9489:4;9477:17;;9455:57;:::i;:::-;9528:20;;9271:283;-1:-1:-1;;;;9271:283:1:o;9559:203::-;-1:-1:-1;;;;;9723:32:1;;;;9705:51;;9693:2;9678:18;;9660:102::o;9767:506::-;-1:-1:-1;;;;;10052:15:1;;;10034:34;;10104:15;;10099:2;10084:18;;10077:43;10151:2;10136:18;;10129:34;;;10199:3;10194:2;10179:18;;10172:31;;;9767:506;;10220:47;;10247:19;;10239:6;10220:47;:::i;:::-;10212:55;9986:287;-1:-1:-1;;;;;;9986:287:1:o;10278:397::-;;10520:1;10516;10511:3;10507:11;10503:19;10495:6;10491:32;10480:9;10473:51;10560:6;10555:2;10544:9;10540:18;10533:34;10603:2;10598;10587:9;10583:18;10576:30;10623:46;10665:2;10654:9;10650:18;10642:6;10623:46;:::i;:::-;10615:54;10463:212;-1:-1:-1;;;;;10463:212:1:o;11072:808::-;;11263:2;11303;11292:9;11288:18;11333:2;11322:9;11315:21;11356:6;11391;11385:13;11422:6;11414;11407:22;11460:2;11449:9;11445:18;11438:25;;11523:2;11517;11509:6;11505:15;11494:9;11490:31;11486:40;11472:54;;11561:2;11553:6;11549:15;11582:4;11595:256;11609:6;11606:1;11603:13;11595:256;;;11702:2;11698:7;11686:9;11678:6;11674:22;11670:36;11665:3;11658:49;11730:41;11764:6;11755;11749:13;11730:41;:::i;:::-;11720:51;-1:-1:-1;11829:12:1;;;;11794:15;;;;11631:1;11624:9;11595:256;;;-1:-1:-1;11868:6:1;;11243:637;-1:-1:-1;;;;;;;11243:637:1:o;11885:635::-;12056:2;12108:21;;;12178:13;;12081:18;;;12200:22;;;11885:635;;12056:2;12279:15;;;;12253:2;12238:18;;;11885:635;12325:169;12339:6;12336:1;12333:13;12325:169;;;12400:13;;12388:26;;12469:15;;;;12434:12;;;;12361:1;12354:9;12325:169;;;-1:-1:-1;12511:3:1;;12036:484;-1:-1:-1;;;;;;12036:484:1:o;12525:187::-;12690:14;;12683:22;12665:41;;12653:2;12638:18;;12620:92::o;12717:177::-;12863:25;;;12851:2;12836:18;;12818:76::o;13152:417::-;13383:25;;;13439:2;13424:18;;13417:34;;;;-1:-1:-1;;;;;13487:32:1;13482:2;13467:18;;13460:60;13551:2;13536:18;;13529:34;13370:3;13355:19;;13337:232::o;13574:221::-;;13723:2;13712:9;13705:21;13743:46;13785:2;13774:9;13770:18;13762:6;13743:46;:::i;13800:398::-;14002:2;13984:21;;;14041:2;14021:18;;;14014:30;14080:34;14075:2;14060:18;;14053:62;-1:-1:-1;;;14146:2:1;14131:18;;14124:32;14188:3;14173:19;;13974:224::o;14203:349::-;14405:2;14387:21;;;14444:2;14424:18;;;14417:30;14483:27;14478:2;14463:18;;14456:55;14543:2;14528:18;;14377:175::o;14557:414::-;14759:2;14741:21;;;14798:2;14778:18;;;14771:30;14837:34;14832:2;14817:18;;14810:62;-1:-1:-1;;;14903:2:1;14888:18;;14881:48;14961:3;14946:19;;14731:240::o;14976:402::-;15178:2;15160:21;;;15217:2;15197:18;;;15190:30;15256:34;15251:2;15236:18;;15229:62;-1:-1:-1;;;15322:2:1;15307:18;;15300:36;15368:3;15353:19;;15150:228::o;15383:352::-;15585:2;15567:21;;;15624:2;15604:18;;;15597:30;15663;15658:2;15643:18;;15636:58;15726:2;15711:18;;15557:178::o;15740:351::-;15942:2;15924:21;;;15981:2;15961:18;;;15954:30;16020:29;16015:2;16000:18;;15993:57;16082:2;16067:18;;15914:177::o;16096:340::-;16298:2;16280:21;;;16337:2;16317:18;;;16310:30;-1:-1:-1;;;16371:2:1;16356:18;;16349:46;16427:2;16412:18;;16270:166::o;16441:400::-;16643:2;16625:21;;;16682:2;16662:18;;;16655:30;16721:34;16716:2;16701:18;;16694:62;-1:-1:-1;;;16787:2:1;16772:18;;16765:34;16831:3;16816:19;;16615:226::o;16846:349::-;17048:2;17030:21;;;17087:2;17067:18;;;17060:30;17126:27;17121:2;17106:18;;17099:55;17186:2;17171:18;;17020:175::o;17607:408::-;17809:2;17791:21;;;17848:2;17828:18;;;17821:30;17887:34;17882:2;17867:18;;17860:62;-1:-1:-1;;;17953:2:1;17938:18;;17931:42;18005:3;17990:19;;17781:234::o;18020:420::-;18222:2;18204:21;;;18261:2;18241:18;;;18234:30;18300:34;18295:2;18280:18;;18273:62;18371:26;18366:2;18351:18;;18344:54;18430:3;18415:19;;18194:246::o;18445:342::-;18647:2;18629:21;;;18686:2;18666:18;;;18659:30;-1:-1:-1;;;18720:2:1;18705:18;;18698:48;18778:2;18763:18;;18619:168::o;18792:406::-;18994:2;18976:21;;;19033:2;19013:18;;;19006:30;19072:34;19067:2;19052:18;;19045:62;-1:-1:-1;;;19138:2:1;19123:18;;19116:40;19188:3;19173:19;;18966:232::o;19203:342::-;19405:2;19387:21;;;19444:2;19424:18;;;19417:30;-1:-1:-1;;;19478:2:1;19463:18;;19456:48;19536:2;19521:18;;19377:168::o;19550:398::-;19752:2;19734:21;;;19791:2;19771:18;;;19764:30;19830:34;19825:2;19810:18;;19803:62;-1:-1:-1;;;19896:2:1;19881:18;;19874:32;19938:3;19923:19;;19724:224::o;19953:356::-;20155:2;20137:21;;;20174:18;;;20167:30;20233:34;20228:2;20213:18;;20206:62;20300:2;20285:18;;20127:182::o;20314:397::-;20516:2;20498:21;;;20555:2;20535:18;;;20528:30;20594:34;20589:2;20574:18;;20567:62;-1:-1:-1;;;20660:2:1;20645:18;;20638:31;20701:3;20686:19;;20488:223::o;20716:408::-;20918:2;20900:21;;;20957:2;20937:18;;;20930:30;20996:34;20991:2;20976:18;;20969:62;-1:-1:-1;;;21062:2:1;21047:18;;21040:42;21114:3;21099:19;;20890:234::o;21129:356::-;21331:2;21313:21;;;21350:18;;;21343:30;21409:34;21404:2;21389:18;;21382:62;21476:2;21461:18;;21303:182::o;21490:338::-;21692:2;21674:21;;;21731:2;21711:18;;;21704:30;-1:-1:-1;;;21765:2:1;21750:18;;21743:44;21819:2;21804:18;;21664:164::o;21833:341::-;22035:2;22017:21;;;22074:2;22054:18;;;22047:30;-1:-1:-1;;;22108:2:1;22093:18;;22086:47;22165:2;22150:18;;22007:167::o;22179:405::-;22381:2;22363:21;;;22420:2;22400:18;;;22393:30;22459:34;22454:2;22439:18;;22432:62;-1:-1:-1;;;22525:2:1;22510:18;;22503:39;22574:3;22559:19;;22353:231::o;22589:352::-;22791:2;22773:21;;;22830:2;22810:18;;;22803:30;22869;22864:2;22849:18;;22842:58;22932:2;22917:18;;22763:178::o;22946:411::-;23148:2;23130:21;;;23187:2;23167:18;;;23160:30;23226:34;23221:2;23206:18;;23199:62;-1:-1:-1;;;23292:2:1;23277:18;;23270:45;23347:3;23332:19;;23120:237::o;23362:350::-;23564:2;23546:21;;;23603:2;23583:18;;;23576:30;23642:28;23637:2;23622:18;;23615:56;23703:2;23688:18;;23536:176::o;23717:355::-;23919:2;23901:21;;;23958:2;23938:18;;;23931:30;23997:33;23992:2;23977:18;;23970:61;24063:2;24048:18;;23891:181::o;24077:397::-;24279:2;24261:21;;;24318:2;24298:18;;;24291:30;24357:34;24352:2;24337:18;;24330:62;-1:-1:-1;;;24423:2:1;24408:18;;24401:31;24464:3;24449:19;;24251:223::o;24479:340::-;24681:2;24663:21;;;24720:2;24700:18;;;24693:30;-1:-1:-1;;;24754:2:1;24739:18;;24732:46;24810:2;24795:18;;24653:166::o;24824:413::-;25026:2;25008:21;;;25065:2;25045:18;;;25038:30;25104:34;25099:2;25084:18;;25077:62;-1:-1:-1;;;25170:2:1;25155:18;;25148:47;25227:3;25212:19;;24998:239::o;25242:353::-;25444:2;25426:21;;;25483:2;25463:18;;;25456:30;25522:31;25517:2;25502:18;;25495:59;25586:2;25571:18;;25416:179::o;25600:339::-;25802:2;25784:21;;;25841:2;25821:18;;;25814:30;-1:-1:-1;;;25875:2:1;25860:18;;25853:45;25930:2;25915:18;;25774:165::o;25944:349::-;26146:2;26128:21;;;26185:2;26165:18;;;26158:30;26224:27;26219:2;26204:18;;26197:55;26284:2;26269:18;;26118:175::o;26480:363::-;;26685:6;26674:9;26667:25;26728:6;26723:2;26712:9;26708:18;26701:34;26771:2;26766;26755:9;26751:18;26744:30;26791:46;26833:2;26822:9;26818:18;26810:6;26791:46;:::i;26848:242::-;26918:2;26912:9;26948:17;;;26995:18;26980:34;;27016:22;;;26977:62;26974:2;;;27042:9;26974:2;27069;27062:22;26892:198;;-1:-1:-1;26892:198:1:o;27095:258::-;27167:1;27177:113;27191:6;27188:1;27185:13;27177:113;;;27267:11;;;27261:18;27248:11;;;27241:39;27213:2;27206:10;27177:113;;;27308:6;27305:1;27302:13;27299:2;;;-1:-1:-1;;27343:1:1;27325:16;;27318:27;27148:205::o;27358:120::-;27446:5;27439:13;27432:21;27425:5;27422:32;27412:2;;27468:1;27465;27458:12;27483:133;-1:-1:-1;;;;;;27559:32:1;;27549:43;;27539:2;;27606:1;27603;27596:12
Swarm Source
ipfs://d930a904147616aec2f027ffbbf188969396190edb5aa6ea9058bd23440c583b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.