diff --git a/deployments/goerli/UniversalResolver.json b/deployments/goerli/UniversalResolver.json index 9bc3fc15..20d2164b 100644 --- a/deployments/goerli/UniversalResolver.json +++ b/deployments/goerli/UniversalResolver.json @@ -1,5 +1,5 @@ { - "address": "0x3952Be0b2186f8B113193a84b69bD71ad3fc1ae3", + "address": "0xdb33DF8Fee569392aa93fdbae78245613b448Ca2", "abi": [ { "inputs": [ @@ -17,6 +17,29 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint16", + "name": "status", + "type": "uint16" + }, + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "internalType": "struct HttpErrorItem[]", + "name": "errors", + "type": "tuple[]" + } + ], + "name": "HttpError", + "type": "error" + }, { "inputs": [ { @@ -48,6 +71,22 @@ "name": "OffchainLookup", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "name": "ResolverError", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverNotContract", + "type": "error" + }, { "inputs": [], "name": "ResolverNotFound", @@ -252,9 +291,21 @@ "name": "resolve", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -286,9 +337,21 @@ "name": "resolve", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -344,9 +407,21 @@ "name": "resolveCallback", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -544,48 +619,48 @@ "type": "function" } ], - "transactionHash": "0xa536d6f7ed53c16879e3306ceb272946df4d44c7d14d945a1b37c27e9828a066", + "transactionHash": "0x6c4d30660d25413a45ea8058aa1e774f8db506566be8c6f3fd30b2de896eaa09", "receipt": { "to": null, "from": "0x69420f05A11f617B4B74fFe2E04B2D300dFA556F", - "contractAddress": "0x3952Be0b2186f8B113193a84b69bD71ad3fc1ae3", - "transactionIndex": 40, - "gasUsed": "3043972", - "logsBloom": "0x00000000010000000000000000000000000000000000000000800000000000000000000000000000100000000000000000000000010000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x68c432b991745f2c9f006cd849c0d1198ceb03b9989a9be5e45a262a6360f682", - "transactionHash": "0xa536d6f7ed53c16879e3306ceb272946df4d44c7d14d945a1b37c27e9828a066", + "contractAddress": "0xdb33DF8Fee569392aa93fdbae78245613b448Ca2", + "transactionIndex": 120, + "gasUsed": "3202522", + "logsBloom": "0x00000000010000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000040000000000000008000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000002000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xe811265832445e0b6f47291a02e6f9b580add99091629f65ea85afcf2e8716f7", + "transactionHash": "0x6c4d30660d25413a45ea8058aa1e774f8db506566be8c6f3fd30b2de896eaa09", "logs": [ { - "transactionIndex": 40, - "blockNumber": 9140734, - "transactionHash": "0xa536d6f7ed53c16879e3306ceb272946df4d44c7d14d945a1b37c27e9828a066", - "address": "0x3952Be0b2186f8B113193a84b69bD71ad3fc1ae3", + "transactionIndex": 120, + "blockNumber": 10131598, + "transactionHash": "0x6c4d30660d25413a45ea8058aa1e774f8db506566be8c6f3fd30b2de896eaa09", + "address": "0xdb33DF8Fee569392aa93fdbae78245613b448Ca2", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", "0x00000000000000000000000069420f05a11f617b4b74ffe2e04b2d300dfa556f" ], "data": "0x", - "logIndex": 92, - "blockHash": "0x68c432b991745f2c9f006cd849c0d1198ceb03b9989a9be5e45a262a6360f682" + "logIndex": 223, + "blockHash": "0xe811265832445e0b6f47291a02e6f9b580add99091629f65ea85afcf2e8716f7" } ], - "blockNumber": 9140734, - "cumulativeGasUsed": "9196195", + "blockNumber": 10131598, + "cumulativeGasUsed": "26052469", "status": 1, "byzantium": true }, "args": [ "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", [ - "https://universal-offchain-unwrapper.ens-cf.workers.dev/" + "http://127.0.0.1:8787" ] ], - "numDeployments": 4, - "solcInputHash": "df131fa07ebda91fa31150d094629ae8", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"urls\",\"type\":\"string[]\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"OffchainLookup\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverWildcardNotSupported\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"metaData\",\"type\":\"bytes\"}],\"name\":\"_resolveSingle\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batchGatewayURLs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"}],\"name\":\"findResolver\",\"outputs\":[{\"internalType\":\"contract Resolver\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveCallback\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveSingleCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"reverseCallback\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"name\":\"setGatewayURLs\",\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"findResolver(bytes)\":{\"details\":\"Finds a resolver by recursively querying the registry, starting at the longest name and progressively removing labels until it finds a result.\",\"params\":{\"name\":\"The name to resolve, in DNS-encoded and normalised form.\"},\"returns\":{\"_0\":\"resolver The Resolver responsible for this name.\",\"_1\":\"namehash The namehash of the full name.\",\"_2\":\"finalOffset The offset of the first label with a resolver.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"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.\"},\"resolve(bytes,bytes)\":{\"details\":\"Performs ENS name resolution for the supplied name and resolution data.\",\"params\":{\"data\":\"The resolution data, as specified in ENSIP-10.\",\"name\":\"The name to resolve, in normalised and DNS-encoded form.\"},\"returns\":{\"_0\":\"The result of resolving the name.\"}},\"reverse(bytes,string[])\":{\"details\":\"Performs ENS name reverse resolution for the supplied reverse name.\",\"params\":{\"reverseName\":\"The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\"},\"returns\":{\"_0\":\"The resolved name, the resolved address, the reverse resolver address, and the resolver address.\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"The Universal Resolver is a contract that handles the work of resolving a name entirely onchain, making it possible to make a single smart contract call to resolve an ENS name.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/UniversalResolver.sol\":\"UniversalResolver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1300},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n // Logged when the owner of a node assigns a new owner to a subnode.\\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n // Logged when the owner of a node transfers ownership to a new account.\\n event Transfer(bytes32 indexed node, address owner);\\n\\n // Logged when the resolver for a node changes.\\n event NewResolver(bytes32 indexed node, address resolver);\\n\\n // Logged when the TTL of a node changes\\n event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n // Logged when an operator is added or removed.\\n event ApprovalForAll(\\n address indexed owner,\\n address indexed operator,\\n bool approved\\n );\\n\\n function setRecord(\\n bytes32 node,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeRecord(\\n bytes32 node,\\n bytes32 label,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeOwner(\\n bytes32 node,\\n bytes32 label,\\n address owner\\n ) external returns (bytes32);\\n\\n function setResolver(bytes32 node, address resolver) external;\\n\\n function setOwner(bytes32 node, address owner) external;\\n\\n function setTTL(bytes32 node, uint64 ttl) external;\\n\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n function owner(bytes32 node) external view returns (address);\\n\\n function resolver(bytes32 node) external view returns (address);\\n\\n function ttl(bytes32 node) external view returns (uint64);\\n\\n function recordExists(bytes32 node) external view returns (bool);\\n\\n function isApprovedForAll(\\n address owner,\\n address operator\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7cb1158c7d268b63de1468e28e2711b28d686e2628ddb22da2149cd93ddeafda\"},\"contracts/resolvers/Resolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"./profiles/IABIResolver.sol\\\";\\nimport \\\"./profiles/IAddressResolver.sol\\\";\\nimport \\\"./profiles/IAddrResolver.sol\\\";\\nimport \\\"./profiles/IContentHashResolver.sol\\\";\\nimport \\\"./profiles/IDNSRecordResolver.sol\\\";\\nimport \\\"./profiles/IDNSZoneResolver.sol\\\";\\nimport \\\"./profiles/IInterfaceResolver.sol\\\";\\nimport \\\"./profiles/INameResolver.sol\\\";\\nimport \\\"./profiles/IPubkeyResolver.sol\\\";\\nimport \\\"./profiles/ITextResolver.sol\\\";\\nimport \\\"./profiles/IExtendedResolver.sol\\\";\\n\\n/**\\n * A generic resolver interface which includes all the functions including the ones deprecated\\n */\\ninterface Resolver is\\n IERC165,\\n IABIResolver,\\n IAddressResolver,\\n IAddrResolver,\\n IContentHashResolver,\\n IDNSRecordResolver,\\n IDNSZoneResolver,\\n IInterfaceResolver,\\n INameResolver,\\n IPubkeyResolver,\\n ITextResolver,\\n IExtendedResolver\\n{\\n /* Deprecated events */\\n event ContentChanged(bytes32 indexed node, bytes32 hash);\\n\\n function setApprovalForAll(address, bool) external;\\n\\n function approve(bytes32 node, address delegate, bool approved) external;\\n\\n function isApprovedForAll(address account, address operator) external;\\n\\n function isApprovedFor(\\n address owner,\\n bytes32 node,\\n address delegate\\n ) external;\\n\\n function setABI(\\n bytes32 node,\\n uint256 contentType,\\n bytes calldata data\\n ) external;\\n\\n function setAddr(bytes32 node, address addr) external;\\n\\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\\n\\n function setContenthash(bytes32 node, bytes calldata hash) external;\\n\\n function setDnsrr(bytes32 node, bytes calldata data) external;\\n\\n function setName(bytes32 node, string calldata _name) external;\\n\\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\\n\\n function setText(\\n bytes32 node,\\n string calldata key,\\n string calldata value\\n ) external;\\n\\n function setInterface(\\n bytes32 node,\\n bytes4 interfaceID,\\n address implementer\\n ) external;\\n\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n function multicallWithNodeCheck(\\n bytes32 nodehash,\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n /* Deprecated functions */\\n function content(bytes32 node) external view returns (bytes32);\\n\\n function multihash(bytes32 node) external view returns (bytes memory);\\n\\n function setContent(bytes32 node, bytes32 hash) external;\\n\\n function setMultihash(bytes32 node, bytes calldata hash) external;\\n}\\n\",\"keccak256\":\"0xfc77ab6b7c59c3ebfe1c720bdebf9b08c2488ff7ac9501a9aa056c5d6d5b50c5\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IABIResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IABIResolver {\\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\\n\\n /**\\n * Returns the ABI associated with an ENS node.\\n * Defined in EIP205.\\n * @param node The ENS node to query\\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\\n * @return contentType The content type of the return value\\n * @return data The ABI data\\n */\\n function ABI(\\n bytes32 node,\\n uint256 contentTypes\\n ) external view returns (uint256, bytes memory);\\n}\\n\",\"keccak256\":\"0x85b373d02d19374fe570af407f459768285704bf7f30ab17c30eabfb5a10e4c3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddrResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the legacy (ETH-only) addr function.\\n */\\ninterface IAddrResolver {\\n event AddrChanged(bytes32 indexed node, address a);\\n\\n /**\\n * Returns the address associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated address.\\n */\\n function addr(bytes32 node) external view returns (address payable);\\n}\\n\",\"keccak256\":\"0x2ad7f2fc60ebe0f93745fe70247f6a854f66af732483fda2a3c5e055614445e8\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the new (multicoin) addr function.\\n */\\ninterface IAddressResolver {\\n event AddressChanged(\\n bytes32 indexed node,\\n uint256 coinType,\\n bytes newAddress\\n );\\n\\n function addr(\\n bytes32 node,\\n uint256 coinType\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x411447c1e90c51e09702815a85ec725ffbbe37cf96e8cc4d2a8bd4ad8a59d73e\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IContentHashResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IContentHashResolver {\\n event ContenthashChanged(bytes32 indexed node, bytes hash);\\n\\n /**\\n * Returns the contenthash associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function contenthash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xd95cd77684ba5752c428d7dceb4ecc6506ac94f4fbb910489637eb68dcd8e366\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSRecordResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSRecordResolver {\\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\\n event DNSRecordChanged(\\n bytes32 indexed node,\\n bytes name,\\n uint16 resource,\\n bytes record\\n );\\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\\n\\n /**\\n * Obtain a DNS record.\\n * @param node the namehash of the node for which to fetch the record\\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\\n * @return the DNS record in wire format if present, otherwise empty\\n */\\n function dnsRecord(\\n bytes32 node,\\n bytes32 name,\\n uint16 resource\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xcfa52200edd337f2c6c5bf402352600584da033b21323603e53de33051a3e25d\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSZoneResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSZoneResolver {\\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\\n event DNSZonehashChanged(\\n bytes32 indexed node,\\n bytes lastzonehash,\\n bytes zonehash\\n );\\n\\n /**\\n * zonehash obtains the hash for the zone.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function zonehash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xca1b3a16e7005533f2800a3e66fcdccf7c574deac7913d8c810f40aec1d58dc0\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IExtendedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IExtendedResolver {\\n function resolve(\\n bytes memory name,\\n bytes memory data\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IInterfaceResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IInterfaceResolver {\\n event InterfaceChanged(\\n bytes32 indexed node,\\n bytes4 indexed interfaceID,\\n address implementer\\n );\\n\\n /**\\n * Returns the address of a contract that implements the specified interface for this name.\\n * If an implementer has not been set for this interfaceID and name, the resolver will query\\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\\n * will be returned.\\n * @param node The ENS node to query.\\n * @param interfaceID The EIP 165 interface ID to check for.\\n * @return The address that implements this interface, or 0 if the interface is unsupported.\\n */\\n function interfaceImplementer(\\n bytes32 node,\\n bytes4 interfaceID\\n ) external view returns (address);\\n}\\n\",\"keccak256\":\"0x390321fb58f7b927df9562450981e74b4be3907e7c09df321fd3b7409b63ae28\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/INameResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface INameResolver {\\n event NameChanged(bytes32 indexed node, string name);\\n\\n /**\\n * Returns the name associated with an ENS node, for reverse records.\\n * Defined in EIP181.\\n * @param node The ENS node to query.\\n * @return The associated name.\\n */\\n function name(bytes32 node) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x9ec392b612447b1acbdc01114f2da2837a658d3f3157f60a99c5269f0b623346\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IPubkeyResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IPubkeyResolver {\\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\\n\\n /**\\n * Returns the SECP256k1 public key associated with an ENS node.\\n * Defined in EIP 619.\\n * @param node The ENS node to query\\n * @return x The X coordinate of the curve point for the public key.\\n * @return y The Y coordinate of the curve point for the public key.\\n */\\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\\n}\\n\",\"keccak256\":\"0x69748947093dd2fda9ddcebd0adf19a6d1e7600df1d4b1462a0417156caddca7\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/ITextResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface ITextResolver {\\n event TextChanged(\\n bytes32 indexed node,\\n string indexed indexedKey,\\n string key,\\n string value\\n );\\n\\n /**\\n * Returns the text data associated with an ENS node and key.\\n * @param node The ENS node to query.\\n * @param key The text data key to query.\\n * @return The associated text data.\\n */\\n function text(\\n bytes32 node,\\n string calldata key\\n ) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x7c5debb3c42cd9f5de2274ea7aa053f238608314b62db441c40e31cea2543fd5\",\"license\":\"MIT\"},\"contracts/utils/HexUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nlibrary HexUtils {\\n /**\\n * @dev Attempts to parse bytes32 from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexStringToBytes32(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (bytes32 r, bool valid) {\\n valid = true;\\n assembly {\\n // check that the index to read to is not past the end of the string\\n if gt(lastIdx, mload(str)) {\\n revert(0, 0)\\n }\\n\\n function getHex(c) -> ascii {\\n // chars 48-57: 0-9\\n if and(gt(c, 47), lt(c, 58)) {\\n ascii := sub(c, 48)\\n leave\\n }\\n // chars 65-70: A-F\\n if and(gt(c, 64), lt(c, 71)) {\\n ascii := add(sub(c, 65), 10)\\n leave\\n }\\n // chars 97-102: a-f\\n if and(gt(c, 96), lt(c, 103)) {\\n ascii := add(sub(c, 97), 10)\\n leave\\n }\\n // invalid char\\n ascii := 0xff\\n }\\n\\n let ptr := add(str, 32)\\n for {\\n let i := idx\\n } lt(i, lastIdx) {\\n i := add(i, 2)\\n } {\\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\\n // if either byte is invalid, set invalid and break loop\\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\\n valid := false\\n break\\n }\\n let combined := or(shl(4, byte1), byte2)\\n r := or(shl(8, r), combined)\\n }\\n }\\n }\\n\\n /**\\n * @dev Attempts to parse an address from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexToAddress(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (address, bool) {\\n if (lastIdx - idx < 40) return (address(0x0), false);\\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\\n return (address(uint160(uint256(r))), valid);\\n }\\n}\\n\",\"keccak256\":\"0xcae20ad72181f47dfe7fba7d88e8d902a01576b16e93362878e726989d6cfb4d\",\"license\":\"MIT\"},\"contracts/utils/LowLevelCallUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.13;\\n\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary LowLevelCallUtils {\\n using Address for address;\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data\\n ) internal view returns (bool success) {\\n require(\\n target.isContract(),\\n \\\"LowLevelCallUtils: static call to non-contract\\\"\\n );\\n assembly {\\n success := staticcall(\\n gas(),\\n target,\\n add(data, 32),\\n mload(data),\\n 0,\\n 0\\n )\\n }\\n }\\n\\n /**\\n * @dev Returns the size of the return data of the most recent external call.\\n */\\n function returnDataSize() internal pure returns (uint256 len) {\\n assembly {\\n len := returndatasize()\\n }\\n }\\n\\n /**\\n * @dev Reads return data from the most recent external call.\\n * @param offset Offset into the return data.\\n * @param length Number of bytes to return.\\n */\\n function readReturnData(\\n uint256 offset,\\n uint256 length\\n ) internal pure returns (bytes memory data) {\\n data = new bytes(length);\\n assembly {\\n returndatacopy(add(data, 32), offset, length)\\n }\\n }\\n\\n /**\\n * @dev Reverts with the return data from the most recent external call.\\n */\\n function propagateRevert() internal pure {\\n assembly {\\n returndatacopy(0, 0, returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x20d3d0d14fab6fc079f90d630a51bb8e274431ca929591ec8d62383ce946cb3a\",\"license\":\"MIT\"},\"contracts/utils/NameEncoder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\n\\nlibrary NameEncoder {\\n using BytesUtils for bytes;\\n\\n function dnsEncodeName(\\n string memory name\\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\\n uint8 labelLength = 0;\\n bytes memory bytesName = bytes(name);\\n uint256 length = bytesName.length;\\n dnsName = new bytes(length + 2);\\n node = 0;\\n if (length == 0) {\\n dnsName[0] = 0;\\n return (dnsName, node);\\n }\\n\\n // use unchecked to save gas since we check for an underflow\\n // and we check for the length before the loop\\n unchecked {\\n for (uint256 i = length - 1; i >= 0; i--) {\\n if (bytesName[i] == \\\".\\\") {\\n dnsName[i + 1] = bytes1(labelLength);\\n node = keccak256(\\n abi.encodePacked(\\n node,\\n bytesName.keccak(i + 1, labelLength)\\n )\\n );\\n labelLength = 0;\\n } else {\\n labelLength += 1;\\n dnsName[i + 1] = bytesName[i];\\n }\\n if (i == 0) {\\n break;\\n }\\n }\\n }\\n\\n node = keccak256(\\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\\n );\\n\\n dnsName[0] = bytes1(labelLength);\\n return (dnsName, node);\\n }\\n}\\n\",\"keccak256\":\"0x63fd5f360cef8c9b8b8cfdff20d3f0e955b4c8ac7dfac758788223c61678aad1\",\"license\":\"MIT\"},\"contracts/utils/UniversalResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.17 <0.9.0;\\n\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\nimport {Ownable} from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {LowLevelCallUtils} from \\\"./LowLevelCallUtils.sol\\\";\\nimport {ENS} from \\\"../registry/ENS.sol\\\";\\nimport {IExtendedResolver} from \\\"../resolvers/profiles/IExtendedResolver.sol\\\";\\nimport {Resolver, INameResolver, IAddrResolver} from \\\"../resolvers/Resolver.sol\\\";\\nimport {NameEncoder} from \\\"./NameEncoder.sol\\\";\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\nimport {HexUtils} from \\\"./HexUtils.sol\\\";\\n\\nerror OffchainLookup(\\n address sender,\\n string[] urls,\\n bytes callData,\\n bytes4 callbackFunction,\\n bytes extraData\\n);\\n\\nerror ResolverNotFound();\\n\\nerror ResolverWildcardNotSupported();\\n\\nstruct MulticallData {\\n bytes name;\\n bytes[] data;\\n string[] gateways;\\n bytes4 callbackFunction;\\n bool isWildcard;\\n address resolver;\\n bytes metaData;\\n bool[] failures;\\n}\\n\\nstruct OffchainLookupCallData {\\n address sender;\\n string[] urls;\\n bytes callData;\\n}\\n\\nstruct OffchainLookupExtraData {\\n bytes4 callbackFunction;\\n bytes data;\\n}\\n\\ninterface BatchGateway {\\n function query(\\n OffchainLookupCallData[] memory data\\n ) external returns (bool[] memory failures, bytes[] memory responses);\\n}\\n\\n/**\\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\\n * making it possible to make a single smart contract call to resolve an ENS name.\\n */\\ncontract UniversalResolver is ERC165, Ownable {\\n using Address for address;\\n using NameEncoder for string;\\n using BytesUtils for bytes;\\n using HexUtils for bytes;\\n\\n string[] public batchGatewayURLs;\\n ENS public immutable registry;\\n\\n constructor(address _registry, string[] memory _urls) {\\n registry = ENS(_registry);\\n batchGatewayURLs = _urls;\\n }\\n\\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\\n batchGatewayURLs = _urls;\\n }\\n\\n /**\\n * @dev Performs ENS name resolution for the supplied name and resolution data.\\n * @param name The name to resolve, in normalised and DNS-encoded form.\\n * @param data The resolution data, as specified in ENSIP-10.\\n * @return The result of resolving the name.\\n */\\n function resolve(\\n bytes calldata name,\\n bytes memory data\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n batchGatewayURLs,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data\\n ) external view returns (bytes[] memory, address) {\\n return resolve(name, data, batchGatewayURLs);\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n gateways,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways\\n ) public view returns (bytes[] memory, address) {\\n return\\n _resolve(name, data, gateways, this.resolveCallback.selector, \\\"\\\");\\n }\\n\\n function _resolveSingle(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) public view returns (bytes memory, address) {\\n bytes[] memory dataArr = new bytes[](1);\\n dataArr[0] = data;\\n (bytes[] memory results, address resolver) = _resolve(\\n name,\\n dataArr,\\n gateways,\\n callbackFunction,\\n metaData\\n );\\n return (results[0], resolver);\\n }\\n\\n function _resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) internal view returns (bytes[] memory results, address resolverAddress) {\\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\\n resolverAddress = address(resolver);\\n if (resolverAddress == address(0)) {\\n revert ResolverNotFound();\\n }\\n\\n bool isWildcard = finalOffset != 0;\\n\\n results = _multicall(\\n MulticallData(\\n name,\\n data,\\n gateways,\\n callbackFunction,\\n isWildcard,\\n resolverAddress,\\n metaData,\\n new bool[](data.length)\\n )\\n );\\n }\\n\\n function reverse(\\n bytes calldata reverseName\\n ) external view returns (string memory, address, address, address) {\\n return reverse(reverseName, batchGatewayURLs);\\n }\\n\\n /**\\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\\n */\\n function reverse(\\n bytes calldata reverseName,\\n string[] memory gateways\\n ) public view returns (string memory, address, address, address) {\\n bytes memory encodedCall = abi.encodeCall(\\n INameResolver.name,\\n reverseName.namehash(0)\\n );\\n (\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress\\n ) = _resolveSingle(\\n reverseName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n \\\"\\\"\\n );\\n\\n return\\n getForwardDataFromReverse(\\n resolvedReverseData,\\n reverseResolverAddress,\\n gateways\\n );\\n }\\n\\n function getForwardDataFromReverse(\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress,\\n string[] memory gateways\\n ) internal view returns (string memory, address, address, address) {\\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\\n\\n (bytes memory encodedName, bytes32 namehash) = resolvedName\\n .dnsEncodeName();\\n\\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\\n bytes memory metaData = abi.encode(\\n resolvedName,\\n reverseResolverAddress\\n );\\n (bytes memory resolvedData, address resolverAddress) = this\\n ._resolveSingle(\\n encodedName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n metaData\\n );\\n\\n address resolvedAddress = abi.decode(resolvedData, (address));\\n\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n function resolveSingleCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes memory, address) {\\n (bytes[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveSingleCallback.selector\\n );\\n return (results[0], resolver);\\n }\\n\\n function resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes[] memory, address) {\\n (bytes[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveCallback.selector\\n );\\n return (results, resolver);\\n }\\n\\n function reverseCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (string memory, address, address, address) {\\n (\\n bytes[] memory resolvedData,\\n address resolverAddress,\\n string[] memory gateways,\\n bytes memory metaData\\n ) = _resolveCallback(\\n response,\\n extraData,\\n this.reverseCallback.selector\\n );\\n\\n if (metaData.length > 0) {\\n (string memory resolvedName, address reverseResolverAddress) = abi\\n .decode(metaData, (string, address));\\n address resolvedAddress = abi.decode(resolvedData[0], (address));\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n return\\n getForwardDataFromReverse(\\n resolvedData[0],\\n resolverAddress,\\n gateways\\n );\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return\\n interfaceId == type(IExtendedResolver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n function _resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData,\\n bytes4 callbackFunction\\n )\\n internal\\n view\\n returns (bytes[] memory, address, string[] memory, bytes memory)\\n {\\n MulticallData memory multicallData;\\n multicallData.callbackFunction = callbackFunction;\\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\\n response,\\n (bool[], bytes[])\\n );\\n OffchainLookupExtraData[] memory extraDatas;\\n (\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n ) = abi.decode(\\n extraData,\\n (bool, address, string[], bytes, OffchainLookupExtraData[])\\n );\\n require(responses.length <= extraDatas.length);\\n multicallData.data = new bytes[](extraDatas.length);\\n multicallData.failures = new bool[](extraDatas.length);\\n uint256 offchainCount = 0;\\n for (uint256 i = 0; i < extraDatas.length; i++) {\\n if (extraDatas[i].callbackFunction == bytes4(0)) {\\n // This call did not require an offchain lookup; use the previous input data.\\n multicallData.data[i] = extraDatas[i].data;\\n } else {\\n if (failures[offchainCount]) {\\n multicallData.failures[i] = true;\\n multicallData.data[i] = responses[offchainCount];\\n } else {\\n multicallData.data[i] = abi.encodeWithSelector(\\n extraDatas[i].callbackFunction,\\n responses[offchainCount],\\n extraDatas[i].data\\n );\\n }\\n offchainCount = offchainCount + 1;\\n }\\n }\\n\\n return (\\n _multicall(multicallData),\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData\\n );\\n }\\n\\n /**\\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\\n * the error with the data necessary to continue the request where it left off.\\n * @param target The address to call.\\n * @param data The data to call `target` with.\\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\\n * @return result Whether the call succeeded.\\n */\\n function callWithOffchainLookupPropagation(\\n address target,\\n bytes memory data\\n )\\n internal\\n view\\n returns (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool result\\n )\\n {\\n result = LowLevelCallUtils.functionStaticCall(address(target), data);\\n uint256 size = LowLevelCallUtils.returnDataSize();\\n\\n if (result) {\\n return (\\n false,\\n LowLevelCallUtils.readReturnData(0, size),\\n extraData,\\n true\\n );\\n }\\n\\n // Failure\\n if (size >= 4) {\\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\\n // Offchain lookup. Decode the revert message and create our own that nests it.\\n bytes memory revertData = LowLevelCallUtils.readReturnData(\\n 4,\\n size - 4\\n );\\n if (bytes4(errorId) == OffchainLookup.selector) {\\n (\\n address wrappedSender,\\n string[] memory wrappedUrls,\\n bytes memory wrappedCallData,\\n bytes4 wrappedCallbackFunction,\\n bytes memory wrappedExtraData\\n ) = abi.decode(\\n revertData,\\n (address, string[], bytes, bytes4, bytes)\\n );\\n if (wrappedSender == target) {\\n returnData = abi.encode(\\n OffchainLookupCallData(\\n wrappedSender,\\n wrappedUrls,\\n wrappedCallData\\n )\\n );\\n extraData = OffchainLookupExtraData(\\n wrappedCallbackFunction,\\n wrappedExtraData\\n );\\n return (true, returnData, extraData, false);\\n }\\n } else {\\n returnData = bytes.concat(errorId, revertData);\\n return (false, returnData, extraData, false);\\n }\\n }\\n }\\n\\n /**\\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\\n * removing labels until it finds a result.\\n * @param name The name to resolve, in DNS-encoded and normalised form.\\n * @return resolver The Resolver responsible for this name.\\n * @return namehash The namehash of the full name.\\n * @return finalOffset The offset of the first label with a resolver.\\n */\\n function findResolver(\\n bytes calldata name\\n ) public view returns (Resolver, bytes32, uint256) {\\n (\\n address resolver,\\n bytes32 namehash,\\n uint256 finalOffset\\n ) = findResolver(name, 0);\\n return (Resolver(resolver), namehash, finalOffset);\\n }\\n\\n function findResolver(\\n bytes calldata name,\\n uint256 offset\\n ) internal view returns (address, bytes32, uint256) {\\n uint256 labelLength = uint256(uint8(name[offset]));\\n if (labelLength == 0) {\\n return (address(0), bytes32(0), offset);\\n }\\n uint256 nextLabel = offset + labelLength + 1;\\n bytes32 labelHash;\\n if (\\n labelLength == 66 &&\\n // 0x5b == '['\\n name[offset + 1] == 0x5b &&\\n // 0x5d == ']'\\n name[nextLabel - 1] == 0x5d\\n ) {\\n // Encrypted label\\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\\n .hexStringToBytes32(0, 64);\\n } else {\\n labelHash = keccak256(name[offset + 1:nextLabel]);\\n }\\n (\\n address parentresolver,\\n bytes32 parentnode,\\n uint256 parentoffset\\n ) = findResolver(name, nextLabel);\\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\\n address resolver = registry.resolver(node);\\n if (resolver != address(0)) {\\n return (resolver, node, offset);\\n }\\n return (parentresolver, node, parentoffset);\\n }\\n\\n function _hasExtendedResolver(\\n address resolver\\n ) internal view returns (bool) {\\n try\\n Resolver(resolver).supportsInterface{gas: 50000}(\\n type(IExtendedResolver).interfaceId\\n )\\n returns (bool supported) {\\n return supported;\\n } catch {\\n return false;\\n }\\n }\\n\\n function _multicall(\\n MulticallData memory multicallData\\n ) internal view returns (bytes[] memory results) {\\n uint256 length = multicallData.data.length;\\n uint256 offchainCount = 0;\\n OffchainLookupCallData[]\\n memory callDatas = new OffchainLookupCallData[](length);\\n OffchainLookupExtraData[]\\n memory extraDatas = new OffchainLookupExtraData[](length);\\n results = new bytes[](length);\\n bool isCallback = multicallData.name.length == 0;\\n bool hasExtendedResolver = _hasExtendedResolver(multicallData.resolver);\\n\\n if (multicallData.isWildcard && !hasExtendedResolver) {\\n revert ResolverWildcardNotSupported();\\n }\\n\\n for (uint256 i = 0; i < length; i++) {\\n bytes memory item = multicallData.data[i];\\n bool failure = multicallData.failures[i];\\n if (failure) {\\n results[i] = item;\\n continue;\\n }\\n if (!isCallback && hasExtendedResolver) {\\n item = abi.encodeCall(\\n IExtendedResolver.resolve,\\n (multicallData.name, item)\\n );\\n }\\n (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool success\\n ) = callWithOffchainLookupPropagation(multicallData.resolver, item);\\n\\n if (offchain) {\\n callDatas[offchainCount] = abi.decode(\\n returnData,\\n (OffchainLookupCallData)\\n );\\n extraDatas[i] = extraData;\\n offchainCount += 1;\\n continue;\\n }\\n\\n if (success && hasExtendedResolver) {\\n // if this is a successful resolve() call, unwrap the result\\n returnData = abi.decode(returnData, (bytes));\\n }\\n results[i] = returnData;\\n extraDatas[i].data = multicallData.data[i];\\n }\\n\\n if (offchainCount == 0) {\\n return results;\\n }\\n\\n // Trim callDatas if offchain data exists\\n assembly {\\n mstore(callDatas, offchainCount)\\n }\\n\\n revert OffchainLookup(\\n address(this),\\n multicallData.gateways,\\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\\n multicallData.callbackFunction,\\n abi.encode(\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xb91e19ba33c86f8e65706383463a529dcc2997665782ac462a1fd9d03982b5c5\",\"license\":\"MIT\"},\"contracts/wrapper/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ~0.8.17;\\n\\nlibrary BytesUtils {\\n /*\\n * @dev Returns the keccak-256 hash of a byte range.\\n * @param self The byte string to hash.\\n * @param offset The position to start hashing at.\\n * @param len The number of bytes to hash.\\n * @return The hash of the byte range.\\n */\\n function keccak(\\n bytes memory self,\\n uint256 offset,\\n uint256 len\\n ) internal pure returns (bytes32 ret) {\\n require(offset + len <= self.length);\\n assembly {\\n ret := keccak256(add(add(self, 32), offset), len)\\n }\\n }\\n\\n /**\\n * @dev Returns the ENS namehash of a DNS-encoded name.\\n * @param self The DNS-encoded name to hash.\\n * @param offset The offset at which to start hashing.\\n * @return The namehash of the name.\\n */\\n function namehash(\\n bytes memory self,\\n uint256 offset\\n ) internal pure returns (bytes32) {\\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\\n if (labelhash == bytes32(0)) {\\n require(offset == self.length - 1, \\\"namehash: Junk at end of name\\\");\\n return bytes32(0);\\n }\\n return\\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\\n }\\n\\n /**\\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\\n * @param self The byte string to read a label from.\\n * @param idx The index to read a label at.\\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\\n * @return newIdx The index of the start of the next label.\\n */\\n function readLabel(\\n bytes memory self,\\n uint256 idx\\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\\n require(idx < self.length, \\\"readLabel: Index out of bounds\\\");\\n uint256 len = uint256(uint8(self[idx]));\\n if (len > 0) {\\n labelhash = keccak(self, idx + 1, len);\\n } else {\\n labelhash = bytes32(0);\\n }\\n newIdx = idx + len + 1;\\n }\\n}\\n\",\"keccak256\":\"0xf862cd86d749158a554e3cb517efa9097331ec0cf7225117f21e96fb50c67edb\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162003880380380620038808339810160408190526200003491620001da565b6200003f336200006a565b6001600160a01b038216608052805162000061906001906020840190620000ba565b5050506200049c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000105579160200282015b82811115620001055782518290620000f49082620003d0565b5091602001919060010190620000db565b506200011392915062000117565b5090565b80821115620001135760006200012e828262000138565b5060010162000117565b508054620001469062000341565b6000825580601f1062000157575050565b601f0160209004906000526020600020908101906200017791906200017a565b50565b5b808211156200011357600081556001016200017b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001d257620001d262000191565b604052919050565b6000806040808486031215620001ef57600080fd5b83516001600160a01b03811681146200020757600080fd5b602085810151919450906001600160401b03808211156200022757600080fd5b8187019150601f88818401126200023d57600080fd5b82518281111562000252576200025262000191565b8060051b62000263868201620001a7565b918252848101860191868101908c8411156200027e57600080fd5b87870192505b838310156200032e578251868111156200029e5760008081fd5b8701603f81018e13620002b15760008081fd5b8881015187811115620002c857620002c862000191565b620002db818801601f19168b01620001a7565b8181528f8c838501011115620002f15760008081fd5b60005b8281101562000311578381018d01518282018d01528b01620002f4565b5060009181018b0191909152835250918701919087019062000284565b8099505050505050505050509250929050565b600181811c908216806200035657607f821691505b6020821081036200037757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003cb57600081815260208120601f850160051c81016020861015620003a65750805b601f850160051c820191505b81811015620003c757828155600101620003b2565b5050505b505050565b81516001600160401b03811115620003ec57620003ec62000191565b6200040481620003fd845462000341565b846200037d565b602080601f8311600181146200043c5760008415620004235750858301515b600019600386901b1c1916600185901b178555620003c7565b600085815260208120601f198616915b828110156200046d578886015182559484019460019091019084016200044c565b50858210156200048c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516133c1620004bf600039600081816101ea015261141901526133c16000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612170565b610325565b60405190151581526020015b60405180910390f35b610176610171366004612397565b61035c565b60405161015a929190612475565b610197610192366004612520565b610391565b60405161015a929190612589565b6101b86101b33660046125fe565b61047e565b60405161015a949392919061266a565b6101d061054b565b005b6101976101e03660046126a6565b61055f565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b610176610243366004612705565b610587565b6101d06102563660046127cb565b61061c565b610176610269366004612808565b61063b565b61028161027c366004612867565b610734565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b43660046128a9565b61075a565b60405161015a91906128c2565b6101b86102d43660046128d5565b610806565b6101976102e73660046125fe565b6108f7565b6101766102fa3660046125fe565b61093b565b6101b861030d366004612867565b61099f565b6101d0610320366004612949565b610a94565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b60405180602001604052806000815250610587565b9150915094509492505050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156104695783829060005260206000200180546103dc90612966565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612966565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050815260200190600101906103bd565b5050505061055f565b91509150935093915050565b6060600080808080808061049c8c8c8c8c636dc4fb7360e01b610b29565b935093509350935060008151111561050e57600080828060200190518101906104c591906129e5565b915091506000866000815181106104de576104de612a37565b60200260200101518060200190518101906104f99190612a4d565b929a5091985096509294506105409350505050565b6105338460008151811061052457610524612a37565b60200260200101518484610eaf565b9750975097509750505050505b945094509450949050565b610553611010565b61055d600061106a565b565b606060006103848686868663b4a8580160e01b604051806020016040528060008152506110d2565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105a357905050905086816000815181106105ce576105ce612a37565b60200260200101819052506000806105ea8b8b858b8b8b6110d2565b915091508160008151811061060157610601612a37565b60200260200101518194509450505050965096945050505050565b610624611010565b805161063790600190602084019061209d565b5050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b8282101561071357838290600052602060002001805461068690612966565b80601f01602080910402602001604051908101604052809291908181526020018280546106b290612966565b80156106ff5780601f106106d4576101008083540402835291602001916106ff565b820191906000526020600020905b8154815290600101906020018083116106e257829003601f168201915b505050505081526020019060010190610667565b5050505063e0a8541260e01b60405180602001604052806000815250610587565b60008060008060008061074988886000611212565b919750955093505050509250925092565b6001818154811061076a57600080fd5b90600052602060002001600091509050805461078590612966565b80601f01602080910402602001604051908101604052809291908181526020018280546107b190612966565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505050505081565b6060600080600080610852600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114c09050565b60405160240161086491815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f3431000000000000000000000000000000000000000000000000000000001790528151908101909152600080825291925081906108d4908b908b9086908c90636dc4fb7360e01b90610587565b915091506108e382828a610eaf565b965096509650965050505093509350935093565b60606000808061092a888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b29565b50919a909950975050505050505050565b60606000808061096e888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b29565b5050915091508160008151811061098757610987612a37565b60200260200101518193509350505094509492505050565b60606000806000610a8286866001805480602002602001604051908101604052809291908181526020016000905b82821015610a795783829060005260206000200180546109ec90612966565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1890612966565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050815260200190600101906109cd565b50505050610806565b93509350935093505b92959194509250565b610a9c611010565b6001600160a01b038116610b1d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610b268161106a565b50565b60606000606080610b8d60405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610bac8b8d018d612a78565b90925090506060610bbf8a8c018c612b30565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610bf957600080fd5b805167ffffffffffffffff811115610c1357610c136121dd565b604051908082528060200260200182016040528015610c4657816020015b6060815260200190600190039081610c315790505b506020850152805167ffffffffffffffff811115610c6657610c666121dd565b604051908082528060200260200182016040528015610c8f578160200160208202803683370190505b5060e08501526000805b8251811015610e7d578251600090849083908110610cb957610cb9612a37565b6020026020010151600001516001600160e01b03191603610d1857828181518110610ce657610ce6612a37565b60200260200101516020015186602001518281518110610d0857610d08612a37565b6020026020010181905250610e6b565b848281518110610d2a57610d2a612a37565b602002602001015115610da15760018660e001518281518110610d4f57610d4f612a37565b602002602001019015159081151581525050838281518110610d7357610d73612a37565b602002602001015186602001518281518110610d9157610d91612a37565b6020026020010181905250610e5d565b828181518110610db357610db3612a37565b602002602001015160000151848381518110610dd157610dd1612a37565b6020026020010151848381518110610deb57610deb612a37565b602002602001015160200151604051602401610e08929190612cb4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e5157610e51612a37565b60200260200101819052505b610e68826001612cf8565b91505b80610e7581612d0b565b915050610c99565b50610e878561157f565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610ecb9190612d24565b9050600080610ed9836119c9565b91509150600081604051602401610ef291815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f4c9187918e9101612475565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610f9b959493929190612db1565b600060405180830381865afa158015610fb8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe091908101906129e5565b91509150600082806020019051810190610ffa9190612a4d565b979f979e50909b50959950505050505050505050565b6000546001600160a01b0316331461055d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b14565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008060006110e38a8a610734565b919450849350909150506001600160a01b03821661112d576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b815283151592611202929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff8111156111d1576111d16121dd565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b50905261157f565b9450505050965096945050505050565b60008060008086868681811061122a5761122a612a37565b919091013560f81c915050600081900361124e5750600092508291508390506114b7565b600061125a8287612cf8565b611265906001612cf8565b905060008260421480156112ab57508888611281896001612cf8565b81811061129057611290612a37565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156112e9575088886112bf600185612e1a565b8181106112ce576112ce612a37565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561136157611359600060408b8b6113028c6002612cf8565b9061130e600189612e1a565b9261131b93929190612e2d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611bf29050565b509050611393565b888861136e896001612cf8565b61137a92859290612e2d565b604051611388929190612e57565b604051809103902090505b60008060006113a38c8c87611212565b925092509250600082856040516020016113c7929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612a4d565b90506001600160a01b038116156114a857995097508996506114b795505050505050565b50929850919650909450505050505b93509350939050565b60008060006114cf8585611cc3565b90925090508161154157600185516114e79190612e1a565b84146115355760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d650000006044820152606401610b14565b50600091506103569050565b61154b85826114c0565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156115a4576115a46121dd565b60405190808252806020026020018201604052801561160257816020015b6115ef604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816115c25790505b50905060008367ffffffffffffffff811115611620576116206121dd565b60405190808252806020026020018201604052801561166657816020015b60408051808201909152600081526060602082015281526020019060019003908161163e5790505b5090508367ffffffffffffffff811115611682576116826121dd565b6040519080825280602002602001820160405280156116b557816020015b60608152602001906001900390816116a05790505b5086515160a088015191965015906000906116cf90611d7a565b9050876080015180156116e0575080155b15611717576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b868110156119075760008960200151828151811061173a5761173a612a37565b6020026020010151905060008a60e00151838151811061175c5761175c612a37565b60200260200101519050801561179157818a848151811061177f5761177f612a37565b602002602001018190525050506118f5565b8415801561179c5750835b156117e2578a516040516117b591908490602401612cb4565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b17905291505b6000806000806117f68f60a0015187611df5565b9350935093509350831561186b57828060200190518101906118189190612ee7565b8b8d8151811061182a5761182a612a37565b6020026020010181905250818a888151811061184857611848612a37565b602090810291909101015261185e60018d612cf8565b9b505050505050506118f5565b8080156118755750875b15611891578280602001905181019061188e9190612d24565b92505b828e88815181106118a4576118a4612a37565b60200260200101819052508e6020015187815181106118c5576118c5612a37565b60200260200101518a88815181106118df576118df612a37565b6020026020010151602001819052505050505050505b806118ff81612d0b565b91505061171a565b508460000361191b57505050505050919050565b84845230886040015163a780bab660e01b8660405160240161193d9190612fe2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050508a606001518b608001518c60a001518d604001518e60c001518a60405160200161199e959493929190613044565b60408051601f1981840301815290829052630556f18360e41b8252610b149594939291600401613101565b8051606090600090819084906119e0816002612cf8565b67ffffffffffffffff8111156119f8576119f86121dd565b6040519080825280601f01601f191660200182016040528015611a22576020820181803683370190505b50945060009350808403611a6757600060f81b85600081518110611a4857611a48612a37565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611a7f57611a7f612a37565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611b41578360f81b868260010181518110611ae557611ae5612a37565b60200101906001600160f81b031916908160001a90535084611b0e846001840160ff8816611f92565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611b91565b600184019350828181518110611b5957611b59612a37565b602001015160f81c60f81b868260010181518110611b7957611b79612a37565b60200101906001600160f81b031916908160001a9053505b8015611ba05760001901611a6d565b5083611bb183600060ff8716611f92565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611a4857611a48612a37565b8251600090600190831115611c0657600080fd5b611c57565b6000603a8210602f83111615611c235750602f190190565b60478210604083111615611c3957506036190190565b60678210606083111615611c4f57506056190190565b5060ff919050565b60208501845b84811015611cb957611c748183015160001a611c0b565b611c866001830184015160001a611c0b565b60ff811460ff83141715611c9f57600094505050611cb9565b60049190911b1760089490941b9390931792600201611c5d565b5050935093915050565b60008083518310611d165760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e647300006044820152606401610b14565b6000848481518110611d2a57611d2a612a37565b016020015160f81c90508015611d5657611d4f85611d49866001612cf8565b83611f92565b9250611d5b565b600092505b611d658185612cf8565b611d70906001612cf8565b9150509250929050565b6040516301ffc9a760e01b8152639061b92360e01b60048201526000906001600160a01b038316906301ffc9a79061c350906024016020604051808303818786fa93505050508015611de9575060408051601f3d908101601f19168201909252611de691810190613135565b60015b61035657506000919050565b60408051808201909152600080825260606020830181905290916000611e1b8686611fb6565b90503d8115611e41576000611e31600083612048565b909550935060019150610a8b9050565b60048110611f88576000611e5760006004612048565b90506000611e6f6004611e6a8186612e1a565b612048565b9050630556f18360e41b611e8283613152565b6001600160e01b03191603611f5057600080600080600085806020019051810190611ead919061318a565b945094509450945094508d6001600160a01b0316856001600160a01b031603611f46576040518060600160405280866001600160a01b0316815260200185815260200184815250604051602001611f04919061323a565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b50909950975060009650610a8b95505050505050565b5050505050611f85565b8181604051602001611f6392919061324d565b60408051601f19818403018152919052600097509550869350610a8b92505050565b50505b5092959194509250565b8251600090611fa18385612cf8565b1115611fac57600080fd5b5091016020012090565b60006001600160a01b0383163b6120355760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e74726163740000000000000000000000000000000000006064820152608401610b14565b600080835160208501865afa9392505050565b60608167ffffffffffffffff811115612063576120636121dd565b6040519080825280601f01601f19166020018201604052801561208d576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156120e3579160200282015b828111156120e357825182906120d390826132cb565b50916020019190600101906120bd565b506120ef9291506120f3565b5090565b808211156120ef5760006121078282612110565b506001016120f3565b50805461211c90612966565b6000825580601f1061212c575050565b601f016020900490600052602060002090810190610b2691905b808211156120ef5760008155600101612146565b6001600160e01b031981168114610b2657600080fd5b60006020828403121561218257600080fd5b813561218d8161215a565b9392505050565b60008083601f8401126121a657600080fd5b50813567ffffffffffffffff8111156121be57600080fd5b6020830191508360208285010111156121d657600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612216576122166121dd565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612245576122456121dd565b604052919050565b600067ffffffffffffffff821115612267576122676121dd565b50601f01601f191660200190565b60006122886122838461224d565b61221c565b905082815283838301111561229c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126122c457600080fd5b61218d83833560208501612275565b600067ffffffffffffffff8211156122ed576122ed6121dd565b5060051b60200190565b600082601f83011261230857600080fd5b81356020612318612283836122d3565b82815260059290921b8401810191818101908684111561233757600080fd5b8286015b8481101561238c57803567ffffffffffffffff81111561235b5760008081fd5b8701603f8101891361236d5760008081fd5b61237e898683013560408401612275565b84525091830191830161233b565b509695505050505050565b600080600080606085870312156123ad57600080fd5b843567ffffffffffffffff808211156123c557600080fd5b6123d188838901612194565b909650945060208701359150808211156123ea57600080fd5b6123f6888389016122b3565b9350604087013591508082111561240c57600080fd5b50612419878288016122f7565b91505092959194509250565b60005b83811015612440578181015183820152602001612428565b50506000910152565b60008151808452612461816020860160208601612425565b601f01601f19169290920160200192915050565b6040815260006124886040830185612449565b90506001600160a01b03831660208301529392505050565b600082601f8301126124b157600080fd5b813560206124c1612283836122d3565b82815260059290921b840181019181810190868411156124e057600080fd5b8286015b8481101561238c57803567ffffffffffffffff8111156125045760008081fd5b6125128986838b01016122b3565b8452509183019183016124e4565b60008060006040848603121561253557600080fd5b833567ffffffffffffffff8082111561254d57600080fd5b61255987838801612194565b9095509350602086013591508082111561257257600080fd5b5061257f868287016124a0565b9150509250925092565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156125e057605f198887030185526125ce868351612449565b955093820193908201906001016125b2565b50508394506001600160a01b03871681870152505050509392505050565b6000806000806040858703121561261457600080fd5b843567ffffffffffffffff8082111561262c57600080fd5b61263888838901612194565b9096509450602087013591508082111561265157600080fd5b5061265e87828801612194565b95989497509550505050565b60808152600061267d6080830187612449565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156126bc57600080fd5b843567ffffffffffffffff808211156126d457600080fd5b6126e088838901612194565b909650945060208701359150808211156126f957600080fd5b6123f6888389016124a0565b60008060008060008060a0878903121561271e57600080fd5b863567ffffffffffffffff8082111561273657600080fd5b6127428a838b01612194565b9098509650602089013591508082111561275b57600080fd5b6127678a838b016122b3565b9550604089013591508082111561277d57600080fd5b6127898a838b016122f7565b94506060890135915061279b8261215a565b909250608088013590808211156127b157600080fd5b506127be89828a016122b3565b9150509295509295509295565b6000602082840312156127dd57600080fd5b813567ffffffffffffffff8111156127f457600080fd5b612800848285016122f7565b949350505050565b60008060006040848603121561281d57600080fd5b833567ffffffffffffffff8082111561283557600080fd5b61284187838801612194565b9095509350602086013591508082111561285a57600080fd5b5061257f868287016122b3565b6000806020838503121561287a57600080fd5b823567ffffffffffffffff81111561289157600080fd5b61289d85828601612194565b90969095509350505050565b6000602082840312156128bb57600080fd5b5035919050565b60208152600061218d6020830184612449565b6000806000604084860312156128ea57600080fd5b833567ffffffffffffffff8082111561290257600080fd5b61290e87838801612194565b9095509350602086013591508082111561292757600080fd5b5061257f868287016122f7565b6001600160a01b0381168114610b2657600080fd5b60006020828403121561295b57600080fd5b813561218d81612934565b600181811c9082168061297a57607f821691505b60208210810361299a57634e487b7160e01b600052602260045260246000fd5b50919050565b600082601f8301126129b157600080fd5b81516129bf6122838261224d565b8181528460208386010111156129d457600080fd5b612800826020830160208701612425565b600080604083850312156129f857600080fd5b825167ffffffffffffffff811115612a0f57600080fd5b612a1b858286016129a0565b9250506020830151612a2c81612934565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a5f57600080fd5b815161218d81612934565b8015158114610b2657600080fd5b60008060408385031215612a8b57600080fd5b823567ffffffffffffffff80821115612aa357600080fd5b818501915085601f830112612ab757600080fd5b81356020612ac7612283836122d3565b82815260059290921b84018101918181019089841115612ae657600080fd5b948201945b83861015612b0d578535612afe81612a6a565b82529482019490820190612aeb565b96505086013592505080821115612b2357600080fd5b50611d70858286016124a0565b600080600080600060a08688031215612b4857600080fd5b612b528635612a6a565b85359450612b636020870135612934565b6020860135935067ffffffffffffffff8060408801351115612b8457600080fd5b612b9488604089013589016122f7565b93508060608801351115612ba757600080fd5b612bb788606089013589016122b3565b92508060808801351115612bca57600080fd5b6080870135870188601f820112612be057600080fd5b612bed61228382356122d3565b81358082526020808301929160051b8401018b1015612c0b57600080fd5b602083015b6020843560051b850101811015612ca2578481351115612c2f57600080fd5b803584016040818e03601f19011215612c4757600080fd5b612c4f6121f3565b612c5c602083013561215a565b602082013581528660408301351115612c7457600080fd5b612c878e602060408501358501016122b3565b60208201528085525050602083019250602081019050612c10565b50809450505050509295509295909350565b604081526000612cc76040830185612449565b8281036020840152612cd98185612449565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612ce2565b600060018201612d1d57612d1d612ce2565b5060010190565b600060208284031215612d3657600080fd5b815167ffffffffffffffff811115612d4d57600080fd5b612800848285016129a0565b600082825180855260208086019550808260051b84010181860160005b84811015612da457601f19868403018952612d92838351612449565b98840198925090830190600101612d76565b5090979650505050505050565b60a081526000612dc460a0830188612449565b8281036020840152612dd68188612449565b90508281036040840152612dea8187612d59565b90506001600160e01b0319851660608401528281036080840152612e0e8185612449565b98975050505050505050565b8181038181111561035657610356612ce2565b60008085851115612e3d57600080fd5b83861115612e4a57600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f830112612e7857600080fd5b81516020612e88612283836122d3565b82815260059290921b84018101918181019086841115612ea757600080fd5b8286015b8481101561238c57805167ffffffffffffffff811115612ecb5760008081fd5b612ed98986838b01016129a0565b845250918301918301612eab565b600060208284031215612ef957600080fd5b815167ffffffffffffffff80821115612f1157600080fd5b9083019060608286031215612f2557600080fd5b604051606081018181108382111715612f4057612f406121dd565b6040528251612f4e81612934565b8152602083015182811115612f6257600080fd5b612f6e87828601612e67565b602083015250604083015182811115612f8657600080fd5b612f92878286016129a0565b60408301525095945050505050565b6001600160a01b0381511682526000602082015160606020850152612fc96060850182612d59565b905060408301518482036040860152612cd98282612449565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561303757603f19888603018452613025858351612fa1565b94509285019290850190600101613009565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261307060a0850188612d59565b84810360608601526130828188612449565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156130ee57858303601f19018552815180516001600160e01b03191684528801518884018890526130db88850182612449565b95890195935050908701906001016130a5565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061312360a0830187612d59565b8281036040840152612dea8187612449565b60006020828403121561314757600080fd5b815161218d81612a6a565b6000815160208301516001600160e01b0319808216935060048310156131825780818460040360031b1b83161693505b505050919050565b600080600080600060a086880312156131a257600080fd5b85516131ad81612934565b602087015190955067ffffffffffffffff808211156131cb57600080fd5b6131d789838a01612e67565b955060408801519150808211156131ed57600080fd5b6131f989838a016129a0565b94506060880151915061320b8261215a565b60808801519193508082111561322057600080fd5b5061322d888289016129a0565b9150509295509295909350565b60208152600061218d6020830184612fa1565b6000835161325f818460208801612425565b835190830190613273818360208801612425565b01949350505050565b601f8211156132c657600081815260208120601f850160051c810160208610156132a35750805b601f850160051c820191505b818110156132c2578281556001016132af565b5050505b505050565b815167ffffffffffffffff8111156132e5576132e56121dd565b6132f9816132f38454612966565b8461327c565b602080601f83116001811461332e57600084156133165750858301515b600019600386901b1c1916600185901b1785556132c2565b600085815260208120601f198616915b8281101561335d5788860151825594840194600190910190840161333e565b508582101561337b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220bac975aa4401d11c6c2e49d052d373ffa0f35522982215e51892091825f1736a64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612170565b610325565b60405190151581526020015b60405180910390f35b610176610171366004612397565b61035c565b60405161015a929190612475565b610197610192366004612520565b610391565b60405161015a929190612589565b6101b86101b33660046125fe565b61047e565b60405161015a949392919061266a565b6101d061054b565b005b6101976101e03660046126a6565b61055f565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b610176610243366004612705565b610587565b6101d06102563660046127cb565b61061c565b610176610269366004612808565b61063b565b61028161027c366004612867565b610734565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b43660046128a9565b61075a565b60405161015a91906128c2565b6101b86102d43660046128d5565b610806565b6101976102e73660046125fe565b6108f7565b6101766102fa3660046125fe565b61093b565b6101b861030d366004612867565b61099f565b6101d0610320366004612949565b610a94565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b60405180602001604052806000815250610587565b9150915094509492505050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156104695783829060005260206000200180546103dc90612966565b80601f016020809104026020016040519081016040528092919081815260200182805461040890612966565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050815260200190600101906103bd565b5050505061055f565b91509150935093915050565b6060600080808080808061049c8c8c8c8c636dc4fb7360e01b610b29565b935093509350935060008151111561050e57600080828060200190518101906104c591906129e5565b915091506000866000815181106104de576104de612a37565b60200260200101518060200190518101906104f99190612a4d565b929a5091985096509294506105409350505050565b6105338460008151811061052457610524612a37565b60200260200101518484610eaf565b9750975097509750505050505b945094509450949050565b610553611010565b61055d600061106a565b565b606060006103848686868663b4a8580160e01b604051806020016040528060008152506110d2565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105a357905050905086816000815181106105ce576105ce612a37565b60200260200101819052506000806105ea8b8b858b8b8b6110d2565b915091508160008151811061060157610601612a37565b60200260200101518194509450505050965096945050505050565b610624611010565b805161063790600190602084019061209d565b5050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b8282101561071357838290600052602060002001805461068690612966565b80601f01602080910402602001604051908101604052809291908181526020018280546106b290612966565b80156106ff5780601f106106d4576101008083540402835291602001916106ff565b820191906000526020600020905b8154815290600101906020018083116106e257829003601f168201915b505050505081526020019060010190610667565b5050505063e0a8541260e01b60405180602001604052806000815250610587565b60008060008060008061074988886000611212565b919750955093505050509250925092565b6001818154811061076a57600080fd5b90600052602060002001600091509050805461078590612966565b80601f01602080910402602001604051908101604052809291908181526020018280546107b190612966565b80156107fe5780601f106107d3576101008083540402835291602001916107fe565b820191906000526020600020905b8154815290600101906020018083116107e157829003601f168201915b505050505081565b6060600080600080610852600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506114c09050565b60405160240161086491815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f3431000000000000000000000000000000000000000000000000000000001790528151908101909152600080825291925081906108d4908b908b9086908c90636dc4fb7360e01b90610587565b915091506108e382828a610eaf565b965096509650965050505093509350935093565b60606000808061092a888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b29565b50919a909950975050505050505050565b60606000808061096e888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b29565b5050915091508160008151811061098757610987612a37565b60200260200101518193509350505094509492505050565b60606000806000610a8286866001805480602002602001604051908101604052809291908181526020016000905b82821015610a795783829060005260206000200180546109ec90612966565b80601f0160208091040260200160405190810160405280929190818152602001828054610a1890612966565b8015610a655780601f10610a3a57610100808354040283529160200191610a65565b820191906000526020600020905b815481529060010190602001808311610a4857829003601f168201915b5050505050815260200190600101906109cd565b50505050610806565b93509350935093505b92959194509250565b610a9c611010565b6001600160a01b038116610b1d5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610b268161106a565b50565b60606000606080610b8d60405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610bac8b8d018d612a78565b90925090506060610bbf8a8c018c612b30565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610bf957600080fd5b805167ffffffffffffffff811115610c1357610c136121dd565b604051908082528060200260200182016040528015610c4657816020015b6060815260200190600190039081610c315790505b506020850152805167ffffffffffffffff811115610c6657610c666121dd565b604051908082528060200260200182016040528015610c8f578160200160208202803683370190505b5060e08501526000805b8251811015610e7d578251600090849083908110610cb957610cb9612a37565b6020026020010151600001516001600160e01b03191603610d1857828181518110610ce657610ce6612a37565b60200260200101516020015186602001518281518110610d0857610d08612a37565b6020026020010181905250610e6b565b848281518110610d2a57610d2a612a37565b602002602001015115610da15760018660e001518281518110610d4f57610d4f612a37565b602002602001019015159081151581525050838281518110610d7357610d73612a37565b602002602001015186602001518281518110610d9157610d91612a37565b6020026020010181905250610e5d565b828181518110610db357610db3612a37565b602002602001015160000151848381518110610dd157610dd1612a37565b6020026020010151848381518110610deb57610deb612a37565b602002602001015160200151604051602401610e08929190612cb4565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e5157610e51612a37565b60200260200101819052505b610e68826001612cf8565b91505b80610e7581612d0b565b915050610c99565b50610e878561157f565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610ecb9190612d24565b9050600080610ed9836119c9565b91509150600081604051602401610ef291815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f4c9187918e9101612475565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610f9b959493929190612db1565b600060405180830381865afa158015610fb8573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe091908101906129e5565b91509150600082806020019051810190610ffa9190612a4d565b979f979e50909b50959950505050505050505050565b6000546001600160a01b0316331461055d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b14565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008060006110e38a8a610734565b919450849350909150506001600160a01b03821661112d576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b815283151592611202929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff8111156111d1576111d16121dd565b6040519080825280602002602001820160405280156111fa578160200160208202803683370190505b50905261157f565b9450505050965096945050505050565b60008060008086868681811061122a5761122a612a37565b919091013560f81c915050600081900361124e5750600092508291508390506114b7565b600061125a8287612cf8565b611265906001612cf8565b905060008260421480156112ab57508888611281896001612cf8565b81811061129057611290612a37565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156112e9575088886112bf600185612e1a565b8181106112ce576112ce612a37565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561136157611359600060408b8b6113028c6002612cf8565b9061130e600189612e1a565b9261131b93929190612e2d565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611bf29050565b509050611393565b888861136e896001612cf8565b61137a92859290612e2d565b604051611388929190612e57565b604051809103902090505b60008060006113a38c8c87611212565b925092509250600082856040516020016113c7929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa158015611460573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114849190612a4d565b90506001600160a01b038116156114a857995097508996506114b795505050505050565b50929850919650909450505050505b93509350939050565b60008060006114cf8585611cc3565b90925090508161154157600185516114e79190612e1a565b84146115355760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d650000006044820152606401610b14565b50600091506103569050565b61154b85826114c0565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156115a4576115a46121dd565b60405190808252806020026020018201604052801561160257816020015b6115ef604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816115c25790505b50905060008367ffffffffffffffff811115611620576116206121dd565b60405190808252806020026020018201604052801561166657816020015b60408051808201909152600081526060602082015281526020019060019003908161163e5790505b5090508367ffffffffffffffff811115611682576116826121dd565b6040519080825280602002602001820160405280156116b557816020015b60608152602001906001900390816116a05790505b5086515160a088015191965015906000906116cf90611d7a565b9050876080015180156116e0575080155b15611717576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005b868110156119075760008960200151828151811061173a5761173a612a37565b6020026020010151905060008a60e00151838151811061175c5761175c612a37565b60200260200101519050801561179157818a848151811061177f5761177f612a37565b602002602001018190525050506118f5565b8415801561179c5750835b156117e2578a516040516117b591908490602401612cb4565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b17905291505b6000806000806117f68f60a0015187611df5565b9350935093509350831561186b57828060200190518101906118189190612ee7565b8b8d8151811061182a5761182a612a37565b6020026020010181905250818a888151811061184857611848612a37565b602090810291909101015261185e60018d612cf8565b9b505050505050506118f5565b8080156118755750875b15611891578280602001905181019061188e9190612d24565b92505b828e88815181106118a4576118a4612a37565b60200260200101819052508e6020015187815181106118c5576118c5612a37565b60200260200101518a88815181106118df576118df612a37565b6020026020010151602001819052505050505050505b806118ff81612d0b565b91505061171a565b508460000361191b57505050505050919050565b84845230886040015163a780bab660e01b8660405160240161193d9190612fe2565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050508a606001518b608001518c60a001518d604001518e60c001518a60405160200161199e959493929190613044565b60408051601f1981840301815290829052630556f18360e41b8252610b149594939291600401613101565b8051606090600090819084906119e0816002612cf8565b67ffffffffffffffff8111156119f8576119f86121dd565b6040519080825280601f01601f191660200182016040528015611a22576020820181803683370190505b50945060009350808403611a6757600060f81b85600081518110611a4857611a48612a37565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611a7f57611a7f612a37565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611b41578360f81b868260010181518110611ae557611ae5612a37565b60200101906001600160f81b031916908160001a90535084611b0e846001840160ff8816611f92565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611b91565b600184019350828181518110611b5957611b59612a37565b602001015160f81c60f81b868260010181518110611b7957611b79612a37565b60200101906001600160f81b031916908160001a9053505b8015611ba05760001901611a6d565b5083611bb183600060ff8716611f92565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611a4857611a48612a37565b8251600090600190831115611c0657600080fd5b611c57565b6000603a8210602f83111615611c235750602f190190565b60478210604083111615611c3957506036190190565b60678210606083111615611c4f57506056190190565b5060ff919050565b60208501845b84811015611cb957611c748183015160001a611c0b565b611c866001830184015160001a611c0b565b60ff811460ff83141715611c9f57600094505050611cb9565b60049190911b1760089490941b9390931792600201611c5d565b5050935093915050565b60008083518310611d165760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e647300006044820152606401610b14565b6000848481518110611d2a57611d2a612a37565b016020015160f81c90508015611d5657611d4f85611d49866001612cf8565b83611f92565b9250611d5b565b600092505b611d658185612cf8565b611d70906001612cf8565b9150509250929050565b6040516301ffc9a760e01b8152639061b92360e01b60048201526000906001600160a01b038316906301ffc9a79061c350906024016020604051808303818786fa93505050508015611de9575060408051601f3d908101601f19168201909252611de691810190613135565b60015b61035657506000919050565b60408051808201909152600080825260606020830181905290916000611e1b8686611fb6565b90503d8115611e41576000611e31600083612048565b909550935060019150610a8b9050565b60048110611f88576000611e5760006004612048565b90506000611e6f6004611e6a8186612e1a565b612048565b9050630556f18360e41b611e8283613152565b6001600160e01b03191603611f5057600080600080600085806020019051810190611ead919061318a565b945094509450945094508d6001600160a01b0316856001600160a01b031603611f46576040518060600160405280866001600160a01b0316815260200185815260200184815250604051602001611f04919061323a565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b50909950975060009650610a8b95505050505050565b5050505050611f85565b8181604051602001611f6392919061324d565b60408051601f19818403018152919052600097509550869350610a8b92505050565b50505b5092959194509250565b8251600090611fa18385612cf8565b1115611fac57600080fd5b5091016020012090565b60006001600160a01b0383163b6120355760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e74726163740000000000000000000000000000000000006064820152608401610b14565b600080835160208501865afa9392505050565b60608167ffffffffffffffff811115612063576120636121dd565b6040519080825280601f01601f19166020018201604052801561208d576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156120e3579160200282015b828111156120e357825182906120d390826132cb565b50916020019190600101906120bd565b506120ef9291506120f3565b5090565b808211156120ef5760006121078282612110565b506001016120f3565b50805461211c90612966565b6000825580601f1061212c575050565b601f016020900490600052602060002090810190610b2691905b808211156120ef5760008155600101612146565b6001600160e01b031981168114610b2657600080fd5b60006020828403121561218257600080fd5b813561218d8161215a565b9392505050565b60008083601f8401126121a657600080fd5b50813567ffffffffffffffff8111156121be57600080fd5b6020830191508360208285010111156121d657600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612216576122166121dd565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612245576122456121dd565b604052919050565b600067ffffffffffffffff821115612267576122676121dd565b50601f01601f191660200190565b60006122886122838461224d565b61221c565b905082815283838301111561229c57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126122c457600080fd5b61218d83833560208501612275565b600067ffffffffffffffff8211156122ed576122ed6121dd565b5060051b60200190565b600082601f83011261230857600080fd5b81356020612318612283836122d3565b82815260059290921b8401810191818101908684111561233757600080fd5b8286015b8481101561238c57803567ffffffffffffffff81111561235b5760008081fd5b8701603f8101891361236d5760008081fd5b61237e898683013560408401612275565b84525091830191830161233b565b509695505050505050565b600080600080606085870312156123ad57600080fd5b843567ffffffffffffffff808211156123c557600080fd5b6123d188838901612194565b909650945060208701359150808211156123ea57600080fd5b6123f6888389016122b3565b9350604087013591508082111561240c57600080fd5b50612419878288016122f7565b91505092959194509250565b60005b83811015612440578181015183820152602001612428565b50506000910152565b60008151808452612461816020860160208601612425565b601f01601f19169290920160200192915050565b6040815260006124886040830185612449565b90506001600160a01b03831660208301529392505050565b600082601f8301126124b157600080fd5b813560206124c1612283836122d3565b82815260059290921b840181019181810190868411156124e057600080fd5b8286015b8481101561238c57803567ffffffffffffffff8111156125045760008081fd5b6125128986838b01016122b3565b8452509183019183016124e4565b60008060006040848603121561253557600080fd5b833567ffffffffffffffff8082111561254d57600080fd5b61255987838801612194565b9095509350602086013591508082111561257257600080fd5b5061257f868287016124a0565b9150509250925092565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156125e057605f198887030185526125ce868351612449565b955093820193908201906001016125b2565b50508394506001600160a01b03871681870152505050509392505050565b6000806000806040858703121561261457600080fd5b843567ffffffffffffffff8082111561262c57600080fd5b61263888838901612194565b9096509450602087013591508082111561265157600080fd5b5061265e87828801612194565b95989497509550505050565b60808152600061267d6080830187612449565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156126bc57600080fd5b843567ffffffffffffffff808211156126d457600080fd5b6126e088838901612194565b909650945060208701359150808211156126f957600080fd5b6123f6888389016124a0565b60008060008060008060a0878903121561271e57600080fd5b863567ffffffffffffffff8082111561273657600080fd5b6127428a838b01612194565b9098509650602089013591508082111561275b57600080fd5b6127678a838b016122b3565b9550604089013591508082111561277d57600080fd5b6127898a838b016122f7565b94506060890135915061279b8261215a565b909250608088013590808211156127b157600080fd5b506127be89828a016122b3565b9150509295509295509295565b6000602082840312156127dd57600080fd5b813567ffffffffffffffff8111156127f457600080fd5b612800848285016122f7565b949350505050565b60008060006040848603121561281d57600080fd5b833567ffffffffffffffff8082111561283557600080fd5b61284187838801612194565b9095509350602086013591508082111561285a57600080fd5b5061257f868287016122b3565b6000806020838503121561287a57600080fd5b823567ffffffffffffffff81111561289157600080fd5b61289d85828601612194565b90969095509350505050565b6000602082840312156128bb57600080fd5b5035919050565b60208152600061218d6020830184612449565b6000806000604084860312156128ea57600080fd5b833567ffffffffffffffff8082111561290257600080fd5b61290e87838801612194565b9095509350602086013591508082111561292757600080fd5b5061257f868287016122f7565b6001600160a01b0381168114610b2657600080fd5b60006020828403121561295b57600080fd5b813561218d81612934565b600181811c9082168061297a57607f821691505b60208210810361299a57634e487b7160e01b600052602260045260246000fd5b50919050565b600082601f8301126129b157600080fd5b81516129bf6122838261224d565b8181528460208386010111156129d457600080fd5b612800826020830160208701612425565b600080604083850312156129f857600080fd5b825167ffffffffffffffff811115612a0f57600080fd5b612a1b858286016129a0565b9250506020830151612a2c81612934565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a5f57600080fd5b815161218d81612934565b8015158114610b2657600080fd5b60008060408385031215612a8b57600080fd5b823567ffffffffffffffff80821115612aa357600080fd5b818501915085601f830112612ab757600080fd5b81356020612ac7612283836122d3565b82815260059290921b84018101918181019089841115612ae657600080fd5b948201945b83861015612b0d578535612afe81612a6a565b82529482019490820190612aeb565b96505086013592505080821115612b2357600080fd5b50611d70858286016124a0565b600080600080600060a08688031215612b4857600080fd5b612b528635612a6a565b85359450612b636020870135612934565b6020860135935067ffffffffffffffff8060408801351115612b8457600080fd5b612b9488604089013589016122f7565b93508060608801351115612ba757600080fd5b612bb788606089013589016122b3565b92508060808801351115612bca57600080fd5b6080870135870188601f820112612be057600080fd5b612bed61228382356122d3565b81358082526020808301929160051b8401018b1015612c0b57600080fd5b602083015b6020843560051b850101811015612ca2578481351115612c2f57600080fd5b803584016040818e03601f19011215612c4757600080fd5b612c4f6121f3565b612c5c602083013561215a565b602082013581528660408301351115612c7457600080fd5b612c878e602060408501358501016122b3565b60208201528085525050602083019250602081019050612c10565b50809450505050509295509295909350565b604081526000612cc76040830185612449565b8281036020840152612cd98185612449565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612ce2565b600060018201612d1d57612d1d612ce2565b5060010190565b600060208284031215612d3657600080fd5b815167ffffffffffffffff811115612d4d57600080fd5b612800848285016129a0565b600082825180855260208086019550808260051b84010181860160005b84811015612da457601f19868403018952612d92838351612449565b98840198925090830190600101612d76565b5090979650505050505050565b60a081526000612dc460a0830188612449565b8281036020840152612dd68188612449565b90508281036040840152612dea8187612d59565b90506001600160e01b0319851660608401528281036080840152612e0e8185612449565b98975050505050505050565b8181038181111561035657610356612ce2565b60008085851115612e3d57600080fd5b83861115612e4a57600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f830112612e7857600080fd5b81516020612e88612283836122d3565b82815260059290921b84018101918181019086841115612ea757600080fd5b8286015b8481101561238c57805167ffffffffffffffff811115612ecb5760008081fd5b612ed98986838b01016129a0565b845250918301918301612eab565b600060208284031215612ef957600080fd5b815167ffffffffffffffff80821115612f1157600080fd5b9083019060608286031215612f2557600080fd5b604051606081018181108382111715612f4057612f406121dd565b6040528251612f4e81612934565b8152602083015182811115612f6257600080fd5b612f6e87828601612e67565b602083015250604083015182811115612f8657600080fd5b612f92878286016129a0565b60408301525095945050505050565b6001600160a01b0381511682526000602082015160606020850152612fc96060850182612d59565b905060408301518482036040860152612cd98282612449565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561303757603f19888603018452613025858351612fa1565b94509285019290850190600101613009565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261307060a0850188612d59565b84810360608601526130828188612449565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156130ee57858303601f19018552815180516001600160e01b03191684528801518884018890526130db88850182612449565b95890195935050908701906001016130a5565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061312360a0830187612d59565b8281036040840152612dea8187612449565b60006020828403121561314757600080fd5b815161218d81612a6a565b6000815160208301516001600160e01b0319808216935060048310156131825780818460040360031b1b83161693505b505050919050565b600080600080600060a086880312156131a257600080fd5b85516131ad81612934565b602087015190955067ffffffffffffffff808211156131cb57600080fd5b6131d789838a01612e67565b955060408801519150808211156131ed57600080fd5b6131f989838a016129a0565b94506060880151915061320b8261215a565b60808801519193508082111561322057600080fd5b5061322d888289016129a0565b9150509295509295909350565b60208152600061218d6020830184612fa1565b6000835161325f818460208801612425565b835190830190613273818360208801612425565b01949350505050565b601f8211156132c657600081815260208120601f850160051c810160208610156132a35750805b601f850160051c820191505b818110156132c2578281556001016132af565b5050505b505050565b815167ffffffffffffffff8111156132e5576132e56121dd565b6132f9816132f38454612966565b8461327c565b602080601f83116001811461332e57600084156133165750858301515b600019600386901b1c1916600185901b1785556132c2565b600085815260208120601f198616915b8281101561335d5788860151825594840194600190910190840161333e565b508582101561337b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220bac975aa4401d11c6c2e49d052d373ffa0f35522982215e51892091825f1736a64736f6c63430008110033", + "numDeployments": 5, + "solcInputHash": "a268c4117fbf03c1acd17a54ea249795", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"status\",\"type\":\"uint16\"},{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"internalType\":\"struct HttpErrorItem[]\",\"name\":\"errors\",\"type\":\"tuple[]\"}],\"name\":\"HttpError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"urls\",\"type\":\"string[]\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"OffchainLookup\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ResolverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverNotContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverWildcardNotSupported\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"metaData\",\"type\":\"bytes\"}],\"name\":\"_resolveSingle\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batchGatewayURLs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"}],\"name\":\"findResolver\",\"outputs\":[{\"internalType\":\"contract Resolver\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"resolve\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveCallback\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveSingleCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"reverseCallback\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"name\":\"setGatewayURLs\",\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"findResolver(bytes)\":{\"details\":\"Finds a resolver by recursively querying the registry, starting at the longest name and progressively removing labels until it finds a result.\",\"params\":{\"name\":\"The name to resolve, in DNS-encoded and normalised form.\"},\"returns\":{\"_0\":\"resolver The Resolver responsible for this name.\",\"_1\":\"namehash The namehash of the full name.\",\"_2\":\"finalOffset The offset of the first label with a resolver.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"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.\"},\"resolve(bytes,bytes)\":{\"details\":\"Performs ENS name resolution for the supplied name and resolution data.\",\"params\":{\"data\":\"The resolution data, as specified in ENSIP-10.\",\"name\":\"The name to resolve, in normalised and DNS-encoded form.\"},\"returns\":{\"_0\":\"The result of resolving the name.\"}},\"reverse(bytes,string[])\":{\"details\":\"Performs ENS name reverse resolution for the supplied reverse name.\",\"params\":{\"reverseName\":\"The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\"},\"returns\":{\"_0\":\"The resolved name, the resolved address, the reverse resolver address, and the resolver address.\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"The Universal Resolver is a contract that handles the work of resolving a name entirely onchain, making it possible to make a single smart contract call to resolve an ENS name.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/UniversalResolver.sol\":\"UniversalResolver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n // Logged when the owner of a node assigns a new owner to a subnode.\\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n // Logged when the owner of a node transfers ownership to a new account.\\n event Transfer(bytes32 indexed node, address owner);\\n\\n // Logged when the resolver for a node changes.\\n event NewResolver(bytes32 indexed node, address resolver);\\n\\n // Logged when the TTL of a node changes\\n event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n // Logged when an operator is added or removed.\\n event ApprovalForAll(\\n address indexed owner,\\n address indexed operator,\\n bool approved\\n );\\n\\n function setRecord(\\n bytes32 node,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeRecord(\\n bytes32 node,\\n bytes32 label,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeOwner(\\n bytes32 node,\\n bytes32 label,\\n address owner\\n ) external returns (bytes32);\\n\\n function setResolver(bytes32 node, address resolver) external;\\n\\n function setOwner(bytes32 node, address owner) external;\\n\\n function setTTL(bytes32 node, uint64 ttl) external;\\n\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n function owner(bytes32 node) external view returns (address);\\n\\n function resolver(bytes32 node) external view returns (address);\\n\\n function ttl(bytes32 node) external view returns (uint64);\\n\\n function recordExists(bytes32 node) external view returns (bool);\\n\\n function isApprovedForAll(\\n address owner,\\n address operator\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7cb1158c7d268b63de1468e28e2711b28d686e2628ddb22da2149cd93ddeafda\"},\"contracts/resolvers/Resolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"./profiles/IABIResolver.sol\\\";\\nimport \\\"./profiles/IAddressResolver.sol\\\";\\nimport \\\"./profiles/IAddrResolver.sol\\\";\\nimport \\\"./profiles/IContentHashResolver.sol\\\";\\nimport \\\"./profiles/IDNSRecordResolver.sol\\\";\\nimport \\\"./profiles/IDNSZoneResolver.sol\\\";\\nimport \\\"./profiles/IInterfaceResolver.sol\\\";\\nimport \\\"./profiles/INameResolver.sol\\\";\\nimport \\\"./profiles/IPubkeyResolver.sol\\\";\\nimport \\\"./profiles/ITextResolver.sol\\\";\\nimport \\\"./profiles/IExtendedResolver.sol\\\";\\n\\n/**\\n * A generic resolver interface which includes all the functions including the ones deprecated\\n */\\ninterface Resolver is\\n IERC165,\\n IABIResolver,\\n IAddressResolver,\\n IAddrResolver,\\n IContentHashResolver,\\n IDNSRecordResolver,\\n IDNSZoneResolver,\\n IInterfaceResolver,\\n INameResolver,\\n IPubkeyResolver,\\n ITextResolver,\\n IExtendedResolver\\n{\\n /* Deprecated events */\\n event ContentChanged(bytes32 indexed node, bytes32 hash);\\n\\n function setApprovalForAll(address, bool) external;\\n\\n function approve(bytes32 node, address delegate, bool approved) external;\\n\\n function isApprovedForAll(address account, address operator) external;\\n\\n function isApprovedFor(\\n address owner,\\n bytes32 node,\\n address delegate\\n ) external;\\n\\n function setABI(\\n bytes32 node,\\n uint256 contentType,\\n bytes calldata data\\n ) external;\\n\\n function setAddr(bytes32 node, address addr) external;\\n\\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\\n\\n function setContenthash(bytes32 node, bytes calldata hash) external;\\n\\n function setDnsrr(bytes32 node, bytes calldata data) external;\\n\\n function setName(bytes32 node, string calldata _name) external;\\n\\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\\n\\n function setText(\\n bytes32 node,\\n string calldata key,\\n string calldata value\\n ) external;\\n\\n function setInterface(\\n bytes32 node,\\n bytes4 interfaceID,\\n address implementer\\n ) external;\\n\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n function multicallWithNodeCheck(\\n bytes32 nodehash,\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n /* Deprecated functions */\\n function content(bytes32 node) external view returns (bytes32);\\n\\n function multihash(bytes32 node) external view returns (bytes memory);\\n\\n function setContent(bytes32 node, bytes32 hash) external;\\n\\n function setMultihash(bytes32 node, bytes calldata hash) external;\\n}\\n\",\"keccak256\":\"0xfc77ab6b7c59c3ebfe1c720bdebf9b08c2488ff7ac9501a9aa056c5d6d5b50c5\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IABIResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IABIResolver {\\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\\n\\n /**\\n * Returns the ABI associated with an ENS node.\\n * Defined in EIP205.\\n * @param node The ENS node to query\\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\\n * @return contentType The content type of the return value\\n * @return data The ABI data\\n */\\n function ABI(\\n bytes32 node,\\n uint256 contentTypes\\n ) external view returns (uint256, bytes memory);\\n}\\n\",\"keccak256\":\"0x85b373d02d19374fe570af407f459768285704bf7f30ab17c30eabfb5a10e4c3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddrResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the legacy (ETH-only) addr function.\\n */\\ninterface IAddrResolver {\\n event AddrChanged(bytes32 indexed node, address a);\\n\\n /**\\n * Returns the address associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated address.\\n */\\n function addr(bytes32 node) external view returns (address payable);\\n}\\n\",\"keccak256\":\"0x2ad7f2fc60ebe0f93745fe70247f6a854f66af732483fda2a3c5e055614445e8\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the new (multicoin) addr function.\\n */\\ninterface IAddressResolver {\\n event AddressChanged(\\n bytes32 indexed node,\\n uint256 coinType,\\n bytes newAddress\\n );\\n\\n function addr(\\n bytes32 node,\\n uint256 coinType\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x411447c1e90c51e09702815a85ec725ffbbe37cf96e8cc4d2a8bd4ad8a59d73e\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IContentHashResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IContentHashResolver {\\n event ContenthashChanged(bytes32 indexed node, bytes hash);\\n\\n /**\\n * Returns the contenthash associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function contenthash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xd95cd77684ba5752c428d7dceb4ecc6506ac94f4fbb910489637eb68dcd8e366\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSRecordResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSRecordResolver {\\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\\n event DNSRecordChanged(\\n bytes32 indexed node,\\n bytes name,\\n uint16 resource,\\n bytes record\\n );\\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\\n\\n /**\\n * Obtain a DNS record.\\n * @param node the namehash of the node for which to fetch the record\\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\\n * @return the DNS record in wire format if present, otherwise empty\\n */\\n function dnsRecord(\\n bytes32 node,\\n bytes32 name,\\n uint16 resource\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xcfa52200edd337f2c6c5bf402352600584da033b21323603e53de33051a3e25d\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSZoneResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSZoneResolver {\\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\\n event DNSZonehashChanged(\\n bytes32 indexed node,\\n bytes lastzonehash,\\n bytes zonehash\\n );\\n\\n /**\\n * zonehash obtains the hash for the zone.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function zonehash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xca1b3a16e7005533f2800a3e66fcdccf7c574deac7913d8c810f40aec1d58dc0\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IExtendedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IExtendedResolver {\\n function resolve(\\n bytes memory name,\\n bytes memory data\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IInterfaceResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IInterfaceResolver {\\n event InterfaceChanged(\\n bytes32 indexed node,\\n bytes4 indexed interfaceID,\\n address implementer\\n );\\n\\n /**\\n * Returns the address of a contract that implements the specified interface for this name.\\n * If an implementer has not been set for this interfaceID and name, the resolver will query\\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\\n * will be returned.\\n * @param node The ENS node to query.\\n * @param interfaceID The EIP 165 interface ID to check for.\\n * @return The address that implements this interface, or 0 if the interface is unsupported.\\n */\\n function interfaceImplementer(\\n bytes32 node,\\n bytes4 interfaceID\\n ) external view returns (address);\\n}\\n\",\"keccak256\":\"0x390321fb58f7b927df9562450981e74b4be3907e7c09df321fd3b7409b63ae28\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/INameResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface INameResolver {\\n event NameChanged(bytes32 indexed node, string name);\\n\\n /**\\n * Returns the name associated with an ENS node, for reverse records.\\n * Defined in EIP181.\\n * @param node The ENS node to query.\\n * @return The associated name.\\n */\\n function name(bytes32 node) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x9ec392b612447b1acbdc01114f2da2837a658d3f3157f60a99c5269f0b623346\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IPubkeyResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IPubkeyResolver {\\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\\n\\n /**\\n * Returns the SECP256k1 public key associated with an ENS node.\\n * Defined in EIP 619.\\n * @param node The ENS node to query\\n * @return x The X coordinate of the curve point for the public key.\\n * @return y The Y coordinate of the curve point for the public key.\\n */\\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\\n}\\n\",\"keccak256\":\"0x69748947093dd2fda9ddcebd0adf19a6d1e7600df1d4b1462a0417156caddca7\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/ITextResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface ITextResolver {\\n event TextChanged(\\n bytes32 indexed node,\\n string indexed indexedKey,\\n string key,\\n string value\\n );\\n\\n /**\\n * Returns the text data associated with an ENS node and key.\\n * @param node The ENS node to query.\\n * @param key The text data key to query.\\n * @return The associated text data.\\n */\\n function text(\\n bytes32 node,\\n string calldata key\\n ) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x7c5debb3c42cd9f5de2274ea7aa053f238608314b62db441c40e31cea2543fd5\",\"license\":\"MIT\"},\"contracts/utils/HexUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nlibrary HexUtils {\\n /**\\n * @dev Attempts to parse bytes32 from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexStringToBytes32(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (bytes32 r, bool valid) {\\n valid = true;\\n assembly {\\n // check that the index to read to is not past the end of the string\\n if gt(lastIdx, mload(str)) {\\n revert(0, 0)\\n }\\n\\n function getHex(c) -> ascii {\\n // chars 48-57: 0-9\\n if and(gt(c, 47), lt(c, 58)) {\\n ascii := sub(c, 48)\\n leave\\n }\\n // chars 65-70: A-F\\n if and(gt(c, 64), lt(c, 71)) {\\n ascii := add(sub(c, 65), 10)\\n leave\\n }\\n // chars 97-102: a-f\\n if and(gt(c, 96), lt(c, 103)) {\\n ascii := add(sub(c, 97), 10)\\n leave\\n }\\n // invalid char\\n ascii := 0xff\\n }\\n\\n let ptr := add(str, 32)\\n for {\\n let i := idx\\n } lt(i, lastIdx) {\\n i := add(i, 2)\\n } {\\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\\n // if either byte is invalid, set invalid and break loop\\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\\n valid := false\\n break\\n }\\n let combined := or(shl(4, byte1), byte2)\\n r := or(shl(8, r), combined)\\n }\\n }\\n }\\n\\n /**\\n * @dev Attempts to parse an address from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexToAddress(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (address, bool) {\\n if (lastIdx - idx < 40) return (address(0x0), false);\\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\\n return (address(uint160(uint256(r))), valid);\\n }\\n}\\n\",\"keccak256\":\"0xcae20ad72181f47dfe7fba7d88e8d902a01576b16e93362878e726989d6cfb4d\",\"license\":\"MIT\"},\"contracts/utils/LowLevelCallUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.13;\\n\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary LowLevelCallUtils {\\n using Address for address;\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data\\n ) internal view returns (bool success) {\\n return functionStaticCall(target, data, gasleft());\\n }\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data` using `gasLimit`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @param gasLimit The gas limit to use for the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n uint256 gasLimit\\n ) internal view returns (bool success) {\\n require(\\n target.isContract(),\\n \\\"LowLevelCallUtils: static call to non-contract\\\"\\n );\\n assembly {\\n success := staticcall(\\n gasLimit,\\n target,\\n add(data, 32),\\n mload(data),\\n 0,\\n 0\\n )\\n }\\n }\\n\\n /**\\n * @dev Returns the size of the return data of the most recent external call.\\n */\\n function returnDataSize() internal pure returns (uint256 len) {\\n assembly {\\n len := returndatasize()\\n }\\n }\\n\\n /**\\n * @dev Reads return data from the most recent external call.\\n * @param offset Offset into the return data.\\n * @param length Number of bytes to return.\\n */\\n function readReturnData(\\n uint256 offset,\\n uint256 length\\n ) internal pure returns (bytes memory data) {\\n data = new bytes(length);\\n assembly {\\n returndatacopy(add(data, 32), offset, length)\\n }\\n }\\n\\n /**\\n * @dev Reverts with the return data from the most recent external call.\\n */\\n function propagateRevert() internal pure {\\n assembly {\\n returndatacopy(0, 0, returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xba30d0a44a6a2f1557e4913108b25d8b36cb40a54f44ac98086465d6bf77c5e6\",\"license\":\"MIT\"},\"contracts/utils/NameEncoder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\n\\nlibrary NameEncoder {\\n using BytesUtils for bytes;\\n\\n function dnsEncodeName(\\n string memory name\\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\\n uint8 labelLength = 0;\\n bytes memory bytesName = bytes(name);\\n uint256 length = bytesName.length;\\n dnsName = new bytes(length + 2);\\n node = 0;\\n if (length == 0) {\\n dnsName[0] = 0;\\n return (dnsName, node);\\n }\\n\\n // use unchecked to save gas since we check for an underflow\\n // and we check for the length before the loop\\n unchecked {\\n for (uint256 i = length - 1; i >= 0; i--) {\\n if (bytesName[i] == \\\".\\\") {\\n dnsName[i + 1] = bytes1(labelLength);\\n node = keccak256(\\n abi.encodePacked(\\n node,\\n bytesName.keccak(i + 1, labelLength)\\n )\\n );\\n labelLength = 0;\\n } else {\\n labelLength += 1;\\n dnsName[i + 1] = bytesName[i];\\n }\\n if (i == 0) {\\n break;\\n }\\n }\\n }\\n\\n node = keccak256(\\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\\n );\\n\\n dnsName[0] = bytes1(labelLength);\\n return (dnsName, node);\\n }\\n}\\n\",\"keccak256\":\"0x63fd5f360cef8c9b8b8cfdff20d3f0e955b4c8ac7dfac758788223c61678aad1\",\"license\":\"MIT\"},\"contracts/utils/UniversalResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.17 <0.9.0;\\n\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\nimport {Ownable} from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {LowLevelCallUtils} from \\\"./LowLevelCallUtils.sol\\\";\\nimport {ENS} from \\\"../registry/ENS.sol\\\";\\nimport {IExtendedResolver} from \\\"../resolvers/profiles/IExtendedResolver.sol\\\";\\nimport {Resolver, INameResolver, IAddrResolver} from \\\"../resolvers/Resolver.sol\\\";\\nimport {NameEncoder} from \\\"./NameEncoder.sol\\\";\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\nimport {HexUtils} from \\\"./HexUtils.sol\\\";\\n\\nerror OffchainLookup(\\n address sender,\\n string[] urls,\\n bytes callData,\\n bytes4 callbackFunction,\\n bytes extraData\\n);\\n\\nerror ResolverNotFound();\\n\\nerror ResolverWildcardNotSupported();\\n\\nerror ResolverNotContract();\\n\\nerror ResolverError(bytes returnData);\\n\\nerror HttpError(HttpErrorItem[] errors);\\n\\nstruct HttpErrorItem {\\n uint16 status;\\n string message;\\n}\\n\\nstruct MulticallData {\\n bytes name;\\n bytes[] data;\\n string[] gateways;\\n bytes4 callbackFunction;\\n bool isWildcard;\\n address resolver;\\n bytes metaData;\\n bool[] failures;\\n}\\n\\nstruct MulticallChecks {\\n bool isCallback;\\n bool hasExtendedResolver;\\n}\\n\\nstruct OffchainLookupCallData {\\n address sender;\\n string[] urls;\\n bytes callData;\\n}\\n\\nstruct OffchainLookupExtraData {\\n bytes4 callbackFunction;\\n bytes data;\\n}\\n\\nstruct Result {\\n bool success;\\n bytes returnData;\\n}\\n\\ninterface BatchGateway {\\n function query(\\n OffchainLookupCallData[] memory data\\n ) external returns (bool[] memory failures, bytes[] memory responses);\\n}\\n\\n/**\\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\\n * making it possible to make a single smart contract call to resolve an ENS name.\\n */\\ncontract UniversalResolver is ERC165, Ownable {\\n using Address for address;\\n using NameEncoder for string;\\n using BytesUtils for bytes;\\n using HexUtils for bytes;\\n\\n string[] public batchGatewayURLs;\\n ENS public immutable registry;\\n\\n constructor(address _registry, string[] memory _urls) {\\n registry = ENS(_registry);\\n batchGatewayURLs = _urls;\\n }\\n\\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\\n batchGatewayURLs = _urls;\\n }\\n\\n /**\\n * @dev Performs ENS name resolution for the supplied name and resolution data.\\n * @param name The name to resolve, in normalised and DNS-encoded form.\\n * @param data The resolution data, as specified in ENSIP-10.\\n * @return The result of resolving the name.\\n */\\n function resolve(\\n bytes calldata name,\\n bytes memory data\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n batchGatewayURLs,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data\\n ) external view returns (Result[] memory, address) {\\n return resolve(name, data, batchGatewayURLs);\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n gateways,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways\\n ) public view returns (Result[] memory, address) {\\n return\\n _resolve(name, data, gateways, this.resolveCallback.selector, \\\"\\\");\\n }\\n\\n function _resolveSingle(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) public view returns (bytes memory, address) {\\n bytes[] memory dataArr = new bytes[](1);\\n dataArr[0] = data;\\n (Result[] memory results, address resolver) = _resolve(\\n name,\\n dataArr,\\n gateways,\\n callbackFunction,\\n metaData\\n );\\n\\n Result memory result = results[0];\\n\\n _checkResolveSingle(result);\\n\\n return (result.returnData, resolver);\\n }\\n\\n function _resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) internal view returns (Result[] memory results, address resolverAddress) {\\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\\n resolverAddress = address(resolver);\\n if (resolverAddress == address(0)) {\\n revert ResolverNotFound();\\n }\\n\\n if (!resolverAddress.isContract()) {\\n revert ResolverNotContract();\\n }\\n\\n bool isWildcard = finalOffset != 0;\\n\\n results = _multicall(\\n MulticallData(\\n name,\\n data,\\n gateways,\\n callbackFunction,\\n isWildcard,\\n resolverAddress,\\n metaData,\\n new bool[](data.length)\\n )\\n );\\n }\\n\\n function reverse(\\n bytes calldata reverseName\\n ) external view returns (string memory, address, address, address) {\\n return reverse(reverseName, batchGatewayURLs);\\n }\\n\\n /**\\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\\n */\\n function reverse(\\n bytes calldata reverseName,\\n string[] memory gateways\\n ) public view returns (string memory, address, address, address) {\\n bytes memory encodedCall = abi.encodeCall(\\n INameResolver.name,\\n reverseName.namehash(0)\\n );\\n (\\n bytes memory reverseResolvedData,\\n address reverseResolverAddress\\n ) = _resolveSingle(\\n reverseName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n \\\"\\\"\\n );\\n\\n return\\n getForwardDataFromReverse(\\n reverseResolvedData,\\n reverseResolverAddress,\\n gateways\\n );\\n }\\n\\n function getForwardDataFromReverse(\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress,\\n string[] memory gateways\\n ) internal view returns (string memory, address, address, address) {\\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\\n\\n (bytes memory encodedName, bytes32 namehash) = resolvedName\\n .dnsEncodeName();\\n\\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\\n bytes memory metaData = abi.encode(\\n resolvedName,\\n reverseResolverAddress\\n );\\n (bytes memory resolvedData, address resolverAddress) = this\\n ._resolveSingle(\\n encodedName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n metaData\\n );\\n\\n address resolvedAddress = abi.decode(resolvedData, (address));\\n\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n function resolveSingleCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes memory, address) {\\n (Result[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveSingleCallback.selector\\n );\\n Result memory result = results[0];\\n\\n _checkResolveSingle(result);\\n\\n return (result.returnData, resolver);\\n }\\n\\n function resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (Result[] memory, address) {\\n (Result[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveCallback.selector\\n );\\n return (results, resolver);\\n }\\n\\n function reverseCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (string memory, address, address, address) {\\n (\\n Result[] memory results,\\n address resolverAddress,\\n string[] memory gateways,\\n bytes memory metaData\\n ) = _resolveCallback(\\n response,\\n extraData,\\n this.reverseCallback.selector\\n );\\n\\n Result memory result = results[0];\\n\\n if (!result.success) {\\n revert ResolverError(result.returnData);\\n }\\n\\n if (metaData.length > 0) {\\n (string memory resolvedName, address reverseResolverAddress) = abi\\n .decode(metaData, (string, address));\\n address resolvedAddress = abi.decode(result.returnData, (address));\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n return\\n getForwardDataFromReverse(\\n result.returnData,\\n resolverAddress,\\n gateways\\n );\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return\\n interfaceId == type(IExtendedResolver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n function _resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData,\\n bytes4 callbackFunction\\n )\\n internal\\n view\\n returns (Result[] memory, address, string[] memory, bytes memory)\\n {\\n MulticallData memory multicallData;\\n multicallData.callbackFunction = callbackFunction;\\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\\n response,\\n (bool[], bytes[])\\n );\\n OffchainLookupExtraData[] memory extraDatas;\\n (\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n ) = abi.decode(\\n extraData,\\n (bool, address, string[], bytes, OffchainLookupExtraData[])\\n );\\n require(responses.length <= extraDatas.length);\\n multicallData.data = new bytes[](extraDatas.length);\\n multicallData.failures = new bool[](extraDatas.length);\\n uint256 offchainCount = 0;\\n for (uint256 i = 0; i < extraDatas.length; i++) {\\n if (extraDatas[i].callbackFunction == bytes4(0)) {\\n // This call did not require an offchain lookup; use the previous input data.\\n multicallData.data[i] = extraDatas[i].data;\\n } else {\\n if (failures[offchainCount]) {\\n multicallData.failures[i] = true;\\n multicallData.data[i] = responses[offchainCount];\\n } else {\\n multicallData.data[i] = abi.encodeWithSelector(\\n extraDatas[i].callbackFunction,\\n responses[offchainCount],\\n extraDatas[i].data\\n );\\n }\\n offchainCount = offchainCount + 1;\\n }\\n }\\n\\n return (\\n _multicall(multicallData),\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData\\n );\\n }\\n\\n /**\\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\\n * the error with the data necessary to continue the request where it left off.\\n * @param target The address to call.\\n * @param data The data to call `target` with.\\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\\n * @return result Whether the call succeeded.\\n */\\n function callWithOffchainLookupPropagation(\\n address target,\\n bytes memory data,\\n bool isSafe\\n )\\n internal\\n view\\n returns (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool result\\n )\\n {\\n if (isSafe) {\\n result = LowLevelCallUtils.functionStaticCall(target, data);\\n } else {\\n result = LowLevelCallUtils.functionStaticCall(target, data, 50000);\\n }\\n uint256 size = LowLevelCallUtils.returnDataSize();\\n\\n if (result) {\\n return (\\n false,\\n LowLevelCallUtils.readReturnData(0, size),\\n extraData,\\n true\\n );\\n }\\n\\n // Failure\\n if (size >= 4) {\\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\\n // Offchain lookup. Decode the revert message and create our own that nests it.\\n bytes memory revertData = LowLevelCallUtils.readReturnData(\\n 4,\\n size - 4\\n );\\n if (bytes4(errorId) == OffchainLookup.selector) {\\n (\\n address wrappedSender,\\n string[] memory wrappedUrls,\\n bytes memory wrappedCallData,\\n bytes4 wrappedCallbackFunction,\\n bytes memory wrappedExtraData\\n ) = abi.decode(\\n revertData,\\n (address, string[], bytes, bytes4, bytes)\\n );\\n if (wrappedSender == target) {\\n returnData = abi.encode(\\n OffchainLookupCallData(\\n wrappedSender,\\n wrappedUrls,\\n wrappedCallData\\n )\\n );\\n extraData = OffchainLookupExtraData(\\n wrappedCallbackFunction,\\n wrappedExtraData\\n );\\n return (true, returnData, extraData, false);\\n }\\n } else {\\n returnData = bytes.concat(errorId, revertData);\\n return (false, returnData, extraData, false);\\n }\\n }\\n }\\n\\n /**\\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\\n * removing labels until it finds a result.\\n * @param name The name to resolve, in DNS-encoded and normalised form.\\n * @return resolver The Resolver responsible for this name.\\n * @return namehash The namehash of the full name.\\n * @return finalOffset The offset of the first label with a resolver.\\n */\\n function findResolver(\\n bytes calldata name\\n ) public view returns (Resolver, bytes32, uint256) {\\n (\\n address resolver,\\n bytes32 namehash,\\n uint256 finalOffset\\n ) = findResolver(name, 0);\\n return (Resolver(resolver), namehash, finalOffset);\\n }\\n\\n function findResolver(\\n bytes calldata name,\\n uint256 offset\\n ) internal view returns (address, bytes32, uint256) {\\n uint256 labelLength = uint256(uint8(name[offset]));\\n if (labelLength == 0) {\\n return (address(0), bytes32(0), offset);\\n }\\n uint256 nextLabel = offset + labelLength + 1;\\n bytes32 labelHash;\\n if (\\n labelLength == 66 &&\\n // 0x5b == '['\\n name[offset + 1] == 0x5b &&\\n // 0x5d == ']'\\n name[nextLabel - 1] == 0x5d\\n ) {\\n // Encrypted label\\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\\n .hexStringToBytes32(0, 64);\\n } else {\\n labelHash = keccak256(name[offset + 1:nextLabel]);\\n }\\n (\\n address parentresolver,\\n bytes32 parentnode,\\n uint256 parentoffset\\n ) = findResolver(name, nextLabel);\\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\\n address resolver = registry.resolver(node);\\n if (resolver != address(0)) {\\n return (resolver, node, offset);\\n }\\n return (parentresolver, node, parentoffset);\\n }\\n\\n function _checkInterface(\\n address resolver,\\n bytes4 interfaceId\\n ) internal view returns (bool) {\\n try\\n Resolver(resolver).supportsInterface{gas: 50000}(interfaceId)\\n returns (bool supported) {\\n return supported;\\n } catch {\\n return false;\\n }\\n }\\n\\n function _checkSafetyAndItem(\\n bytes memory name,\\n bytes memory item,\\n address resolver,\\n MulticallChecks memory multicallChecks\\n ) internal view returns (bool, bytes memory) {\\n if (!multicallChecks.isCallback) {\\n if (multicallChecks.hasExtendedResolver) {\\n return (\\n true,\\n abi.encodeCall(IExtendedResolver.resolve, (name, item))\\n );\\n }\\n return (_checkInterface(resolver, bytes4(item)), item);\\n }\\n return (true, item);\\n }\\n\\n function _checkMulticall(\\n MulticallData memory multicallData\\n ) internal view returns (MulticallChecks memory) {\\n bool isCallback = multicallData.name.length == 0;\\n bool hasExtendedResolver = _checkInterface(\\n multicallData.resolver,\\n type(IExtendedResolver).interfaceId\\n );\\n\\n if (multicallData.isWildcard && !hasExtendedResolver) {\\n revert ResolverWildcardNotSupported();\\n }\\n\\n return MulticallChecks(isCallback, hasExtendedResolver);\\n }\\n\\n function _checkResolveSingle(Result memory result) internal pure {\\n if (!result.success) {\\n if (bytes4(result.returnData) == HttpError.selector) {\\n (, HttpErrorItem[] memory errors) = abi.decode(\\n result.returnData,\\n (bytes4, HttpErrorItem[])\\n );\\n revert HttpError(errors);\\n }\\n revert ResolverError(result.returnData);\\n }\\n }\\n\\n function _multicall(\\n MulticallData memory multicallData\\n ) internal view returns (Result[] memory results) {\\n uint256 length = multicallData.data.length;\\n uint256 offchainCount = 0;\\n OffchainLookupCallData[]\\n memory callDatas = new OffchainLookupCallData[](length);\\n OffchainLookupExtraData[]\\n memory extraDatas = new OffchainLookupExtraData[](length);\\n results = new Result[](length);\\n MulticallChecks memory multicallChecks = _checkMulticall(multicallData);\\n\\n for (uint256 i = 0; i < length; i++) {\\n bytes memory item = multicallData.data[i];\\n bool failure = multicallData.failures[i];\\n\\n if (failure) {\\n results[i] = Result(false, item);\\n continue;\\n }\\n\\n bool isSafe = false;\\n (isSafe, item) = _checkSafetyAndItem(\\n multicallData.name,\\n item,\\n multicallData.resolver,\\n multicallChecks\\n );\\n\\n (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool success\\n ) = callWithOffchainLookupPropagation(\\n multicallData.resolver,\\n item,\\n isSafe\\n );\\n\\n if (offchain) {\\n callDatas[offchainCount] = abi.decode(\\n returnData,\\n (OffchainLookupCallData)\\n );\\n extraDatas[i] = extraData;\\n offchainCount += 1;\\n continue;\\n }\\n\\n if (success && multicallChecks.hasExtendedResolver) {\\n // if this is a successful resolve() call, unwrap the result\\n returnData = abi.decode(returnData, (bytes));\\n }\\n results[i] = Result(success, returnData);\\n extraDatas[i].data = multicallData.data[i];\\n }\\n\\n if (offchainCount == 0) {\\n return results;\\n }\\n\\n // Trim callDatas if offchain data exists\\n assembly {\\n mstore(callDatas, offchainCount)\\n }\\n\\n revert OffchainLookup(\\n address(this),\\n multicallData.gateways,\\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\\n multicallData.callbackFunction,\\n abi.encode(\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xa5a28872264a6164671800e3e1a604bc01fc2f316392651e9805b6901354cdf5\",\"license\":\"MIT\"},\"contracts/wrapper/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ~0.8.17;\\n\\nlibrary BytesUtils {\\n /*\\n * @dev Returns the keccak-256 hash of a byte range.\\n * @param self The byte string to hash.\\n * @param offset The position to start hashing at.\\n * @param len The number of bytes to hash.\\n * @return The hash of the byte range.\\n */\\n function keccak(\\n bytes memory self,\\n uint256 offset,\\n uint256 len\\n ) internal pure returns (bytes32 ret) {\\n require(offset + len <= self.length);\\n assembly {\\n ret := keccak256(add(add(self, 32), offset), len)\\n }\\n }\\n\\n /**\\n * @dev Returns the ENS namehash of a DNS-encoded name.\\n * @param self The DNS-encoded name to hash.\\n * @param offset The offset at which to start hashing.\\n * @return The namehash of the name.\\n */\\n function namehash(\\n bytes memory self,\\n uint256 offset\\n ) internal pure returns (bytes32) {\\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\\n if (labelhash == bytes32(0)) {\\n require(offset == self.length - 1, \\\"namehash: Junk at end of name\\\");\\n return bytes32(0);\\n }\\n return\\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\\n }\\n\\n /**\\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\\n * @param self The byte string to read a label from.\\n * @param idx The index to read a label at.\\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\\n * @return newIdx The index of the start of the next label.\\n */\\n function readLabel(\\n bytes memory self,\\n uint256 idx\\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\\n require(idx < self.length, \\\"readLabel: Index out of bounds\\\");\\n uint256 len = uint256(uint8(self[idx]));\\n if (len > 0) {\\n labelhash = keccak(self, idx + 1, len);\\n } else {\\n labelhash = bytes32(0);\\n }\\n newIdx = idx + len + 1;\\n }\\n}\\n\",\"keccak256\":\"0xf862cd86d749158a554e3cb517efa9097331ec0cf7225117f21e96fb50c67edb\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162003c3038038062003c308339810160408190526200003491620001da565b6200003f336200006a565b6001600160a01b038216608052805162000061906001906020840190620000ba565b5050506200049c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000105579160200282015b82811115620001055782518290620000f49082620003d0565b5091602001919060010190620000db565b506200011392915062000117565b5090565b80821115620001135760006200012e828262000138565b5060010162000117565b508054620001469062000341565b6000825580601f1062000157575050565b601f0160209004906000526020600020908101906200017791906200017a565b50565b5b808211156200011357600081556001016200017b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001d257620001d262000191565b604052919050565b6000806040808486031215620001ef57600080fd5b83516001600160a01b03811681146200020757600080fd5b602085810151919450906001600160401b03808211156200022757600080fd5b8187019150601f88818401126200023d57600080fd5b82518281111562000252576200025262000191565b8060051b62000263868201620001a7565b918252848101860191868101908c8411156200027e57600080fd5b87870192505b838310156200032e578251868111156200029e5760008081fd5b8701603f81018e13620002b15760008081fd5b8881015187811115620002c857620002c862000191565b620002db818801601f19168b01620001a7565b8181528f8c838501011115620002f15760008081fd5b60005b8281101562000311578381018d01518282018d01528b01620002f4565b5060009181018b0191909152835250918701919087019062000284565b8099505050505050505050509250929050565b600181811c908216806200035657607f821691505b6020821081036200037757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003cb57600081815260208120601f850160051c81016020861015620003a65750805b601f850160051c820191505b81811015620003c757828155600101620003b2565b5050505b505050565b81516001600160401b03811115620003ec57620003ec62000191565b6200040481620003fd845462000341565b846200037d565b602080601f8311600181146200043c5760008415620004235750858301515b600019600386901b1c1916600185901b178555620003c7565b600085815260208120601f198616915b828110156200046d578886015182559484019460019091019084016200044c565b50858210156200048c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051613771620004bf600039600081816101ea015261151701526137716000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612388565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046125a8565b61035c565b60405161015a929190612686565b610197610192366004612731565b610392565b60405161015a92919061279a565b6101b86101b3366004612823565b61047f565b60405161015a949392919061288f565b6101d061056f565b005b6101976101e03660046128cb565b610583565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461292a565b6105ab565b6101d06102563660046129f0565b61064e565b610176610269366004612a2d565b61066d565b61028161027c366004612a8c565b610766565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b4366004612ace565b61078c565b60405161015a9190612ae7565b6101b86102d4366004612afa565b610838565b6101976102e7366004612823565b61092a565b6101766102fa366004612823565b61096e565b6101b861030d366004612a8c565b6109e0565b6101d0610320366004612b6e565b610ad3565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b604051806020016040528060008152506105ab565b915091505b94509492505050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b8282101561046a5783829060005260206000200180546103dd90612b8b565b80601f016020809104026020016040519081016040528092919081815260200182805461040990612b8b565b80156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050815260200190600101906103be565b50505050610583565b91509150935093915050565b6060600080808080808061049d8c8c8c8c636dc4fb7360e01b610b63565b93509350935093506000846000815181106104ba576104ba612bc5565b6020026020010151905080600001516104f5578060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60405180910390fd5b81511561054757600080838060200190518101906105139190612c20565b91509150600083602001518060200190518101906105319190612c72565b929b509199509750939550610564945050505050565b61055681602001518585610ee9565b985098509850985050505050505b945094509450949050565b61057761104a565b61058160006110a4565b565b606060006103848686868663b4a8580160e01b6040518060200160405280600081525061110c565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105c757905050905086816000815181106105f2576105f2612bc5565b602002602001018190525060008061060e8b8b858b8b8b61110c565b9150915060008260008151811061062757610627612bc5565b6020026020010151905061063a8161128d565b602001519b909a5098505050505050505050565b61065661104a565b80516106699060019060208401906122b5565b5050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b828210156107455783829060005260206000200180546106b890612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612b8b565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081526020019060010190610699565b5050505063e0a8541260e01b604051806020016040528060008152506105ab565b60008060008060008061077b88886000611310565b919750955093505050509250925092565b6001818154811061079c57600080fd5b9060005260206000200160009150905080546107b790612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546107e390612b8b565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b505050505081565b6060600080600080610884600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115be9050565b60405160240161089691815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f343100000000000000000000000000000000000000000000000000000000179052815190810190915260008082529192508190610906908b908b9086908c90636dc4fb7360e01b906105ab565b9150915061091582828a610ee9565b96509650965096505050505b93509350935093565b60606000808061095d888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b63565b50919a909950975050505050505050565b6060600080806109a1888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b63565b5050915091506000826000815181106109bc576109bc612bc5565b602002602001015190506109cf8161128d565b602001519890975095505050505050565b60606000806000610ac386866001805480602002602001604051908101604052809291908181526020016000905b82821015610aba578382906000526020600020018054610a2d90612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990612b8b565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b505050505081526020019060010190610a0e565b50505050610838565b9299919850965090945092505050565b610adb61104a565b6001600160a01b038116610b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ec565b610b60816110a4565b50565b60606000606080610bc760405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610be68b8d018d612c9d565b90925090506060610bf98a8c018c612d55565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610c3357600080fd5b805167ffffffffffffffff811115610c4d57610c4d6123ee565b604051908082528060200260200182016040528015610c8057816020015b6060815260200190600190039081610c6b5790505b506020850152805167ffffffffffffffff811115610ca057610ca06123ee565b604051908082528060200260200182016040528015610cc9578160200160208202803683370190505b5060e08501526000805b8251811015610eb7578251600090849083908110610cf357610cf3612bc5565b6020026020010151600001516001600160e01b03191603610d5257828181518110610d2057610d20612bc5565b60200260200101516020015186602001518281518110610d4257610d42612bc5565b6020026020010181905250610ea5565b848281518110610d6457610d64612bc5565b602002602001015115610ddb5760018660e001518281518110610d8957610d89612bc5565b602002602001019015159081151581525050838281518110610dad57610dad612bc5565b602002602001015186602001518281518110610dcb57610dcb612bc5565b6020026020010181905250610e97565b828181518110610ded57610ded612bc5565b602002602001015160000151848381518110610e0b57610e0b612bc5565b6020026020010151848381518110610e2557610e25612bc5565b602002602001015160200151604051602401610e42929190612ed9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e8b57610e8b612bc5565b60200260200101819052505b610ea2826001612f1d565b91505b80610eaf81612f30565b915050610cd3565b50610ec18561167d565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610f059190612f49565b9050600080610f1383611a88565b91509150600081604051602401610f2c91815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f869187918e9101612686565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610fd5959493929190612fd3565b600060405180830381865afa158015610ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101a9190810190612c20565b915091506000828060200190518101906110349190612c72565b979f979e50909b50959950505050505050505050565b6000546001600160a01b031633146105815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ec565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080600061111d8a8a610766565b919450849350909150506001600160a01b038216611167576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383163b6111a8576040517f4981ac0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b81528315159261127d929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff81111561124c5761124c6123ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b50905261167d565b9450505050965096945050505050565b8051610b6057602081015163ca7a4e7560e01b906112aa9061303c565b6001600160e01b031916036112f157600081602001518060200190518101906112d39190613074565b9150508060405163ca7a4e7560e01b81526004016104ec919061318a565b8060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60008060008086868681811061132857611328612bc5565b919091013560f81c915050600081900361134c5750600092508291508390506115b5565b60006113588287612f1d565b611363906001612f1d565b905060008260421480156113a95750888861137f896001612f1d565b81811061138e5761138e612bc5565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156113e7575088886113bd600185613202565b8181106113cc576113cc612bc5565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561145f57611457600060408b8b6114008c6002612f1d565b9061140c600189613202565b9261141993929190613215565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611cb19050565b509050611491565b888861146c896001612f1d565b61147892859290613215565b60405161148692919061323f565b604051809103902090505b60008060006114a18c8c87611310565b925092509250600082856040516020016114c5929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612c72565b90506001600160a01b038116156115a657995097508996506115b595505050505050565b50929850919650909450505050505b93509350939050565b60008060006115cd8585611d82565b90925090508161163f57600185516115e59190613202565b84146116335760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016104ec565b50600091506103569050565b61164985826115be565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156116a2576116a26123ee565b60405190808252806020026020018201604052801561170057816020015b6116ed604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816116c05790505b50905060008367ffffffffffffffff81111561171e5761171e6123ee565b60405190808252806020026020018201604052801561176457816020015b60408051808201909152600081526060602082015281526020019060019003908161173c5790505b5090508367ffffffffffffffff811115611780576117806123ee565b6040519080825280602002602001820160405280156117c657816020015b60408051808201909152600081526060602082015281526020019060019003908161179e5790505b50945060006117d487611e39565b905060005b858110156119c7576000886020015182815181106117f9576117f9612bc5565b6020026020010151905060008960e00151838151811061181b5761181b612bc5565b6020026020010151905080156118675760405180604001604052806000151581526020018381525089848151811061185557611855612bc5565b602002602001018190525050506119b5565b600061187d8b60000151848d60a0015188611ed0565b809450819250505060008060008061189a8f60a001518887611f58565b9350935093509350831561191057828060200190518101906118bc91906132cf565b8b8d815181106118ce576118ce612bc5565b6020026020010181905250818a89815181106118ec576118ec612bc5565b602090810291909101015261190260018d612f1d565b9b50505050505050506119b5565b80801561191e575088602001515b1561193a57828060200190518101906119379190612f49565b92505b60405180604001604052808215158152602001848152508e898151811061196357611963612bc5565b60200260200101819052508e60200151888151811061198457611984612bc5565b60200260200101518a898151811061199e5761199e612bc5565b602002602001015160200181905250505050505050505b806119bf81612f30565b9150506117d9565b50836000036119da575050505050919050565b83835230876040015163a780bab660e01b856040516024016119fc91906133ca565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505089606001518a608001518b60a001518c604001518d60c0015189604051602001611a5d95949392919061342c565b60408051601f1981840301815290829052630556f18360e41b82526104ec95949392916004016134e9565b805160609060009081908490611a9f816002612f1d565b67ffffffffffffffff811115611ab757611ab76123ee565b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b50945060009350808403611b2657600060f81b85600081518110611b0757611b07612bc5565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611b3e57611b3e612bc5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611c00578360f81b868260010181518110611ba457611ba4612bc5565b60200101906001600160f81b031916908160001a90535084611bcd846001840160ff8816612110565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611c50565b600184019350828181518110611c1857611c18612bc5565b602001015160f81c60f81b868260010181518110611c3857611c38612bc5565b60200101906001600160f81b031916908160001a9053505b8015611c5f5760001901611b2c565b5083611c7083600060ff8716612110565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611b0757611b07612bc5565b8251600090600190831115611cc557600080fd5b611d16565b6000603a8210602f83111615611ce25750602f190190565b60478210604083111615611cf857506036190190565b60678210606083111615611d0e57506056190190565b5060ff919050565b60208501845b84811015611d7857611d338183015160001a611cca565b611d456001830184015160001a611cca565b60ff811460ff83141715611d5e57600094505050611d78565b60049190911b1760089490941b9390931792600201611d1c565b5050935093915050565b60008083518310611dd55760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016104ec565b6000848481518110611de957611de9612bc5565b016020015160f81c90508015611e1557611e0e85611e08866001612f1d565b83612110565b9250611e1a565b600092505b611e248185612f1d565b611e2f906001612f1d565b9150509250929050565b604080518082019091526000808252602082015281515160a0830151901590600090611e6c90639061b92360e01b612134565b905083608001518015611e7d575080155b15611eb4576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915291151582521515602082015292915050565b600060608260000151611f4c57826020015115611f305760018686604051602401611efc929190612ed9565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b1790529092509050610389565b611f4284611f3d8761303c565b612134565b8591509150610389565b50600195939450505050565b604080518082019091526000808252606060208301819052909160008415611f8b57611f8487876121b9565b9050611f9b565b611f98878761c3506121cd565b90505b3d8115611fbf576000611faf600083612260565b9095509350600191506109219050565b60048110612106576000611fd560006004612260565b90506000611fed6004611fe88186613202565b612260565b9050630556f18360e41b6120008361303c565b6001600160e01b031916036120ce5760008060008060008580602001905181019061202b919061351d565b945094509450945094508e6001600160a01b0316856001600160a01b0316036120c4576040518060600160405280866001600160a01b031681526020018581526020018481525060405160200161208291906135cd565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b5090995097506000965061092195505050505050565b5050505050612103565b81816040516020016120e19291906135e0565b60408051601f1981840301815291905260009750955086935061092192505050565b50505b5093509350935093565b825160009061211f8385612f1d565b111561212a57600080fd5b5091016020012090565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a79061c350906024016020604051808303818786fa935050505080156121a6575060408051601f3d908101601f191682019092526121a39181019061360f565b60015b6121b257506000610356565b9050610356565b60006121c683835a6121cd565b9392505050565b60006001600160a01b0384163b61224c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e747261637400000000000000000000000000000000000060648201526084016104ec565b6000808451602086018786fa949350505050565b60608167ffffffffffffffff81111561227b5761227b6123ee565b6040519080825280601f01601f1916602001820160405280156122a5576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156122fb579160200282015b828111156122fb57825182906122eb908261367b565b50916020019190600101906122d5565b5061230792915061230b565b5090565b8082111561230757600061231f8282612328565b5060010161230b565b50805461233490612b8b565b6000825580601f10612344575050565b601f016020900490600052602060002090810190610b6091905b80821115612307576000815560010161235e565b6001600160e01b031981168114610b6057600080fd5b60006020828403121561239a57600080fd5b81356121c681612372565b60008083601f8401126123b757600080fd5b50813567ffffffffffffffff8111156123cf57600080fd5b6020830191508360208285010111156123e757600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612427576124276123ee565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612456576124566123ee565b604052919050565b600067ffffffffffffffff821115612478576124786123ee565b50601f01601f191660200190565b60006124996124948461245e565b61242d565b90508281528383830111156124ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124d557600080fd5b6121c683833560208501612486565b600067ffffffffffffffff8211156124fe576124fe6123ee565b5060051b60200190565b600082601f83011261251957600080fd5b81356020612529612494836124e4565b82815260059290921b8401810191818101908684111561254857600080fd5b8286015b8481101561259d57803567ffffffffffffffff81111561256c5760008081fd5b8701603f8101891361257e5760008081fd5b61258f898683013560408401612486565b84525091830191830161254c565b509695505050505050565b600080600080606085870312156125be57600080fd5b843567ffffffffffffffff808211156125d657600080fd5b6125e2888389016123a5565b909650945060208701359150808211156125fb57600080fd5b612607888389016124c4565b9350604087013591508082111561261d57600080fd5b5061262a87828801612508565b91505092959194509250565b60005b83811015612651578181015183820152602001612639565b50506000910152565b60008151808452612672816020860160208601612636565b601f01601f19169290920160200192915050565b604081526000612699604083018561265a565b90506001600160a01b03831660208301529392505050565b600082601f8301126126c257600080fd5b813560206126d2612494836124e4565b82815260059290921b840181019181810190868411156126f157600080fd5b8286015b8481101561259d57803567ffffffffffffffff8111156127155760008081fd5b6127238986838b01016124c4565b8452509183019183016126f5565b60008060006040848603121561274657600080fd5b833567ffffffffffffffff8082111561275e57600080fd5b61276a878388016123a5565b9095509350602086013591508082111561278357600080fd5b50612790868287016126b1565b9150509250925092565b6000604080830181845280865180835260608601915060608160051b8701019250602080890160005b8381101561280457888603605f1901855281518051151587528301518387018890526127f18888018261265a565b96505093820193908201906001016127c3565b50508395506001600160a01b0388168188015250505050509392505050565b6000806000806040858703121561283957600080fd5b843567ffffffffffffffff8082111561285157600080fd5b61285d888389016123a5565b9096509450602087013591508082111561287657600080fd5b50612883878288016123a5565b95989497509550505050565b6080815260006128a2608083018761265a565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156128e157600080fd5b843567ffffffffffffffff808211156128f957600080fd5b612905888389016123a5565b9096509450602087013591508082111561291e57600080fd5b612607888389016126b1565b60008060008060008060a0878903121561294357600080fd5b863567ffffffffffffffff8082111561295b57600080fd5b6129678a838b016123a5565b9098509650602089013591508082111561298057600080fd5b61298c8a838b016124c4565b955060408901359150808211156129a257600080fd5b6129ae8a838b01612508565b9450606089013591506129c082612372565b909250608088013590808211156129d657600080fd5b506129e389828a016124c4565b9150509295509295509295565b600060208284031215612a0257600080fd5b813567ffffffffffffffff811115612a1957600080fd5b612a2584828501612508565b949350505050565b600080600060408486031215612a4257600080fd5b833567ffffffffffffffff80821115612a5a57600080fd5b612a66878388016123a5565b90955093506020860135915080821115612a7f57600080fd5b50612790868287016124c4565b60008060208385031215612a9f57600080fd5b823567ffffffffffffffff811115612ab657600080fd5b612ac2858286016123a5565b90969095509350505050565b600060208284031215612ae057600080fd5b5035919050565b6020815260006121c6602083018461265a565b600080600060408486031215612b0f57600080fd5b833567ffffffffffffffff80821115612b2757600080fd5b612b33878388016123a5565b90955093506020860135915080821115612b4c57600080fd5b5061279086828701612508565b6001600160a01b0381168114610b6057600080fd5b600060208284031215612b8057600080fd5b81356121c681612b59565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600082601f830112612bec57600080fd5b8151612bfa6124948261245e565b818152846020838601011115612c0f57600080fd5b612a25826020830160208701612636565b60008060408385031215612c3357600080fd5b825167ffffffffffffffff811115612c4a57600080fd5b612c5685828601612bdb565b9250506020830151612c6781612b59565b809150509250929050565b600060208284031215612c8457600080fd5b81516121c681612b59565b8015158114610b6057600080fd5b60008060408385031215612cb057600080fd5b823567ffffffffffffffff80821115612cc857600080fd5b818501915085601f830112612cdc57600080fd5b81356020612cec612494836124e4565b82815260059290921b84018101918181019089841115612d0b57600080fd5b948201945b83861015612d32578535612d2381612c8f565b82529482019490820190612d10565b96505086013592505080821115612d4857600080fd5b50611e2f858286016126b1565b600080600080600060a08688031215612d6d57600080fd5b612d778635612c8f565b85359450612d886020870135612b59565b6020860135935067ffffffffffffffff8060408801351115612da957600080fd5b612db98860408901358901612508565b93508060608801351115612dcc57600080fd5b612ddc88606089013589016124c4565b92508060808801351115612def57600080fd5b6080870135870188601f820112612e0557600080fd5b612e1261249482356124e4565b81358082526020808301929160051b8401018b1015612e3057600080fd5b602083015b6020843560051b850101811015612ec7578481351115612e5457600080fd5b803584016040818e03601f19011215612e6c57600080fd5b612e74612404565b612e816020830135612372565b602082013581528660408301351115612e9957600080fd5b612eac8e602060408501358501016124c4565b60208201528085525050602083019250602081019050612e35565b50809450505050509295509295909350565b604081526000612eec604083018561265a565b8281036020840152612efe818561265a565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612f07565b600060018201612f4257612f42612f07565b5060010190565b600060208284031215612f5b57600080fd5b815167ffffffffffffffff811115612f7257600080fd5b612a2584828501612bdb565b600081518084526020808501808196508360051b8101915082860160005b85811015612fc6578284038952612fb484835161265a565b98850198935090840190600101612f9c565b5091979650505050505050565b60a081526000612fe660a083018861265a565b8281036020840152612ff8818861265a565b9050828103604084015261300c8187612f7e565b90506001600160e01b0319851660608401528281036080840152613030818561265a565b98975050505050505050565b6000815160208301516001600160e01b03198082169350600483101561306c5780818460040360031b1b83161693505b505050919050565b600080604080848603121561308857600080fd5b835161309381612372565b8093505060208085015167ffffffffffffffff808211156130b357600080fd5b818701915087601f8301126130c757600080fd5b81516130d5612494826124e4565b81815260059190911b8301840190848101908a8311156130f457600080fd5b8585015b83811015613178578051858111156131105760008081fd5b8601808d03601f19018913156131265760008081fd5b61312e612404565b8882015161ffff811681146131435760008081fd5b8152818a0151878111156131575760008081fd5b6131658f8b83860101612bdb565b828b0152508452509186019186016130f8565b50809750505050505050509250929050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156131f457888303603f190185528151805161ffff1684528701518784018790526131e18785018261265a565b95880195935050908601906001016131b1565b509098975050505050505050565b8181038181111561035657610356612f07565b6000808585111561322557600080fd5b8386111561323257600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f83011261326057600080fd5b81516020613270612494836124e4565b82815260059290921b8401810191818101908684111561328f57600080fd5b8286015b8481101561259d57805167ffffffffffffffff8111156132b35760008081fd5b6132c18986838b0101612bdb565b845250918301918301613293565b6000602082840312156132e157600080fd5b815167ffffffffffffffff808211156132f957600080fd5b908301906060828603121561330d57600080fd5b604051606081018181108382111715613328576133286123ee565b604052825161333681612b59565b815260208301518281111561334a57600080fd5b6133568782860161324f565b60208301525060408301518281111561336e57600080fd5b61337a87828601612bdb565b60408301525095945050505050565b6001600160a01b03815116825260006020820151606060208501526133b16060850182612f7e565b905060408301518482036040860152612efe828261265a565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561341f57603f1988860301845261340d858351613389565b945092850192908501906001016133f1565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261345860a0850188612f7e565b848103606086015261346a818861265a565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156134d657858303601f19018552815180516001600160e01b03191684528801518884018890526134c38885018261265a565b958901959350509087019060010161348d565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061350b60a0830187612f7e565b828103604084015261300c818761265a565b600080600080600060a0868803121561353557600080fd5b855161354081612b59565b602087015190955067ffffffffffffffff8082111561355e57600080fd5b61356a89838a0161324f565b9550604088015191508082111561358057600080fd5b61358c89838a01612bdb565b94506060880151915061359e82612372565b6080880151919350808211156135b357600080fd5b506135c088828901612bdb565b9150509295509295909350565b6020815260006121c66020830184613389565b600083516135f2818460208801612636565b835190830190613606818360208801612636565b01949350505050565b60006020828403121561362157600080fd5b81516121c681612c8f565b601f82111561367657600081815260208120601f850160051c810160208610156136535750805b601f850160051c820191505b818110156136725782815560010161365f565b5050505b505050565b815167ffffffffffffffff811115613695576136956123ee565b6136a9816136a38454612b8b565b8461362c565b602080601f8311600181146136de57600084156136c65750858301515b600019600386901b1c1916600185901b178555613672565b600085815260208120601f198616915b8281101561370d578886015182559484019460019091019084016136ee565b508582101561372b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea264697066735822122035159d52a0e04cc6441dfed903a33c70a9ca44587807027ddef3eb9b76c1cb2264736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612388565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046125a8565b61035c565b60405161015a929190612686565b610197610192366004612731565b610392565b60405161015a92919061279a565b6101b86101b3366004612823565b61047f565b60405161015a949392919061288f565b6101d061056f565b005b6101976101e03660046128cb565b610583565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461292a565b6105ab565b6101d06102563660046129f0565b61064e565b610176610269366004612a2d565b61066d565b61028161027c366004612a8c565b610766565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b4366004612ace565b61078c565b60405161015a9190612ae7565b6101b86102d4366004612afa565b610838565b6101976102e7366004612823565b61092a565b6101766102fa366004612823565b61096e565b6101b861030d366004612a8c565b6109e0565b6101d0610320366004612b6e565b610ad3565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b604051806020016040528060008152506105ab565b915091505b94509492505050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b8282101561046a5783829060005260206000200180546103dd90612b8b565b80601f016020809104026020016040519081016040528092919081815260200182805461040990612b8b565b80156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050815260200190600101906103be565b50505050610583565b91509150935093915050565b6060600080808080808061049d8c8c8c8c636dc4fb7360e01b610b63565b93509350935093506000846000815181106104ba576104ba612bc5565b6020026020010151905080600001516104f5578060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60405180910390fd5b81511561054757600080838060200190518101906105139190612c20565b91509150600083602001518060200190518101906105319190612c72565b929b509199509750939550610564945050505050565b61055681602001518585610ee9565b985098509850985050505050505b945094509450949050565b61057761104a565b61058160006110a4565b565b606060006103848686868663b4a8580160e01b6040518060200160405280600081525061110c565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105c757905050905086816000815181106105f2576105f2612bc5565b602002602001018190525060008061060e8b8b858b8b8b61110c565b9150915060008260008151811061062757610627612bc5565b6020026020010151905061063a8161128d565b602001519b909a5098505050505050505050565b61065661104a565b80516106699060019060208401906122b5565b5050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b828210156107455783829060005260206000200180546106b890612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612b8b565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081526020019060010190610699565b5050505063e0a8541260e01b604051806020016040528060008152506105ab565b60008060008060008061077b88886000611310565b919750955093505050509250925092565b6001818154811061079c57600080fd5b9060005260206000200160009150905080546107b790612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546107e390612b8b565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b505050505081565b6060600080600080610884600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115be9050565b60405160240161089691815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f343100000000000000000000000000000000000000000000000000000000179052815190810190915260008082529192508190610906908b908b9086908c90636dc4fb7360e01b906105ab565b9150915061091582828a610ee9565b96509650965096505050505b93509350935093565b60606000808061095d888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b63565b50919a909950975050505050505050565b6060600080806109a1888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b63565b5050915091506000826000815181106109bc576109bc612bc5565b602002602001015190506109cf8161128d565b602001519890975095505050505050565b60606000806000610ac386866001805480602002602001604051908101604052809291908181526020016000905b82821015610aba578382906000526020600020018054610a2d90612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990612b8b565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b505050505081526020019060010190610a0e565b50505050610838565b9299919850965090945092505050565b610adb61104a565b6001600160a01b038116610b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ec565b610b60816110a4565b50565b60606000606080610bc760405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610be68b8d018d612c9d565b90925090506060610bf98a8c018c612d55565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610c3357600080fd5b805167ffffffffffffffff811115610c4d57610c4d6123ee565b604051908082528060200260200182016040528015610c8057816020015b6060815260200190600190039081610c6b5790505b506020850152805167ffffffffffffffff811115610ca057610ca06123ee565b604051908082528060200260200182016040528015610cc9578160200160208202803683370190505b5060e08501526000805b8251811015610eb7578251600090849083908110610cf357610cf3612bc5565b6020026020010151600001516001600160e01b03191603610d5257828181518110610d2057610d20612bc5565b60200260200101516020015186602001518281518110610d4257610d42612bc5565b6020026020010181905250610ea5565b848281518110610d6457610d64612bc5565b602002602001015115610ddb5760018660e001518281518110610d8957610d89612bc5565b602002602001019015159081151581525050838281518110610dad57610dad612bc5565b602002602001015186602001518281518110610dcb57610dcb612bc5565b6020026020010181905250610e97565b828181518110610ded57610ded612bc5565b602002602001015160000151848381518110610e0b57610e0b612bc5565b6020026020010151848381518110610e2557610e25612bc5565b602002602001015160200151604051602401610e42929190612ed9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e8b57610e8b612bc5565b60200260200101819052505b610ea2826001612f1d565b91505b80610eaf81612f30565b915050610cd3565b50610ec18561167d565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610f059190612f49565b9050600080610f1383611a88565b91509150600081604051602401610f2c91815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f869187918e9101612686565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610fd5959493929190612fd3565b600060405180830381865afa158015610ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101a9190810190612c20565b915091506000828060200190518101906110349190612c72565b979f979e50909b50959950505050505050505050565b6000546001600160a01b031633146105815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ec565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080600061111d8a8a610766565b919450849350909150506001600160a01b038216611167576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383163b6111a8576040517f4981ac0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b81528315159261127d929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff81111561124c5761124c6123ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b50905261167d565b9450505050965096945050505050565b8051610b6057602081015163ca7a4e7560e01b906112aa9061303c565b6001600160e01b031916036112f157600081602001518060200190518101906112d39190613074565b9150508060405163ca7a4e7560e01b81526004016104ec919061318a565b8060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60008060008086868681811061132857611328612bc5565b919091013560f81c915050600081900361134c5750600092508291508390506115b5565b60006113588287612f1d565b611363906001612f1d565b905060008260421480156113a95750888861137f896001612f1d565b81811061138e5761138e612bc5565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156113e7575088886113bd600185613202565b8181106113cc576113cc612bc5565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561145f57611457600060408b8b6114008c6002612f1d565b9061140c600189613202565b9261141993929190613215565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611cb19050565b509050611491565b888861146c896001612f1d565b61147892859290613215565b60405161148692919061323f565b604051809103902090505b60008060006114a18c8c87611310565b925092509250600082856040516020016114c5929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612c72565b90506001600160a01b038116156115a657995097508996506115b595505050505050565b50929850919650909450505050505b93509350939050565b60008060006115cd8585611d82565b90925090508161163f57600185516115e59190613202565b84146116335760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016104ec565b50600091506103569050565b61164985826115be565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156116a2576116a26123ee565b60405190808252806020026020018201604052801561170057816020015b6116ed604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816116c05790505b50905060008367ffffffffffffffff81111561171e5761171e6123ee565b60405190808252806020026020018201604052801561176457816020015b60408051808201909152600081526060602082015281526020019060019003908161173c5790505b5090508367ffffffffffffffff811115611780576117806123ee565b6040519080825280602002602001820160405280156117c657816020015b60408051808201909152600081526060602082015281526020019060019003908161179e5790505b50945060006117d487611e39565b905060005b858110156119c7576000886020015182815181106117f9576117f9612bc5565b6020026020010151905060008960e00151838151811061181b5761181b612bc5565b6020026020010151905080156118675760405180604001604052806000151581526020018381525089848151811061185557611855612bc5565b602002602001018190525050506119b5565b600061187d8b60000151848d60a0015188611ed0565b809450819250505060008060008061189a8f60a001518887611f58565b9350935093509350831561191057828060200190518101906118bc91906132cf565b8b8d815181106118ce576118ce612bc5565b6020026020010181905250818a89815181106118ec576118ec612bc5565b602090810291909101015261190260018d612f1d565b9b50505050505050506119b5565b80801561191e575088602001515b1561193a57828060200190518101906119379190612f49565b92505b60405180604001604052808215158152602001848152508e898151811061196357611963612bc5565b60200260200101819052508e60200151888151811061198457611984612bc5565b60200260200101518a898151811061199e5761199e612bc5565b602002602001015160200181905250505050505050505b806119bf81612f30565b9150506117d9565b50836000036119da575050505050919050565b83835230876040015163a780bab660e01b856040516024016119fc91906133ca565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505089606001518a608001518b60a001518c604001518d60c0015189604051602001611a5d95949392919061342c565b60408051601f1981840301815290829052630556f18360e41b82526104ec95949392916004016134e9565b805160609060009081908490611a9f816002612f1d565b67ffffffffffffffff811115611ab757611ab76123ee565b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b50945060009350808403611b2657600060f81b85600081518110611b0757611b07612bc5565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611b3e57611b3e612bc5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611c00578360f81b868260010181518110611ba457611ba4612bc5565b60200101906001600160f81b031916908160001a90535084611bcd846001840160ff8816612110565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611c50565b600184019350828181518110611c1857611c18612bc5565b602001015160f81c60f81b868260010181518110611c3857611c38612bc5565b60200101906001600160f81b031916908160001a9053505b8015611c5f5760001901611b2c565b5083611c7083600060ff8716612110565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611b0757611b07612bc5565b8251600090600190831115611cc557600080fd5b611d16565b6000603a8210602f83111615611ce25750602f190190565b60478210604083111615611cf857506036190190565b60678210606083111615611d0e57506056190190565b5060ff919050565b60208501845b84811015611d7857611d338183015160001a611cca565b611d456001830184015160001a611cca565b60ff811460ff83141715611d5e57600094505050611d78565b60049190911b1760089490941b9390931792600201611d1c565b5050935093915050565b60008083518310611dd55760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016104ec565b6000848481518110611de957611de9612bc5565b016020015160f81c90508015611e1557611e0e85611e08866001612f1d565b83612110565b9250611e1a565b600092505b611e248185612f1d565b611e2f906001612f1d565b9150509250929050565b604080518082019091526000808252602082015281515160a0830151901590600090611e6c90639061b92360e01b612134565b905083608001518015611e7d575080155b15611eb4576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915291151582521515602082015292915050565b600060608260000151611f4c57826020015115611f305760018686604051602401611efc929190612ed9565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b1790529092509050610389565b611f4284611f3d8761303c565b612134565b8591509150610389565b50600195939450505050565b604080518082019091526000808252606060208301819052909160008415611f8b57611f8487876121b9565b9050611f9b565b611f98878761c3506121cd565b90505b3d8115611fbf576000611faf600083612260565b9095509350600191506109219050565b60048110612106576000611fd560006004612260565b90506000611fed6004611fe88186613202565b612260565b9050630556f18360e41b6120008361303c565b6001600160e01b031916036120ce5760008060008060008580602001905181019061202b919061351d565b945094509450945094508e6001600160a01b0316856001600160a01b0316036120c4576040518060600160405280866001600160a01b031681526020018581526020018481525060405160200161208291906135cd565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b5090995097506000965061092195505050505050565b5050505050612103565b81816040516020016120e19291906135e0565b60408051601f1981840301815291905260009750955086935061092192505050565b50505b5093509350935093565b825160009061211f8385612f1d565b111561212a57600080fd5b5091016020012090565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a79061c350906024016020604051808303818786fa935050505080156121a6575060408051601f3d908101601f191682019092526121a39181019061360f565b60015b6121b257506000610356565b9050610356565b60006121c683835a6121cd565b9392505050565b60006001600160a01b0384163b61224c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e747261637400000000000000000000000000000000000060648201526084016104ec565b6000808451602086018786fa949350505050565b60608167ffffffffffffffff81111561227b5761227b6123ee565b6040519080825280601f01601f1916602001820160405280156122a5576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156122fb579160200282015b828111156122fb57825182906122eb908261367b565b50916020019190600101906122d5565b5061230792915061230b565b5090565b8082111561230757600061231f8282612328565b5060010161230b565b50805461233490612b8b565b6000825580601f10612344575050565b601f016020900490600052602060002090810190610b6091905b80821115612307576000815560010161235e565b6001600160e01b031981168114610b6057600080fd5b60006020828403121561239a57600080fd5b81356121c681612372565b60008083601f8401126123b757600080fd5b50813567ffffffffffffffff8111156123cf57600080fd5b6020830191508360208285010111156123e757600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612427576124276123ee565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612456576124566123ee565b604052919050565b600067ffffffffffffffff821115612478576124786123ee565b50601f01601f191660200190565b60006124996124948461245e565b61242d565b90508281528383830111156124ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124d557600080fd5b6121c683833560208501612486565b600067ffffffffffffffff8211156124fe576124fe6123ee565b5060051b60200190565b600082601f83011261251957600080fd5b81356020612529612494836124e4565b82815260059290921b8401810191818101908684111561254857600080fd5b8286015b8481101561259d57803567ffffffffffffffff81111561256c5760008081fd5b8701603f8101891361257e5760008081fd5b61258f898683013560408401612486565b84525091830191830161254c565b509695505050505050565b600080600080606085870312156125be57600080fd5b843567ffffffffffffffff808211156125d657600080fd5b6125e2888389016123a5565b909650945060208701359150808211156125fb57600080fd5b612607888389016124c4565b9350604087013591508082111561261d57600080fd5b5061262a87828801612508565b91505092959194509250565b60005b83811015612651578181015183820152602001612639565b50506000910152565b60008151808452612672816020860160208601612636565b601f01601f19169290920160200192915050565b604081526000612699604083018561265a565b90506001600160a01b03831660208301529392505050565b600082601f8301126126c257600080fd5b813560206126d2612494836124e4565b82815260059290921b840181019181810190868411156126f157600080fd5b8286015b8481101561259d57803567ffffffffffffffff8111156127155760008081fd5b6127238986838b01016124c4565b8452509183019183016126f5565b60008060006040848603121561274657600080fd5b833567ffffffffffffffff8082111561275e57600080fd5b61276a878388016123a5565b9095509350602086013591508082111561278357600080fd5b50612790868287016126b1565b9150509250925092565b6000604080830181845280865180835260608601915060608160051b8701019250602080890160005b8381101561280457888603605f1901855281518051151587528301518387018890526127f18888018261265a565b96505093820193908201906001016127c3565b50508395506001600160a01b0388168188015250505050509392505050565b6000806000806040858703121561283957600080fd5b843567ffffffffffffffff8082111561285157600080fd5b61285d888389016123a5565b9096509450602087013591508082111561287657600080fd5b50612883878288016123a5565b95989497509550505050565b6080815260006128a2608083018761265a565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156128e157600080fd5b843567ffffffffffffffff808211156128f957600080fd5b612905888389016123a5565b9096509450602087013591508082111561291e57600080fd5b612607888389016126b1565b60008060008060008060a0878903121561294357600080fd5b863567ffffffffffffffff8082111561295b57600080fd5b6129678a838b016123a5565b9098509650602089013591508082111561298057600080fd5b61298c8a838b016124c4565b955060408901359150808211156129a257600080fd5b6129ae8a838b01612508565b9450606089013591506129c082612372565b909250608088013590808211156129d657600080fd5b506129e389828a016124c4565b9150509295509295509295565b600060208284031215612a0257600080fd5b813567ffffffffffffffff811115612a1957600080fd5b612a2584828501612508565b949350505050565b600080600060408486031215612a4257600080fd5b833567ffffffffffffffff80821115612a5a57600080fd5b612a66878388016123a5565b90955093506020860135915080821115612a7f57600080fd5b50612790868287016124c4565b60008060208385031215612a9f57600080fd5b823567ffffffffffffffff811115612ab657600080fd5b612ac2858286016123a5565b90969095509350505050565b600060208284031215612ae057600080fd5b5035919050565b6020815260006121c6602083018461265a565b600080600060408486031215612b0f57600080fd5b833567ffffffffffffffff80821115612b2757600080fd5b612b33878388016123a5565b90955093506020860135915080821115612b4c57600080fd5b5061279086828701612508565b6001600160a01b0381168114610b6057600080fd5b600060208284031215612b8057600080fd5b81356121c681612b59565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600082601f830112612bec57600080fd5b8151612bfa6124948261245e565b818152846020838601011115612c0f57600080fd5b612a25826020830160208701612636565b60008060408385031215612c3357600080fd5b825167ffffffffffffffff811115612c4a57600080fd5b612c5685828601612bdb565b9250506020830151612c6781612b59565b809150509250929050565b600060208284031215612c8457600080fd5b81516121c681612b59565b8015158114610b6057600080fd5b60008060408385031215612cb057600080fd5b823567ffffffffffffffff80821115612cc857600080fd5b818501915085601f830112612cdc57600080fd5b81356020612cec612494836124e4565b82815260059290921b84018101918181019089841115612d0b57600080fd5b948201945b83861015612d32578535612d2381612c8f565b82529482019490820190612d10565b96505086013592505080821115612d4857600080fd5b50611e2f858286016126b1565b600080600080600060a08688031215612d6d57600080fd5b612d778635612c8f565b85359450612d886020870135612b59565b6020860135935067ffffffffffffffff8060408801351115612da957600080fd5b612db98860408901358901612508565b93508060608801351115612dcc57600080fd5b612ddc88606089013589016124c4565b92508060808801351115612def57600080fd5b6080870135870188601f820112612e0557600080fd5b612e1261249482356124e4565b81358082526020808301929160051b8401018b1015612e3057600080fd5b602083015b6020843560051b850101811015612ec7578481351115612e5457600080fd5b803584016040818e03601f19011215612e6c57600080fd5b612e74612404565b612e816020830135612372565b602082013581528660408301351115612e9957600080fd5b612eac8e602060408501358501016124c4565b60208201528085525050602083019250602081019050612e35565b50809450505050509295509295909350565b604081526000612eec604083018561265a565b8281036020840152612efe818561265a565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612f07565b600060018201612f4257612f42612f07565b5060010190565b600060208284031215612f5b57600080fd5b815167ffffffffffffffff811115612f7257600080fd5b612a2584828501612bdb565b600081518084526020808501808196508360051b8101915082860160005b85811015612fc6578284038952612fb484835161265a565b98850198935090840190600101612f9c565b5091979650505050505050565b60a081526000612fe660a083018861265a565b8281036020840152612ff8818861265a565b9050828103604084015261300c8187612f7e565b90506001600160e01b0319851660608401528281036080840152613030818561265a565b98975050505050505050565b6000815160208301516001600160e01b03198082169350600483101561306c5780818460040360031b1b83161693505b505050919050565b600080604080848603121561308857600080fd5b835161309381612372565b8093505060208085015167ffffffffffffffff808211156130b357600080fd5b818701915087601f8301126130c757600080fd5b81516130d5612494826124e4565b81815260059190911b8301840190848101908a8311156130f457600080fd5b8585015b83811015613178578051858111156131105760008081fd5b8601808d03601f19018913156131265760008081fd5b61312e612404565b8882015161ffff811681146131435760008081fd5b8152818a0151878111156131575760008081fd5b6131658f8b83860101612bdb565b828b0152508452509186019186016130f8565b50809750505050505050509250929050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156131f457888303603f190185528151805161ffff1684528701518784018790526131e18785018261265a565b95880195935050908601906001016131b1565b509098975050505050505050565b8181038181111561035657610356612f07565b6000808585111561322557600080fd5b8386111561323257600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f83011261326057600080fd5b81516020613270612494836124e4565b82815260059290921b8401810191818101908684111561328f57600080fd5b8286015b8481101561259d57805167ffffffffffffffff8111156132b35760008081fd5b6132c18986838b0101612bdb565b845250918301918301613293565b6000602082840312156132e157600080fd5b815167ffffffffffffffff808211156132f957600080fd5b908301906060828603121561330d57600080fd5b604051606081018181108382111715613328576133286123ee565b604052825161333681612b59565b815260208301518281111561334a57600080fd5b6133568782860161324f565b60208301525060408301518281111561336e57600080fd5b61337a87828601612bdb565b60408301525095945050505050565b6001600160a01b03815116825260006020820151606060208501526133b16060850182612f7e565b905060408301518482036040860152612efe828261265a565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561341f57603f1988860301845261340d858351613389565b945092850192908501906001016133f1565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261345860a0850188612f7e565b848103606086015261346a818861265a565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156134d657858303601f19018552815180516001600160e01b03191684528801518884018890526134c38885018261265a565b958901959350509087019060010161348d565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061350b60a0830187612f7e565b828103604084015261300c818761265a565b600080600080600060a0868803121561353557600080fd5b855161354081612b59565b602087015190955067ffffffffffffffff8082111561355e57600080fd5b61356a89838a0161324f565b9550604088015191508082111561358057600080fd5b61358c89838a01612bdb565b94506060880151915061359e82612372565b6080880151919350808211156135b357600080fd5b506135c088828901612bdb565b9150509295509295909350565b6020815260006121c66020830184613389565b600083516135f2818460208801612636565b835190830190613606818360208801612636565b01949350505050565b60006020828403121561362157600080fd5b81516121c681612c8f565b601f82111561367657600081815260208120601f850160051c810160208610156136535750805b601f850160051c820191505b818110156136725782815560010161365f565b5050505b505050565b815167ffffffffffffffff811115613695576136956123ee565b6136a9816136a38454612b8b565b8461362c565b602080601f8311600181146136de57600084156136c65750858301515b600019600386901b1c1916600185901b178555613672565b600085815260208120601f198616915b8281101561370d578886015182559484019460019091019084016136ee565b508582101561372b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea264697066735822122035159d52a0e04cc6441dfed903a33c70a9ca44587807027ddef3eb9b76c1cb2264736f6c63430008110033", "devdoc": { "kind": "dev", "methods": { @@ -643,7 +718,7 @@ "storageLayout": { "storage": [ { - "astId": 444, + "astId": 7, "contract": "contracts/utils/UniversalResolver.sol:UniversalResolver", "label": "_owner", "offset": 0, @@ -651,7 +726,7 @@ "type": "t_address" }, { - "astId": 19166, + "astId": 1511, "contract": "contracts/utils/UniversalResolver.sol:UniversalResolver", "label": "batchGatewayURLs", "offset": 0, diff --git a/deployments/goerli/solcInputs/a268c4117fbf03c1acd17a54ea249795.json b/deployments/goerli/solcInputs/a268c4117fbf03c1acd17a54ea249795.json new file mode 100644 index 00000000..f271bb76 --- /dev/null +++ b/deployments/goerli/solcInputs/a268c4117fbf03c1acd17a54ea249795.json @@ -0,0 +1,101 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "contracts/registry/ENS.sol": { + "content": "pragma solidity >=0.8.4;\n\ninterface ENS {\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n // Logged when an operator is added or removed.\n event ApprovalForAll(\n address indexed owner,\n address indexed operator,\n bool approved\n );\n\n function setRecord(\n bytes32 node,\n address owner,\n address resolver,\n uint64 ttl\n ) external;\n\n function setSubnodeRecord(\n bytes32 node,\n bytes32 label,\n address owner,\n address resolver,\n uint64 ttl\n ) external;\n\n function setSubnodeOwner(\n bytes32 node,\n bytes32 label,\n address owner\n ) external returns (bytes32);\n\n function setResolver(bytes32 node, address resolver) external;\n\n function setOwner(bytes32 node, address owner) external;\n\n function setTTL(bytes32 node, uint64 ttl) external;\n\n function setApprovalForAll(address operator, bool approved) external;\n\n function owner(bytes32 node) external view returns (address);\n\n function resolver(bytes32 node) external view returns (address);\n\n function ttl(bytes32 node) external view returns (uint64);\n\n function recordExists(bytes32 node) external view returns (bool);\n\n function isApprovedForAll(\n address owner,\n address operator\n ) external view returns (bool);\n}\n" + }, + "contracts/resolvers/profiles/IABIResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IABIResolver {\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\n\n /**\n * Returns the ABI associated with an ENS node.\n * Defined in EIP205.\n * @param node The ENS node to query\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\n * @return contentType The content type of the return value\n * @return data The ABI data\n */\n function ABI(\n bytes32 node,\n uint256 contentTypes\n ) external view returns (uint256, bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IAddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/**\n * Interface for the new (multicoin) addr function.\n */\ninterface IAddressResolver {\n event AddressChanged(\n bytes32 indexed node,\n uint256 coinType,\n bytes newAddress\n );\n\n function addr(\n bytes32 node,\n uint256 coinType\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IAddrResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/**\n * Interface for the legacy (ETH-only) addr function.\n */\ninterface IAddrResolver {\n event AddrChanged(bytes32 indexed node, address a);\n\n /**\n * Returns the address associated with an ENS node.\n * @param node The ENS node to query.\n * @return The associated address.\n */\n function addr(bytes32 node) external view returns (address payable);\n}\n" + }, + "contracts/resolvers/profiles/IContentHashResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IContentHashResolver {\n event ContenthashChanged(bytes32 indexed node, bytes hash);\n\n /**\n * Returns the contenthash associated with an ENS node.\n * @param node The ENS node to query.\n * @return The associated contenthash.\n */\n function contenthash(bytes32 node) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IDNSRecordResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IDNSRecordResolver {\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\n event DNSRecordChanged(\n bytes32 indexed node,\n bytes name,\n uint16 resource,\n bytes record\n );\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\n\n /**\n * Obtain a DNS record.\n * @param node the namehash of the node for which to fetch the record\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\n * @return the DNS record in wire format if present, otherwise empty\n */\n function dnsRecord(\n bytes32 node,\n bytes32 name,\n uint16 resource\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IDNSZoneResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IDNSZoneResolver {\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\n event DNSZonehashChanged(\n bytes32 indexed node,\n bytes lastzonehash,\n bytes zonehash\n );\n\n /**\n * zonehash obtains the hash for the zone.\n * @param node The ENS node to query.\n * @return The associated contenthash.\n */\n function zonehash(bytes32 node) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IExtendedResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IExtendedResolver {\n function resolve(\n bytes memory name,\n bytes memory data\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IInterfaceResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IInterfaceResolver {\n event InterfaceChanged(\n bytes32 indexed node,\n bytes4 indexed interfaceID,\n address implementer\n );\n\n /**\n * Returns the address of a contract that implements the specified interface for this name.\n * If an implementer has not been set for this interfaceID and name, the resolver will query\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\n * will be returned.\n * @param node The ENS node to query.\n * @param interfaceID The EIP 165 interface ID to check for.\n * @return The address that implements this interface, or 0 if the interface is unsupported.\n */\n function interfaceImplementer(\n bytes32 node,\n bytes4 interfaceID\n ) external view returns (address);\n}\n" + }, + "contracts/resolvers/profiles/INameResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface INameResolver {\n event NameChanged(bytes32 indexed node, string name);\n\n /**\n * Returns the name associated with an ENS node, for reverse records.\n * Defined in EIP181.\n * @param node The ENS node to query.\n * @return The associated name.\n */\n function name(bytes32 node) external view returns (string memory);\n}\n" + }, + "contracts/resolvers/profiles/IPubkeyResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IPubkeyResolver {\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\n\n /**\n * Returns the SECP256k1 public key associated with an ENS node.\n * Defined in EIP 619.\n * @param node The ENS node to query\n * @return x The X coordinate of the curve point for the public key.\n * @return y The Y coordinate of the curve point for the public key.\n */\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\n}\n" + }, + "contracts/resolvers/profiles/ITextResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface ITextResolver {\n event TextChanged(\n bytes32 indexed node,\n string indexed indexedKey,\n string key,\n string value\n );\n\n /**\n * Returns the text data associated with an ENS node and key.\n * @param node The ENS node to query.\n * @param key The text data key to query.\n * @return The associated text data.\n */\n function text(\n bytes32 node,\n string calldata key\n ) external view returns (string memory);\n}\n" + }, + "contracts/resolvers/Resolver.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport \"./profiles/IABIResolver.sol\";\nimport \"./profiles/IAddressResolver.sol\";\nimport \"./profiles/IAddrResolver.sol\";\nimport \"./profiles/IContentHashResolver.sol\";\nimport \"./profiles/IDNSRecordResolver.sol\";\nimport \"./profiles/IDNSZoneResolver.sol\";\nimport \"./profiles/IInterfaceResolver.sol\";\nimport \"./profiles/INameResolver.sol\";\nimport \"./profiles/IPubkeyResolver.sol\";\nimport \"./profiles/ITextResolver.sol\";\nimport \"./profiles/IExtendedResolver.sol\";\n\n/**\n * A generic resolver interface which includes all the functions including the ones deprecated\n */\ninterface Resolver is\n IERC165,\n IABIResolver,\n IAddressResolver,\n IAddrResolver,\n IContentHashResolver,\n IDNSRecordResolver,\n IDNSZoneResolver,\n IInterfaceResolver,\n INameResolver,\n IPubkeyResolver,\n ITextResolver,\n IExtendedResolver\n{\n /* Deprecated events */\n event ContentChanged(bytes32 indexed node, bytes32 hash);\n\n function setApprovalForAll(address, bool) external;\n\n function approve(bytes32 node, address delegate, bool approved) external;\n\n function isApprovedForAll(address account, address operator) external;\n\n function isApprovedFor(\n address owner,\n bytes32 node,\n address delegate\n ) external;\n\n function setABI(\n bytes32 node,\n uint256 contentType,\n bytes calldata data\n ) external;\n\n function setAddr(bytes32 node, address addr) external;\n\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\n\n function setContenthash(bytes32 node, bytes calldata hash) external;\n\n function setDnsrr(bytes32 node, bytes calldata data) external;\n\n function setName(bytes32 node, string calldata _name) external;\n\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\n\n function setText(\n bytes32 node,\n string calldata key,\n string calldata value\n ) external;\n\n function setInterface(\n bytes32 node,\n bytes4 interfaceID,\n address implementer\n ) external;\n\n function multicall(\n bytes[] calldata data\n ) external returns (bytes[] memory results);\n\n function multicallWithNodeCheck(\n bytes32 nodehash,\n bytes[] calldata data\n ) external returns (bytes[] memory results);\n\n /* Deprecated functions */\n function content(bytes32 node) external view returns (bytes32);\n\n function multihash(bytes32 node) external view returns (bytes memory);\n\n function setContent(bytes32 node, bytes32 hash) external;\n\n function setMultihash(bytes32 node, bytes calldata hash) external;\n}\n" + }, + "contracts/utils/HexUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nlibrary HexUtils {\n /**\n * @dev Attempts to parse bytes32 from a hex string\n * @param str The string to parse\n * @param idx The offset to start parsing at\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\n */\n function hexStringToBytes32(\n bytes memory str,\n uint256 idx,\n uint256 lastIdx\n ) internal pure returns (bytes32 r, bool valid) {\n valid = true;\n assembly {\n // check that the index to read to is not past the end of the string\n if gt(lastIdx, mload(str)) {\n revert(0, 0)\n }\n\n function getHex(c) -> ascii {\n // chars 48-57: 0-9\n if and(gt(c, 47), lt(c, 58)) {\n ascii := sub(c, 48)\n leave\n }\n // chars 65-70: A-F\n if and(gt(c, 64), lt(c, 71)) {\n ascii := add(sub(c, 65), 10)\n leave\n }\n // chars 97-102: a-f\n if and(gt(c, 96), lt(c, 103)) {\n ascii := add(sub(c, 97), 10)\n leave\n }\n // invalid char\n ascii := 0xff\n }\n\n let ptr := add(str, 32)\n for {\n let i := idx\n } lt(i, lastIdx) {\n i := add(i, 2)\n } {\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\n // if either byte is invalid, set invalid and break loop\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\n valid := false\n break\n }\n let combined := or(shl(4, byte1), byte2)\n r := or(shl(8, r), combined)\n }\n }\n }\n\n /**\n * @dev Attempts to parse an address from a hex string\n * @param str The string to parse\n * @param idx The offset to start parsing at\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\n */\n function hexToAddress(\n bytes memory str,\n uint256 idx,\n uint256 lastIdx\n ) internal pure returns (address, bool) {\n if (lastIdx - idx < 40) return (address(0x0), false);\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\n return (address(uint160(uint256(r))), valid);\n }\n}\n" + }, + "contracts/utils/LowLevelCallUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.13;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\n\nlibrary LowLevelCallUtils {\n using Address for address;\n\n /**\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\n * `returnDataSize` and `readReturnData`.\n * @param target The address to staticcall.\n * @param data The data to pass to the call.\n * @return success True if the call succeeded, or false if it reverts.\n */\n function functionStaticCall(\n address target,\n bytes memory data\n ) internal view returns (bool success) {\n return functionStaticCall(target, data, gasleft());\n }\n\n /**\n * @dev Makes a static call to the specified `target` with `data` using `gasLimit`. Return data can be fetched with\n * `returnDataSize` and `readReturnData`.\n * @param target The address to staticcall.\n * @param data The data to pass to the call.\n * @param gasLimit The gas limit to use for the call.\n * @return success True if the call succeeded, or false if it reverts.\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n uint256 gasLimit\n ) internal view returns (bool success) {\n require(\n target.isContract(),\n \"LowLevelCallUtils: static call to non-contract\"\n );\n assembly {\n success := staticcall(\n gasLimit,\n target,\n add(data, 32),\n mload(data),\n 0,\n 0\n )\n }\n }\n\n /**\n * @dev Returns the size of the return data of the most recent external call.\n */\n function returnDataSize() internal pure returns (uint256 len) {\n assembly {\n len := returndatasize()\n }\n }\n\n /**\n * @dev Reads return data from the most recent external call.\n * @param offset Offset into the return data.\n * @param length Number of bytes to return.\n */\n function readReturnData(\n uint256 offset,\n uint256 length\n ) internal pure returns (bytes memory data) {\n data = new bytes(length);\n assembly {\n returndatacopy(add(data, 32), offset, length)\n }\n }\n\n /**\n * @dev Reverts with the return data from the most recent external call.\n */\n function propagateRevert() internal pure {\n assembly {\n returndatacopy(0, 0, returndatasize())\n revert(0, returndatasize())\n }\n }\n}\n" + }, + "contracts/utils/NameEncoder.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {BytesUtils} from \"../wrapper/BytesUtils.sol\";\n\nlibrary NameEncoder {\n using BytesUtils for bytes;\n\n function dnsEncodeName(\n string memory name\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\n uint8 labelLength = 0;\n bytes memory bytesName = bytes(name);\n uint256 length = bytesName.length;\n dnsName = new bytes(length + 2);\n node = 0;\n if (length == 0) {\n dnsName[0] = 0;\n return (dnsName, node);\n }\n\n // use unchecked to save gas since we check for an underflow\n // and we check for the length before the loop\n unchecked {\n for (uint256 i = length - 1; i >= 0; i--) {\n if (bytesName[i] == \".\") {\n dnsName[i + 1] = bytes1(labelLength);\n node = keccak256(\n abi.encodePacked(\n node,\n bytesName.keccak(i + 1, labelLength)\n )\n );\n labelLength = 0;\n } else {\n labelLength += 1;\n dnsName[i + 1] = bytesName[i];\n }\n if (i == 0) {\n break;\n }\n }\n }\n\n node = keccak256(\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\n );\n\n dnsName[0] = bytes1(labelLength);\n return (dnsName, node);\n }\n}\n" + }, + "contracts/utils/UniversalResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.17 <0.9.0;\n\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {LowLevelCallUtils} from \"./LowLevelCallUtils.sol\";\nimport {ENS} from \"../registry/ENS.sol\";\nimport {IExtendedResolver} from \"../resolvers/profiles/IExtendedResolver.sol\";\nimport {Resolver, INameResolver, IAddrResolver} from \"../resolvers/Resolver.sol\";\nimport {NameEncoder} from \"./NameEncoder.sol\";\nimport {BytesUtils} from \"../wrapper/BytesUtils.sol\";\nimport {HexUtils} from \"./HexUtils.sol\";\n\nerror OffchainLookup(\n address sender,\n string[] urls,\n bytes callData,\n bytes4 callbackFunction,\n bytes extraData\n);\n\nerror ResolverNotFound();\n\nerror ResolverWildcardNotSupported();\n\nerror ResolverNotContract();\n\nerror ResolverError(bytes returnData);\n\nerror HttpError(HttpErrorItem[] errors);\n\nstruct HttpErrorItem {\n uint16 status;\n string message;\n}\n\nstruct MulticallData {\n bytes name;\n bytes[] data;\n string[] gateways;\n bytes4 callbackFunction;\n bool isWildcard;\n address resolver;\n bytes metaData;\n bool[] failures;\n}\n\nstruct MulticallChecks {\n bool isCallback;\n bool hasExtendedResolver;\n}\n\nstruct OffchainLookupCallData {\n address sender;\n string[] urls;\n bytes callData;\n}\n\nstruct OffchainLookupExtraData {\n bytes4 callbackFunction;\n bytes data;\n}\n\nstruct Result {\n bool success;\n bytes returnData;\n}\n\ninterface BatchGateway {\n function query(\n OffchainLookupCallData[] memory data\n ) external returns (bool[] memory failures, bytes[] memory responses);\n}\n\n/**\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\n * making it possible to make a single smart contract call to resolve an ENS name.\n */\ncontract UniversalResolver is ERC165, Ownable {\n using Address for address;\n using NameEncoder for string;\n using BytesUtils for bytes;\n using HexUtils for bytes;\n\n string[] public batchGatewayURLs;\n ENS public immutable registry;\n\n constructor(address _registry, string[] memory _urls) {\n registry = ENS(_registry);\n batchGatewayURLs = _urls;\n }\n\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\n batchGatewayURLs = _urls;\n }\n\n /**\n * @dev Performs ENS name resolution for the supplied name and resolution data.\n * @param name The name to resolve, in normalised and DNS-encoded form.\n * @param data The resolution data, as specified in ENSIP-10.\n * @return The result of resolving the name.\n */\n function resolve(\n bytes calldata name,\n bytes memory data\n ) external view returns (bytes memory, address) {\n return\n _resolveSingle(\n name,\n data,\n batchGatewayURLs,\n this.resolveSingleCallback.selector,\n \"\"\n );\n }\n\n function resolve(\n bytes calldata name,\n bytes[] memory data\n ) external view returns (Result[] memory, address) {\n return resolve(name, data, batchGatewayURLs);\n }\n\n function resolve(\n bytes calldata name,\n bytes memory data,\n string[] memory gateways\n ) external view returns (bytes memory, address) {\n return\n _resolveSingle(\n name,\n data,\n gateways,\n this.resolveSingleCallback.selector,\n \"\"\n );\n }\n\n function resolve(\n bytes calldata name,\n bytes[] memory data,\n string[] memory gateways\n ) public view returns (Result[] memory, address) {\n return\n _resolve(name, data, gateways, this.resolveCallback.selector, \"\");\n }\n\n function _resolveSingle(\n bytes calldata name,\n bytes memory data,\n string[] memory gateways,\n bytes4 callbackFunction,\n bytes memory metaData\n ) public view returns (bytes memory, address) {\n bytes[] memory dataArr = new bytes[](1);\n dataArr[0] = data;\n (Result[] memory results, address resolver) = _resolve(\n name,\n dataArr,\n gateways,\n callbackFunction,\n metaData\n );\n\n Result memory result = results[0];\n\n _checkResolveSingle(result);\n\n return (result.returnData, resolver);\n }\n\n function _resolve(\n bytes calldata name,\n bytes[] memory data,\n string[] memory gateways,\n bytes4 callbackFunction,\n bytes memory metaData\n ) internal view returns (Result[] memory results, address resolverAddress) {\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\n resolverAddress = address(resolver);\n if (resolverAddress == address(0)) {\n revert ResolverNotFound();\n }\n\n if (!resolverAddress.isContract()) {\n revert ResolverNotContract();\n }\n\n bool isWildcard = finalOffset != 0;\n\n results = _multicall(\n MulticallData(\n name,\n data,\n gateways,\n callbackFunction,\n isWildcard,\n resolverAddress,\n metaData,\n new bool[](data.length)\n )\n );\n }\n\n function reverse(\n bytes calldata reverseName\n ) external view returns (string memory, address, address, address) {\n return reverse(reverseName, batchGatewayURLs);\n }\n\n /**\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\n */\n function reverse(\n bytes calldata reverseName,\n string[] memory gateways\n ) public view returns (string memory, address, address, address) {\n bytes memory encodedCall = abi.encodeCall(\n INameResolver.name,\n reverseName.namehash(0)\n );\n (\n bytes memory reverseResolvedData,\n address reverseResolverAddress\n ) = _resolveSingle(\n reverseName,\n encodedCall,\n gateways,\n this.reverseCallback.selector,\n \"\"\n );\n\n return\n getForwardDataFromReverse(\n reverseResolvedData,\n reverseResolverAddress,\n gateways\n );\n }\n\n function getForwardDataFromReverse(\n bytes memory resolvedReverseData,\n address reverseResolverAddress,\n string[] memory gateways\n ) internal view returns (string memory, address, address, address) {\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\n\n (bytes memory encodedName, bytes32 namehash) = resolvedName\n .dnsEncodeName();\n\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\n bytes memory metaData = abi.encode(\n resolvedName,\n reverseResolverAddress\n );\n (bytes memory resolvedData, address resolverAddress) = this\n ._resolveSingle(\n encodedName,\n encodedCall,\n gateways,\n this.reverseCallback.selector,\n metaData\n );\n\n address resolvedAddress = abi.decode(resolvedData, (address));\n\n return (\n resolvedName,\n resolvedAddress,\n reverseResolverAddress,\n resolverAddress\n );\n }\n\n function resolveSingleCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (bytes memory, address) {\n (Result[] memory results, address resolver, , ) = _resolveCallback(\n response,\n extraData,\n this.resolveSingleCallback.selector\n );\n Result memory result = results[0];\n\n _checkResolveSingle(result);\n\n return (result.returnData, resolver);\n }\n\n function resolveCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (Result[] memory, address) {\n (Result[] memory results, address resolver, , ) = _resolveCallback(\n response,\n extraData,\n this.resolveCallback.selector\n );\n return (results, resolver);\n }\n\n function reverseCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (string memory, address, address, address) {\n (\n Result[] memory results,\n address resolverAddress,\n string[] memory gateways,\n bytes memory metaData\n ) = _resolveCallback(\n response,\n extraData,\n this.reverseCallback.selector\n );\n\n Result memory result = results[0];\n\n if (!result.success) {\n revert ResolverError(result.returnData);\n }\n\n if (metaData.length > 0) {\n (string memory resolvedName, address reverseResolverAddress) = abi\n .decode(metaData, (string, address));\n address resolvedAddress = abi.decode(result.returnData, (address));\n return (\n resolvedName,\n resolvedAddress,\n reverseResolverAddress,\n resolverAddress\n );\n }\n\n return\n getForwardDataFromReverse(\n result.returnData,\n resolverAddress,\n gateways\n );\n }\n\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override returns (bool) {\n return\n interfaceId == type(IExtendedResolver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n function _resolveCallback(\n bytes calldata response,\n bytes calldata extraData,\n bytes4 callbackFunction\n )\n internal\n view\n returns (Result[] memory, address, string[] memory, bytes memory)\n {\n MulticallData memory multicallData;\n multicallData.callbackFunction = callbackFunction;\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\n response,\n (bool[], bytes[])\n );\n OffchainLookupExtraData[] memory extraDatas;\n (\n multicallData.isWildcard,\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData,\n extraDatas\n ) = abi.decode(\n extraData,\n (bool, address, string[], bytes, OffchainLookupExtraData[])\n );\n require(responses.length <= extraDatas.length);\n multicallData.data = new bytes[](extraDatas.length);\n multicallData.failures = new bool[](extraDatas.length);\n uint256 offchainCount = 0;\n for (uint256 i = 0; i < extraDatas.length; i++) {\n if (extraDatas[i].callbackFunction == bytes4(0)) {\n // This call did not require an offchain lookup; use the previous input data.\n multicallData.data[i] = extraDatas[i].data;\n } else {\n if (failures[offchainCount]) {\n multicallData.failures[i] = true;\n multicallData.data[i] = responses[offchainCount];\n } else {\n multicallData.data[i] = abi.encodeWithSelector(\n extraDatas[i].callbackFunction,\n responses[offchainCount],\n extraDatas[i].data\n );\n }\n offchainCount = offchainCount + 1;\n }\n }\n\n return (\n _multicall(multicallData),\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData\n );\n }\n\n /**\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\n * the error with the data necessary to continue the request where it left off.\n * @param target The address to call.\n * @param data The data to call `target` with.\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\n * @return result Whether the call succeeded.\n */\n function callWithOffchainLookupPropagation(\n address target,\n bytes memory data,\n bool isSafe\n )\n internal\n view\n returns (\n bool offchain,\n bytes memory returnData,\n OffchainLookupExtraData memory extraData,\n bool result\n )\n {\n if (isSafe) {\n result = LowLevelCallUtils.functionStaticCall(target, data);\n } else {\n result = LowLevelCallUtils.functionStaticCall(target, data, 50000);\n }\n uint256 size = LowLevelCallUtils.returnDataSize();\n\n if (result) {\n return (\n false,\n LowLevelCallUtils.readReturnData(0, size),\n extraData,\n true\n );\n }\n\n // Failure\n if (size >= 4) {\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\n // Offchain lookup. Decode the revert message and create our own that nests it.\n bytes memory revertData = LowLevelCallUtils.readReturnData(\n 4,\n size - 4\n );\n if (bytes4(errorId) == OffchainLookup.selector) {\n (\n address wrappedSender,\n string[] memory wrappedUrls,\n bytes memory wrappedCallData,\n bytes4 wrappedCallbackFunction,\n bytes memory wrappedExtraData\n ) = abi.decode(\n revertData,\n (address, string[], bytes, bytes4, bytes)\n );\n if (wrappedSender == target) {\n returnData = abi.encode(\n OffchainLookupCallData(\n wrappedSender,\n wrappedUrls,\n wrappedCallData\n )\n );\n extraData = OffchainLookupExtraData(\n wrappedCallbackFunction,\n wrappedExtraData\n );\n return (true, returnData, extraData, false);\n }\n } else {\n returnData = bytes.concat(errorId, revertData);\n return (false, returnData, extraData, false);\n }\n }\n }\n\n /**\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\n * removing labels until it finds a result.\n * @param name The name to resolve, in DNS-encoded and normalised form.\n * @return resolver The Resolver responsible for this name.\n * @return namehash The namehash of the full name.\n * @return finalOffset The offset of the first label with a resolver.\n */\n function findResolver(\n bytes calldata name\n ) public view returns (Resolver, bytes32, uint256) {\n (\n address resolver,\n bytes32 namehash,\n uint256 finalOffset\n ) = findResolver(name, 0);\n return (Resolver(resolver), namehash, finalOffset);\n }\n\n function findResolver(\n bytes calldata name,\n uint256 offset\n ) internal view returns (address, bytes32, uint256) {\n uint256 labelLength = uint256(uint8(name[offset]));\n if (labelLength == 0) {\n return (address(0), bytes32(0), offset);\n }\n uint256 nextLabel = offset + labelLength + 1;\n bytes32 labelHash;\n if (\n labelLength == 66 &&\n // 0x5b == '['\n name[offset + 1] == 0x5b &&\n // 0x5d == ']'\n name[nextLabel - 1] == 0x5d\n ) {\n // Encrypted label\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\n .hexStringToBytes32(0, 64);\n } else {\n labelHash = keccak256(name[offset + 1:nextLabel]);\n }\n (\n address parentresolver,\n bytes32 parentnode,\n uint256 parentoffset\n ) = findResolver(name, nextLabel);\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\n address resolver = registry.resolver(node);\n if (resolver != address(0)) {\n return (resolver, node, offset);\n }\n return (parentresolver, node, parentoffset);\n }\n\n function _checkInterface(\n address resolver,\n bytes4 interfaceId\n ) internal view returns (bool) {\n try\n Resolver(resolver).supportsInterface{gas: 50000}(interfaceId)\n returns (bool supported) {\n return supported;\n } catch {\n return false;\n }\n }\n\n function _checkSafetyAndItem(\n bytes memory name,\n bytes memory item,\n address resolver,\n MulticallChecks memory multicallChecks\n ) internal view returns (bool, bytes memory) {\n if (!multicallChecks.isCallback) {\n if (multicallChecks.hasExtendedResolver) {\n return (\n true,\n abi.encodeCall(IExtendedResolver.resolve, (name, item))\n );\n }\n return (_checkInterface(resolver, bytes4(item)), item);\n }\n return (true, item);\n }\n\n function _checkMulticall(\n MulticallData memory multicallData\n ) internal view returns (MulticallChecks memory) {\n bool isCallback = multicallData.name.length == 0;\n bool hasExtendedResolver = _checkInterface(\n multicallData.resolver,\n type(IExtendedResolver).interfaceId\n );\n\n if (multicallData.isWildcard && !hasExtendedResolver) {\n revert ResolverWildcardNotSupported();\n }\n\n return MulticallChecks(isCallback, hasExtendedResolver);\n }\n\n function _checkResolveSingle(Result memory result) internal pure {\n if (!result.success) {\n if (bytes4(result.returnData) == HttpError.selector) {\n (, HttpErrorItem[] memory errors) = abi.decode(\n result.returnData,\n (bytes4, HttpErrorItem[])\n );\n revert HttpError(errors);\n }\n revert ResolverError(result.returnData);\n }\n }\n\n function _multicall(\n MulticallData memory multicallData\n ) internal view returns (Result[] memory results) {\n uint256 length = multicallData.data.length;\n uint256 offchainCount = 0;\n OffchainLookupCallData[]\n memory callDatas = new OffchainLookupCallData[](length);\n OffchainLookupExtraData[]\n memory extraDatas = new OffchainLookupExtraData[](length);\n results = new Result[](length);\n MulticallChecks memory multicallChecks = _checkMulticall(multicallData);\n\n for (uint256 i = 0; i < length; i++) {\n bytes memory item = multicallData.data[i];\n bool failure = multicallData.failures[i];\n\n if (failure) {\n results[i] = Result(false, item);\n continue;\n }\n\n bool isSafe = false;\n (isSafe, item) = _checkSafetyAndItem(\n multicallData.name,\n item,\n multicallData.resolver,\n multicallChecks\n );\n\n (\n bool offchain,\n bytes memory returnData,\n OffchainLookupExtraData memory extraData,\n bool success\n ) = callWithOffchainLookupPropagation(\n multicallData.resolver,\n item,\n isSafe\n );\n\n if (offchain) {\n callDatas[offchainCount] = abi.decode(\n returnData,\n (OffchainLookupCallData)\n );\n extraDatas[i] = extraData;\n offchainCount += 1;\n continue;\n }\n\n if (success && multicallChecks.hasExtendedResolver) {\n // if this is a successful resolve() call, unwrap the result\n returnData = abi.decode(returnData, (bytes));\n }\n results[i] = Result(success, returnData);\n extraDatas[i].data = multicallData.data[i];\n }\n\n if (offchainCount == 0) {\n return results;\n }\n\n // Trim callDatas if offchain data exists\n assembly {\n mstore(callDatas, offchainCount)\n }\n\n revert OffchainLookup(\n address(this),\n multicallData.gateways,\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\n multicallData.callbackFunction,\n abi.encode(\n multicallData.isWildcard,\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData,\n extraDatas\n )\n );\n }\n}\n" + }, + "contracts/wrapper/BytesUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ~0.8.17;\n\nlibrary BytesUtils {\n /*\n * @dev Returns the keccak-256 hash of a byte range.\n * @param self The byte string to hash.\n * @param offset The position to start hashing at.\n * @param len The number of bytes to hash.\n * @return The hash of the byte range.\n */\n function keccak(\n bytes memory self,\n uint256 offset,\n uint256 len\n ) internal pure returns (bytes32 ret) {\n require(offset + len <= self.length);\n assembly {\n ret := keccak256(add(add(self, 32), offset), len)\n }\n }\n\n /**\n * @dev Returns the ENS namehash of a DNS-encoded name.\n * @param self The DNS-encoded name to hash.\n * @param offset The offset at which to start hashing.\n * @return The namehash of the name.\n */\n function namehash(\n bytes memory self,\n uint256 offset\n ) internal pure returns (bytes32) {\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\n if (labelhash == bytes32(0)) {\n require(offset == self.length - 1, \"namehash: Junk at end of name\");\n return bytes32(0);\n }\n return\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\n }\n\n /**\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\n * @param self The byte string to read a label from.\n * @param idx The index to read a label at.\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\n * @return newIdx The index of the start of the next label.\n */\n function readLabel(\n bytes memory self,\n uint256 idx\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\n require(idx < self.length, \"readLabel: Index out of bounds\");\n uint256 len = uint256(uint8(self[idx]));\n if (len > 0) {\n labelhash = keccak(self, idx + 1, len);\n } else {\n labelhash = bytes32(0);\n }\n newIdx = idx + len + 1;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file diff --git a/deployments/sepolia/UniversalResolver.json b/deployments/sepolia/UniversalResolver.json index d9896544..0324133d 100644 --- a/deployments/sepolia/UniversalResolver.json +++ b/deployments/sepolia/UniversalResolver.json @@ -1,5 +1,5 @@ { - "address": "0x21B000Fd62a880b2125A61e36a284BB757b76025", + "address": "0x595CEF18FcB6a228e4DaBB903d156d1cE2eb78dc", "abi": [ { "inputs": [ @@ -17,6 +17,29 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [ + { + "components": [ + { + "internalType": "uint16", + "name": "status", + "type": "uint16" + }, + { + "internalType": "string", + "name": "message", + "type": "string" + } + ], + "internalType": "struct HttpErrorItem[]", + "name": "errors", + "type": "tuple[]" + } + ], + "name": "HttpError", + "type": "error" + }, { "inputs": [ { @@ -48,6 +71,32 @@ "name": "OffchainLookup", "type": "error" }, + { + "inputs": [ + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "name": "ResolverError", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverNotContract", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverNotFound", + "type": "error" + }, + { + "inputs": [], + "name": "ResolverWildcardNotSupported", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -242,9 +291,21 @@ "name": "resolve", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -276,9 +337,21 @@ "name": "resolve", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -334,9 +407,21 @@ "name": "resolveCallback", "outputs": [ { - "internalType": "bytes[]", + "components": [ + { + "internalType": "bool", + "name": "success", + "type": "bool" + }, + { + "internalType": "bytes", + "name": "returnData", + "type": "bytes" + } + ], + "internalType": "struct Result[]", "name": "", - "type": "bytes[]" + "type": "tuple[]" }, { "internalType": "address", @@ -534,48 +619,48 @@ "type": "function" } ], - "transactionHash": "0x5a92cb82bbccd88be96a14858d3b4d957ac7bf3b32e19f4825d8d8e35a1e8839", + "transactionHash": "0x2e07f5a4245c03b7ba29ad66f94904db88b215bd26213590ee5527779b31a4bd", "receipt": { "to": null, - "from": "0x4Fe4e666Be5752f1FdD210F4Ab5DE2Cc26e3E0e8", - "contractAddress": "0x21B000Fd62a880b2125A61e36a284BB757b76025", - "transactionIndex": 47, - "gasUsed": "3039128", - "logsBloom": "0x00000000000000002000000000000000000000000000200000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000020000000000000000000840000000000000000000000000000000400000000000000000000000000000000000000400000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", - "blockHash": "0x3bb3be3e3e815561cf21b3d8a6785aff1bad9120c0dba1b7253334a484f84acb", - "transactionHash": "0x5a92cb82bbccd88be96a14858d3b4d957ac7bf3b32e19f4825d8d8e35a1e8839", + "from": "0x69420f05A11f617B4B74fFe2E04B2D300dFA556F", + "contractAddress": "0x595CEF18FcB6a228e4DaBB903d156d1cE2eb78dc", + "transactionIndex": 38, + "gasUsed": "3202522", + "logsBloom": "0x00000000010000000000000000000004000000000000000000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000001000000000000000000000000000000000000020000000000000000000800000000000000000000000000000000400000000000000000000040000000000000008000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000", + "blockHash": "0xfbbadd96b2fbc1275b7e316667a0a16854c803d41eb0ef89d6b86047b1468e72", + "transactionHash": "0x2e07f5a4245c03b7ba29ad66f94904db88b215bd26213590ee5527779b31a4bd", "logs": [ { - "transactionIndex": 47, - "blockNumber": 3914906, - "transactionHash": "0x5a92cb82bbccd88be96a14858d3b4d957ac7bf3b32e19f4825d8d8e35a1e8839", - "address": "0x21B000Fd62a880b2125A61e36a284BB757b76025", + "transactionIndex": 38, + "blockNumber": 4793712, + "transactionHash": "0x2e07f5a4245c03b7ba29ad66f94904db88b215bd26213590ee5527779b31a4bd", + "address": "0x595CEF18FcB6a228e4DaBB903d156d1cE2eb78dc", "topics": [ "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x0000000000000000000000004fe4e666be5752f1fdd210f4ab5de2cc26e3e0e8" + "0x00000000000000000000000069420f05a11f617b4b74ffe2e04b2d300dfa556f" ], "data": "0x", - "logIndex": 62, - "blockHash": "0x3bb3be3e3e815561cf21b3d8a6785aff1bad9120c0dba1b7253334a484f84acb" + "logIndex": 35, + "blockHash": "0xfbbadd96b2fbc1275b7e316667a0a16854c803d41eb0ef89d6b86047b1468e72" } ], - "blockNumber": 3914906, - "cumulativeGasUsed": "21618601", + "blockNumber": 4793712, + "cumulativeGasUsed": "8889356", "status": 1, "byzantium": true }, "args": [ "0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e", [ - "https://universal-offchain-unwrapper.ens-cf.workers.dev/" + "http://127.0.0.1:8787" ] ], - "numDeployments": 1, - "solcInputHash": "e04502f562d98d0455f6c1c453418cdd", - "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"urls\",\"type\":\"string[]\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"OffchainLookup\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"metaData\",\"type\":\"bytes\"}],\"name\":\"_resolveSingle\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batchGatewayURLs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"}],\"name\":\"findResolver\",\"outputs\":[{\"internalType\":\"contract Resolver\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveCallback\",\"outputs\":[{\"internalType\":\"bytes[]\",\"name\":\"\",\"type\":\"bytes[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveSingleCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"reverseCallback\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"name\":\"setGatewayURLs\",\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"findResolver(bytes)\":{\"details\":\"Finds a resolver by recursively querying the registry, starting at the longest name and progressively removing labels until it finds a result.\",\"params\":{\"name\":\"The name to resolve, in DNS-encoded and normalised form.\"},\"returns\":{\"_0\":\"resolver The Resolver responsible for this name.\",\"_1\":\"namehash The namehash of the full name.\",\"_2\":\"finalOffset The offset of the first label with a resolver.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"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.\"},\"resolve(bytes,bytes)\":{\"details\":\"Performs ENS name resolution for the supplied name and resolution data.\",\"params\":{\"data\":\"The resolution data, as specified in ENSIP-10.\",\"name\":\"The name to resolve, in normalised and DNS-encoded form.\"},\"returns\":{\"_0\":\"The result of resolving the name.\"}},\"reverse(bytes,string[])\":{\"details\":\"Performs ENS name reverse resolution for the supplied reverse name.\",\"params\":{\"reverseName\":\"The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\"},\"returns\":{\"_0\":\"The resolved name, the resolved address, the reverse resolver address, and the resolver address.\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"The Universal Resolver is a contract that handles the work of resolving a name entirely onchain, making it possible to make a single smart contract call to resolve an ENS name.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/UniversalResolver.sol\":\"UniversalResolver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n // Logged when the owner of a node assigns a new owner to a subnode.\\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n // Logged when the owner of a node transfers ownership to a new account.\\n event Transfer(bytes32 indexed node, address owner);\\n\\n // Logged when the resolver for a node changes.\\n event NewResolver(bytes32 indexed node, address resolver);\\n\\n // Logged when the TTL of a node changes\\n event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n // Logged when an operator is added or removed.\\n event ApprovalForAll(\\n address indexed owner,\\n address indexed operator,\\n bool approved\\n );\\n\\n function setRecord(\\n bytes32 node,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeRecord(\\n bytes32 node,\\n bytes32 label,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeOwner(\\n bytes32 node,\\n bytes32 label,\\n address owner\\n ) external returns (bytes32);\\n\\n function setResolver(bytes32 node, address resolver) external;\\n\\n function setOwner(bytes32 node, address owner) external;\\n\\n function setTTL(bytes32 node, uint64 ttl) external;\\n\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n function owner(bytes32 node) external view returns (address);\\n\\n function resolver(bytes32 node) external view returns (address);\\n\\n function ttl(bytes32 node) external view returns (uint64);\\n\\n function recordExists(bytes32 node) external view returns (bool);\\n\\n function isApprovedForAll(\\n address owner,\\n address operator\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7cb1158c7d268b63de1468e28e2711b28d686e2628ddb22da2149cd93ddeafda\"},\"contracts/resolvers/Resolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"./profiles/IABIResolver.sol\\\";\\nimport \\\"./profiles/IAddressResolver.sol\\\";\\nimport \\\"./profiles/IAddrResolver.sol\\\";\\nimport \\\"./profiles/IContentHashResolver.sol\\\";\\nimport \\\"./profiles/IDNSRecordResolver.sol\\\";\\nimport \\\"./profiles/IDNSZoneResolver.sol\\\";\\nimport \\\"./profiles/IInterfaceResolver.sol\\\";\\nimport \\\"./profiles/INameResolver.sol\\\";\\nimport \\\"./profiles/IPubkeyResolver.sol\\\";\\nimport \\\"./profiles/ITextResolver.sol\\\";\\nimport \\\"./profiles/IExtendedResolver.sol\\\";\\n\\n/**\\n * A generic resolver interface which includes all the functions including the ones deprecated\\n */\\ninterface Resolver is\\n IERC165,\\n IABIResolver,\\n IAddressResolver,\\n IAddrResolver,\\n IContentHashResolver,\\n IDNSRecordResolver,\\n IDNSZoneResolver,\\n IInterfaceResolver,\\n INameResolver,\\n IPubkeyResolver,\\n ITextResolver,\\n IExtendedResolver\\n{\\n /* Deprecated events */\\n event ContentChanged(bytes32 indexed node, bytes32 hash);\\n\\n function setApprovalForAll(address, bool) external;\\n\\n function approve(bytes32 node, address delegate, bool approved) external;\\n\\n function isApprovedForAll(address account, address operator) external;\\n\\n function isApprovedFor(\\n address owner,\\n bytes32 node,\\n address delegate\\n ) external;\\n\\n function setABI(\\n bytes32 node,\\n uint256 contentType,\\n bytes calldata data\\n ) external;\\n\\n function setAddr(bytes32 node, address addr) external;\\n\\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\\n\\n function setContenthash(bytes32 node, bytes calldata hash) external;\\n\\n function setDnsrr(bytes32 node, bytes calldata data) external;\\n\\n function setName(bytes32 node, string calldata _name) external;\\n\\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\\n\\n function setText(\\n bytes32 node,\\n string calldata key,\\n string calldata value\\n ) external;\\n\\n function setInterface(\\n bytes32 node,\\n bytes4 interfaceID,\\n address implementer\\n ) external;\\n\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n function multicallWithNodeCheck(\\n bytes32 nodehash,\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n /* Deprecated functions */\\n function content(bytes32 node) external view returns (bytes32);\\n\\n function multihash(bytes32 node) external view returns (bytes memory);\\n\\n function setContent(bytes32 node, bytes32 hash) external;\\n\\n function setMultihash(bytes32 node, bytes calldata hash) external;\\n}\\n\",\"keccak256\":\"0xfc77ab6b7c59c3ebfe1c720bdebf9b08c2488ff7ac9501a9aa056c5d6d5b50c5\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IABIResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IABIResolver {\\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\\n\\n /**\\n * Returns the ABI associated with an ENS node.\\n * Defined in EIP205.\\n * @param node The ENS node to query\\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\\n * @return contentType The content type of the return value\\n * @return data The ABI data\\n */\\n function ABI(\\n bytes32 node,\\n uint256 contentTypes\\n ) external view returns (uint256, bytes memory);\\n}\\n\",\"keccak256\":\"0x85b373d02d19374fe570af407f459768285704bf7f30ab17c30eabfb5a10e4c3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddrResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the legacy (ETH-only) addr function.\\n */\\ninterface IAddrResolver {\\n event AddrChanged(bytes32 indexed node, address a);\\n\\n /**\\n * Returns the address associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated address.\\n */\\n function addr(bytes32 node) external view returns (address payable);\\n}\\n\",\"keccak256\":\"0x2ad7f2fc60ebe0f93745fe70247f6a854f66af732483fda2a3c5e055614445e8\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the new (multicoin) addr function.\\n */\\ninterface IAddressResolver {\\n event AddressChanged(\\n bytes32 indexed node,\\n uint256 coinType,\\n bytes newAddress\\n );\\n\\n function addr(\\n bytes32 node,\\n uint256 coinType\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x411447c1e90c51e09702815a85ec725ffbbe37cf96e8cc4d2a8bd4ad8a59d73e\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IContentHashResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IContentHashResolver {\\n event ContenthashChanged(bytes32 indexed node, bytes hash);\\n\\n /**\\n * Returns the contenthash associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function contenthash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xd95cd77684ba5752c428d7dceb4ecc6506ac94f4fbb910489637eb68dcd8e366\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSRecordResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSRecordResolver {\\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\\n event DNSRecordChanged(\\n bytes32 indexed node,\\n bytes name,\\n uint16 resource,\\n bytes record\\n );\\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\\n\\n /**\\n * Obtain a DNS record.\\n * @param node the namehash of the node for which to fetch the record\\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\\n * @return the DNS record in wire format if present, otherwise empty\\n */\\n function dnsRecord(\\n bytes32 node,\\n bytes32 name,\\n uint16 resource\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xcfa52200edd337f2c6c5bf402352600584da033b21323603e53de33051a3e25d\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSZoneResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSZoneResolver {\\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\\n event DNSZonehashChanged(\\n bytes32 indexed node,\\n bytes lastzonehash,\\n bytes zonehash\\n );\\n\\n /**\\n * zonehash obtains the hash for the zone.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function zonehash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xca1b3a16e7005533f2800a3e66fcdccf7c574deac7913d8c810f40aec1d58dc0\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IExtendedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IExtendedResolver {\\n function resolve(\\n bytes memory name,\\n bytes memory data\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IInterfaceResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IInterfaceResolver {\\n event InterfaceChanged(\\n bytes32 indexed node,\\n bytes4 indexed interfaceID,\\n address implementer\\n );\\n\\n /**\\n * Returns the address of a contract that implements the specified interface for this name.\\n * If an implementer has not been set for this interfaceID and name, the resolver will query\\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\\n * will be returned.\\n * @param node The ENS node to query.\\n * @param interfaceID The EIP 165 interface ID to check for.\\n * @return The address that implements this interface, or 0 if the interface is unsupported.\\n */\\n function interfaceImplementer(\\n bytes32 node,\\n bytes4 interfaceID\\n ) external view returns (address);\\n}\\n\",\"keccak256\":\"0x390321fb58f7b927df9562450981e74b4be3907e7c09df321fd3b7409b63ae28\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/INameResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface INameResolver {\\n event NameChanged(bytes32 indexed node, string name);\\n\\n /**\\n * Returns the name associated with an ENS node, for reverse records.\\n * Defined in EIP181.\\n * @param node The ENS node to query.\\n * @return The associated name.\\n */\\n function name(bytes32 node) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x9ec392b612447b1acbdc01114f2da2837a658d3f3157f60a99c5269f0b623346\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IPubkeyResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IPubkeyResolver {\\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\\n\\n /**\\n * Returns the SECP256k1 public key associated with an ENS node.\\n * Defined in EIP 619.\\n * @param node The ENS node to query\\n * @return x The X coordinate of the curve point for the public key.\\n * @return y The Y coordinate of the curve point for the public key.\\n */\\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\\n}\\n\",\"keccak256\":\"0x69748947093dd2fda9ddcebd0adf19a6d1e7600df1d4b1462a0417156caddca7\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/ITextResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface ITextResolver {\\n event TextChanged(\\n bytes32 indexed node,\\n string indexed indexedKey,\\n string key,\\n string value\\n );\\n\\n /**\\n * Returns the text data associated with an ENS node and key.\\n * @param node The ENS node to query.\\n * @param key The text data key to query.\\n * @return The associated text data.\\n */\\n function text(\\n bytes32 node,\\n string calldata key\\n ) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x7c5debb3c42cd9f5de2274ea7aa053f238608314b62db441c40e31cea2543fd5\",\"license\":\"MIT\"},\"contracts/utils/HexUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nlibrary HexUtils {\\n /**\\n * @dev Attempts to parse bytes32 from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexStringToBytes32(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (bytes32 r, bool valid) {\\n valid = true;\\n assembly {\\n // check that the index to read to is not past the end of the string\\n if gt(lastIdx, mload(str)) {\\n revert(0, 0)\\n }\\n\\n function getHex(c) -> ascii {\\n // chars 48-57: 0-9\\n if and(gt(c, 47), lt(c, 58)) {\\n ascii := sub(c, 48)\\n leave\\n }\\n // chars 65-70: A-F\\n if and(gt(c, 64), lt(c, 71)) {\\n ascii := add(sub(c, 65), 10)\\n leave\\n }\\n // chars 97-102: a-f\\n if and(gt(c, 96), lt(c, 103)) {\\n ascii := add(sub(c, 97), 10)\\n leave\\n }\\n // invalid char\\n ascii := 0xff\\n }\\n\\n let ptr := add(str, 32)\\n for {\\n let i := idx\\n } lt(i, lastIdx) {\\n i := add(i, 2)\\n } {\\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\\n // if either byte is invalid, set invalid and break loop\\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\\n valid := false\\n break\\n }\\n let combined := or(shl(4, byte1), byte2)\\n r := or(shl(8, r), combined)\\n }\\n }\\n }\\n\\n /**\\n * @dev Attempts to parse an address from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexToAddress(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (address, bool) {\\n if (lastIdx - idx < 40) return (address(0x0), false);\\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\\n return (address(uint160(uint256(r))), valid);\\n }\\n}\\n\",\"keccak256\":\"0xcae20ad72181f47dfe7fba7d88e8d902a01576b16e93362878e726989d6cfb4d\",\"license\":\"MIT\"},\"contracts/utils/LowLevelCallUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.13;\\n\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary LowLevelCallUtils {\\n using Address for address;\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data\\n ) internal view returns (bool success) {\\n require(\\n target.isContract(),\\n \\\"LowLevelCallUtils: static call to non-contract\\\"\\n );\\n assembly {\\n success := staticcall(\\n gas(),\\n target,\\n add(data, 32),\\n mload(data),\\n 0,\\n 0\\n )\\n }\\n }\\n\\n /**\\n * @dev Returns the size of the return data of the most recent external call.\\n */\\n function returnDataSize() internal pure returns (uint256 len) {\\n assembly {\\n len := returndatasize()\\n }\\n }\\n\\n /**\\n * @dev Reads return data from the most recent external call.\\n * @param offset Offset into the return data.\\n * @param length Number of bytes to return.\\n */\\n function readReturnData(\\n uint256 offset,\\n uint256 length\\n ) internal pure returns (bytes memory data) {\\n data = new bytes(length);\\n assembly {\\n returndatacopy(add(data, 32), offset, length)\\n }\\n }\\n\\n /**\\n * @dev Reverts with the return data from the most recent external call.\\n */\\n function propagateRevert() internal pure {\\n assembly {\\n returndatacopy(0, 0, returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0x20d3d0d14fab6fc079f90d630a51bb8e274431ca929591ec8d62383ce946cb3a\",\"license\":\"MIT\"},\"contracts/utils/NameEncoder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\n\\nlibrary NameEncoder {\\n using BytesUtils for bytes;\\n\\n function dnsEncodeName(\\n string memory name\\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\\n uint8 labelLength = 0;\\n bytes memory bytesName = bytes(name);\\n uint256 length = bytesName.length;\\n dnsName = new bytes(length + 2);\\n node = 0;\\n if (length == 0) {\\n dnsName[0] = 0;\\n return (dnsName, node);\\n }\\n\\n // use unchecked to save gas since we check for an underflow\\n // and we check for the length before the loop\\n unchecked {\\n for (uint256 i = length - 1; i >= 0; i--) {\\n if (bytesName[i] == \\\".\\\") {\\n dnsName[i + 1] = bytes1(labelLength);\\n node = keccak256(\\n abi.encodePacked(\\n node,\\n bytesName.keccak(i + 1, labelLength)\\n )\\n );\\n labelLength = 0;\\n } else {\\n labelLength += 1;\\n dnsName[i + 1] = bytesName[i];\\n }\\n if (i == 0) {\\n break;\\n }\\n }\\n }\\n\\n node = keccak256(\\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\\n );\\n\\n dnsName[0] = bytes1(labelLength);\\n return (dnsName, node);\\n }\\n}\\n\",\"keccak256\":\"0x63fd5f360cef8c9b8b8cfdff20d3f0e955b4c8ac7dfac758788223c61678aad1\",\"license\":\"MIT\"},\"contracts/utils/UniversalResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.17 <0.9.0;\\n\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\nimport {Ownable} from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {LowLevelCallUtils} from \\\"./LowLevelCallUtils.sol\\\";\\nimport {ENS} from \\\"../registry/ENS.sol\\\";\\nimport {IExtendedResolver} from \\\"../resolvers/profiles/IExtendedResolver.sol\\\";\\nimport {Resolver, INameResolver, IAddrResolver} from \\\"../resolvers/Resolver.sol\\\";\\nimport {NameEncoder} from \\\"./NameEncoder.sol\\\";\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\nimport {HexUtils} from \\\"./HexUtils.sol\\\";\\n\\nerror OffchainLookup(\\n address sender,\\n string[] urls,\\n bytes callData,\\n bytes4 callbackFunction,\\n bytes extraData\\n);\\n\\nstruct MulticallData {\\n bytes name;\\n bytes[] data;\\n string[] gateways;\\n bytes4 callbackFunction;\\n bool isWildcard;\\n address resolver;\\n bytes metaData;\\n bool[] failures;\\n}\\n\\nstruct OffchainLookupCallData {\\n address sender;\\n string[] urls;\\n bytes callData;\\n}\\n\\nstruct OffchainLookupExtraData {\\n bytes4 callbackFunction;\\n bytes data;\\n}\\n\\ninterface BatchGateway {\\n function query(\\n OffchainLookupCallData[] memory data\\n ) external returns (bool[] memory failures, bytes[] memory responses);\\n}\\n\\n/**\\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\\n * making it possible to make a single smart contract call to resolve an ENS name.\\n */\\ncontract UniversalResolver is ERC165, Ownable {\\n using Address for address;\\n using NameEncoder for string;\\n using BytesUtils for bytes;\\n using HexUtils for bytes;\\n\\n string[] public batchGatewayURLs;\\n ENS public immutable registry;\\n\\n constructor(address _registry, string[] memory _urls) {\\n registry = ENS(_registry);\\n batchGatewayURLs = _urls;\\n }\\n\\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\\n batchGatewayURLs = _urls;\\n }\\n\\n /**\\n * @dev Performs ENS name resolution for the supplied name and resolution data.\\n * @param name The name to resolve, in normalised and DNS-encoded form.\\n * @param data The resolution data, as specified in ENSIP-10.\\n * @return The result of resolving the name.\\n */\\n function resolve(\\n bytes calldata name,\\n bytes memory data\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n batchGatewayURLs,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data\\n ) external view returns (bytes[] memory, address) {\\n return resolve(name, data, batchGatewayURLs);\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n gateways,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways\\n ) public view returns (bytes[] memory, address) {\\n return\\n _resolve(name, data, gateways, this.resolveCallback.selector, \\\"\\\");\\n }\\n\\n function _resolveSingle(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) public view returns (bytes memory, address) {\\n bytes[] memory dataArr = new bytes[](1);\\n dataArr[0] = data;\\n (bytes[] memory results, address resolver) = _resolve(\\n name,\\n dataArr,\\n gateways,\\n callbackFunction,\\n metaData\\n );\\n return (results[0], resolver);\\n }\\n\\n function _resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) internal view returns (bytes[] memory results, address resolverAddress) {\\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\\n resolverAddress = address(resolver);\\n if (resolverAddress == address(0)) {\\n return (results, address(0));\\n }\\n\\n bool isWildcard = finalOffset != 0;\\n\\n results = _multicall(\\n MulticallData(\\n name,\\n data,\\n gateways,\\n callbackFunction,\\n isWildcard,\\n resolverAddress,\\n metaData,\\n new bool[](data.length)\\n )\\n );\\n }\\n\\n function reverse(\\n bytes calldata reverseName\\n ) external view returns (string memory, address, address, address) {\\n return reverse(reverseName, batchGatewayURLs);\\n }\\n\\n /**\\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\\n */\\n function reverse(\\n bytes calldata reverseName,\\n string[] memory gateways\\n ) public view returns (string memory, address, address, address) {\\n bytes memory encodedCall = abi.encodeCall(\\n INameResolver.name,\\n reverseName.namehash(0)\\n );\\n (\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress\\n ) = _resolveSingle(\\n reverseName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n \\\"\\\"\\n );\\n\\n return\\n getForwardDataFromReverse(\\n resolvedReverseData,\\n reverseResolverAddress,\\n gateways\\n );\\n }\\n\\n function getForwardDataFromReverse(\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress,\\n string[] memory gateways\\n ) internal view returns (string memory, address, address, address) {\\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\\n\\n (bytes memory encodedName, bytes32 namehash) = resolvedName\\n .dnsEncodeName();\\n\\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\\n bytes memory metaData = abi.encode(\\n resolvedName,\\n reverseResolverAddress\\n );\\n (bytes memory resolvedData, address resolverAddress) = this\\n ._resolveSingle(\\n encodedName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n metaData\\n );\\n\\n address resolvedAddress = abi.decode(resolvedData, (address));\\n\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n function resolveSingleCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes memory, address) {\\n (bytes[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveSingleCallback.selector\\n );\\n return (results[0], resolver);\\n }\\n\\n function resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes[] memory, address) {\\n (bytes[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveCallback.selector\\n );\\n return (results, resolver);\\n }\\n\\n function reverseCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (string memory, address, address, address) {\\n (\\n bytes[] memory resolvedData,\\n address resolverAddress,\\n string[] memory gateways,\\n bytes memory metaData\\n ) = _resolveCallback(\\n response,\\n extraData,\\n this.reverseCallback.selector\\n );\\n\\n if (metaData.length > 0) {\\n (string memory resolvedName, address reverseResolverAddress) = abi\\n .decode(metaData, (string, address));\\n address resolvedAddress = abi.decode(resolvedData[0], (address));\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n return\\n getForwardDataFromReverse(\\n resolvedData[0],\\n resolverAddress,\\n gateways\\n );\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return\\n interfaceId == type(IExtendedResolver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n function _resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData,\\n bytes4 callbackFunction\\n )\\n internal\\n view\\n returns (bytes[] memory, address, string[] memory, bytes memory)\\n {\\n MulticallData memory multicallData;\\n multicallData.callbackFunction = callbackFunction;\\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\\n response,\\n (bool[], bytes[])\\n );\\n OffchainLookupExtraData[] memory extraDatas;\\n (\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n ) = abi.decode(\\n extraData,\\n (bool, address, string[], bytes, OffchainLookupExtraData[])\\n );\\n require(responses.length <= extraDatas.length);\\n multicallData.data = new bytes[](extraDatas.length);\\n multicallData.failures = new bool[](extraDatas.length);\\n uint256 offchainCount = 0;\\n for (uint256 i = 0; i < extraDatas.length; i++) {\\n if (extraDatas[i].callbackFunction == bytes4(0)) {\\n // This call did not require an offchain lookup; use the previous input data.\\n multicallData.data[i] = extraDatas[i].data;\\n } else {\\n if (failures[offchainCount]) {\\n multicallData.failures[i] = true;\\n multicallData.data[i] = responses[offchainCount];\\n } else {\\n multicallData.data[i] = abi.encodeWithSelector(\\n extraDatas[i].callbackFunction,\\n responses[offchainCount],\\n extraDatas[i].data\\n );\\n }\\n offchainCount = offchainCount + 1;\\n }\\n }\\n\\n return (\\n _multicall(multicallData),\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData\\n );\\n }\\n\\n /**\\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\\n * the error with the data necessary to continue the request where it left off.\\n * @param target The address to call.\\n * @param data The data to call `target` with.\\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\\n * @return result Whether the call succeeded.\\n */\\n function callWithOffchainLookupPropagation(\\n address target,\\n bytes memory data\\n )\\n internal\\n view\\n returns (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool result\\n )\\n {\\n result = LowLevelCallUtils.functionStaticCall(address(target), data);\\n uint256 size = LowLevelCallUtils.returnDataSize();\\n\\n if (result) {\\n return (\\n false,\\n LowLevelCallUtils.readReturnData(0, size),\\n extraData,\\n true\\n );\\n }\\n\\n // Failure\\n if (size >= 4) {\\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\\n // Offchain lookup. Decode the revert message and create our own that nests it.\\n bytes memory revertData = LowLevelCallUtils.readReturnData(\\n 4,\\n size - 4\\n );\\n if (bytes4(errorId) == OffchainLookup.selector) {\\n (\\n address wrappedSender,\\n string[] memory wrappedUrls,\\n bytes memory wrappedCallData,\\n bytes4 wrappedCallbackFunction,\\n bytes memory wrappedExtraData\\n ) = abi.decode(\\n revertData,\\n (address, string[], bytes, bytes4, bytes)\\n );\\n if (wrappedSender == target) {\\n returnData = abi.encode(\\n OffchainLookupCallData(\\n wrappedSender,\\n wrappedUrls,\\n wrappedCallData\\n )\\n );\\n extraData = OffchainLookupExtraData(\\n wrappedCallbackFunction,\\n wrappedExtraData\\n );\\n return (true, returnData, extraData, false);\\n }\\n } else {\\n returnData = revertData;\\n return (false, returnData, extraData, false);\\n }\\n }\\n }\\n\\n /**\\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\\n * removing labels until it finds a result.\\n * @param name The name to resolve, in DNS-encoded and normalised form.\\n * @return resolver The Resolver responsible for this name.\\n * @return namehash The namehash of the full name.\\n * @return finalOffset The offset of the first label with a resolver.\\n */\\n function findResolver(\\n bytes calldata name\\n ) public view returns (Resolver, bytes32, uint256) {\\n (\\n address resolver,\\n bytes32 namehash,\\n uint256 finalOffset\\n ) = findResolver(name, 0);\\n return (Resolver(resolver), namehash, finalOffset);\\n }\\n\\n function findResolver(\\n bytes calldata name,\\n uint256 offset\\n ) internal view returns (address, bytes32, uint256) {\\n uint256 labelLength = uint256(uint8(name[offset]));\\n if (labelLength == 0) {\\n return (address(0), bytes32(0), offset);\\n }\\n uint256 nextLabel = offset + labelLength + 1;\\n bytes32 labelHash;\\n if (\\n labelLength == 66 &&\\n // 0x5b == '['\\n name[offset + 1] == 0x5b &&\\n // 0x5d == ']'\\n name[nextLabel - 1] == 0x5d\\n ) {\\n // Encrypted label\\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\\n .hexStringToBytes32(0, 64);\\n } else {\\n labelHash = keccak256(name[offset + 1:nextLabel]);\\n }\\n (\\n address parentresolver,\\n bytes32 parentnode,\\n uint256 parentoffset\\n ) = findResolver(name, nextLabel);\\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\\n address resolver = registry.resolver(node);\\n if (resolver != address(0)) {\\n return (resolver, node, offset);\\n }\\n return (parentresolver, node, parentoffset);\\n }\\n\\n function _hasExtendedResolver(\\n address resolver\\n ) internal view returns (bool) {\\n try\\n Resolver(resolver).supportsInterface{gas: 50000}(\\n type(IExtendedResolver).interfaceId\\n )\\n returns (bool supported) {\\n return supported;\\n } catch {\\n return false;\\n }\\n }\\n\\n function _multicall(\\n MulticallData memory multicallData\\n ) internal view returns (bytes[] memory results) {\\n uint256 length = multicallData.data.length;\\n uint256 offchainCount = 0;\\n OffchainLookupCallData[]\\n memory callDatas = new OffchainLookupCallData[](length);\\n OffchainLookupExtraData[]\\n memory extraDatas = new OffchainLookupExtraData[](length);\\n results = new bytes[](length);\\n bool isCallback = multicallData.name.length == 0;\\n bool hasExtendedResolver = _hasExtendedResolver(multicallData.resolver);\\n\\n require(\\n !multicallData.isWildcard || hasExtendedResolver,\\n \\\"UniversalResolver: Wildcard on non-extended resolvers is not supported\\\"\\n );\\n\\n for (uint256 i = 0; i < length; i++) {\\n bytes memory item = multicallData.data[i];\\n bool failure = multicallData.failures[i];\\n if (failure) {\\n results[i] = item;\\n continue;\\n }\\n if (!isCallback && hasExtendedResolver) {\\n item = abi.encodeCall(\\n IExtendedResolver.resolve,\\n (multicallData.name, item)\\n );\\n }\\n (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool success\\n ) = callWithOffchainLookupPropagation(multicallData.resolver, item);\\n\\n if (offchain) {\\n callDatas[offchainCount] = abi.decode(\\n returnData,\\n (OffchainLookupCallData)\\n );\\n extraDatas[i] = extraData;\\n offchainCount += 1;\\n continue;\\n }\\n\\n if (success && hasExtendedResolver) {\\n // if this is a successful resolve() call, unwrap the result\\n returnData = abi.decode(returnData, (bytes));\\n }\\n results[i] = returnData;\\n extraDatas[i].data = multicallData.data[i];\\n }\\n\\n if (offchainCount == 0) {\\n return results;\\n }\\n\\n // Trim callDatas if offchain data exists\\n assembly {\\n mstore(callDatas, offchainCount)\\n }\\n\\n revert OffchainLookup(\\n address(this),\\n multicallData.gateways,\\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\\n multicallData.callbackFunction,\\n abi.encode(\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0x737ecb5a0ef64c6da8eab2f466382e9aeee045020343be0cd77c9309cd9597b1\",\"license\":\"MIT\"},\"contracts/wrapper/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ~0.8.17;\\n\\nlibrary BytesUtils {\\n /*\\n * @dev Returns the keccak-256 hash of a byte range.\\n * @param self The byte string to hash.\\n * @param offset The position to start hashing at.\\n * @param len The number of bytes to hash.\\n * @return The hash of the byte range.\\n */\\n function keccak(\\n bytes memory self,\\n uint256 offset,\\n uint256 len\\n ) internal pure returns (bytes32 ret) {\\n require(offset + len <= self.length);\\n assembly {\\n ret := keccak256(add(add(self, 32), offset), len)\\n }\\n }\\n\\n /**\\n * @dev Returns the ENS namehash of a DNS-encoded name.\\n * @param self The DNS-encoded name to hash.\\n * @param offset The offset at which to start hashing.\\n * @return The namehash of the name.\\n */\\n function namehash(\\n bytes memory self,\\n uint256 offset\\n ) internal pure returns (bytes32) {\\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\\n if (labelhash == bytes32(0)) {\\n require(offset == self.length - 1, \\\"namehash: Junk at end of name\\\");\\n return bytes32(0);\\n }\\n return\\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\\n }\\n\\n /**\\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\\n * @param self The byte string to read a label from.\\n * @param idx The index to read a label at.\\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\\n * @return newIdx The index of the start of the next label.\\n */\\n function readLabel(\\n bytes memory self,\\n uint256 idx\\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\\n require(idx < self.length, \\\"readLabel: Index out of bounds\\\");\\n uint256 len = uint256(uint8(self[idx]));\\n if (len > 0) {\\n labelhash = keccak(self, idx + 1, len);\\n } else {\\n labelhash = bytes32(0);\\n }\\n newIdx = idx + len + 1;\\n }\\n}\\n\",\"keccak256\":\"0xf862cd86d749158a554e3cb517efa9097331ec0cf7225117f21e96fb50c67edb\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60a06040523480156200001157600080fd5b5060405162003868380380620038688339810160408190526200003491620001da565b6200003f336200006a565b6001600160a01b038216608052805162000061906001906020840190620000ba565b5050506200049c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000105579160200282015b82811115620001055782518290620000f49082620003d0565b5091602001919060010190620000db565b506200011392915062000117565b5090565b80821115620001135760006200012e828262000138565b5060010162000117565b508054620001469062000341565b6000825580601f1062000157575050565b601f0160209004906000526020600020908101906200017791906200017a565b50565b5b808211156200011357600081556001016200017b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001d257620001d262000191565b604052919050565b6000806040808486031215620001ef57600080fd5b83516001600160a01b03811681146200020757600080fd5b602085810151919450906001600160401b03808211156200022757600080fd5b8187019150601f88818401126200023d57600080fd5b82518281111562000252576200025262000191565b8060051b62000263868201620001a7565b918252848101860191868101908c8411156200027e57600080fd5b87870192505b838310156200032e578251868111156200029e5760008081fd5b8701603f81018e13620002b15760008081fd5b8881015187811115620002c857620002c862000191565b620002db818801601f19168b01620001a7565b8181528f8c838501011115620002f15760008081fd5b60005b8281101562000311578381018d01518282018d01528b01620002f4565b5060009181018b0191909152835250918701919087019062000284565b8099505050505050505050509250929050565b600181811c908216806200035657607f821691505b6020821081036200037757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003cb57600081815260208120601f850160051c81016020861015620003a65750805b601f850160051c820191505b81811015620003c757828155600101620003b2565b5050505b505050565b81516001600160401b03811115620003ec57620003ec62000191565b6200040481620003fd845462000341565b846200037d565b602080601f8311600181146200043c5760008415620004235750858301515b600019600386901b1c1916600185901b178555620003c7565b600085815260208120601f198616915b828110156200046d578886015182559484019460019091019084016200044c565b50858210156200048c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b6080516133a9620004bf600039600081816101ea01526113f401526133a96000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612187565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046123ae565b61035c565b60405161015a92919061248c565b610197610192366004612537565b610391565b60405161015a9291906125a0565b6101b86101b3366004612615565b61047e565b60405161015a9493929190612681565b6101d061054b565b005b6101976101e03660046126bd565b61055f565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461271c565b610587565b6101d06102563660046127e2565b61061d565b61017661026936600461281f565b61063c565b61028161027c36600461287e565b610735565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b43660046128c0565b61075b565b60405161015a91906128d9565b6101b86102d43660046128ec565b610807565b6101976102e7366004612615565b6108f8565b6101766102fa366004612615565b61093c565b6101b861030d36600461287e565b6109a0565b6101d0610320366004612960565b610a95565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b60405180602001604052806000815250610587565b9150915094509492505050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156104695783829060005260206000200180546103dc9061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546104089061297d565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050815260200190600101906103bd565b5050505061055f565b91509150935093915050565b6060600080808080808061049c8c8c8c8c636dc4fb7360e01b610b2a565b935093509350935060008151111561050e57600080828060200190518101906104c591906129fc565b915091506000866000815181106104de576104de612a4e565b60200260200101518060200190518101906104f99190612a64565b929a5091985096509294506105409350505050565b6105338460008151811061052457610524612a4e565b60200260200101518484610eb0565b9750975097509750505050505b945094509450949050565b610553611011565b61055d600061106b565b565b606060006103848686868663b4a8580160e01b604051806020016040528060008152506110d3565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105a357905050905086816000815181106105ce576105ce612a4e565b60200260200101819052506000806105ea8b8b858b8b8b6110d3565b915091508160008151811061060157610601612a4e565b602002602001015181945094505050505b965096945050505050565b610625611011565b80516106389060019060208401906120b4565b5050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156107145783829060005260206000200180546106879061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546106b39061297d565b80156107005780601f106106d557610100808354040283529160200191610700565b820191906000526020600020905b8154815290600101906020018083116106e357829003601f168201915b505050505081526020019060010190610668565b5050505063e0a8541260e01b60405180602001604052806000815250610587565b60008060008060008061074a888860006111ed565b919750955093505050509250925092565b6001818154811061076b57600080fd5b9060005260206000200160009150905080546107869061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546107b29061297d565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b505050505081565b6060600080600080610853600089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061149b9050565b60405160240161086591815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f3431000000000000000000000000000000000000000000000000000000001790528151908101909152600080825291925081906108d5908b908b9086908c90636dc4fb7360e01b90610587565b915091506108e482828a610eb0565b965096509650965050505093509350935093565b60606000808061092b888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b2a565b50919a909950975050505050505050565b60606000808061096f888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b2a565b5050915091508160008151811061098857610988612a4e565b60200260200101518193509350505094509492505050565b60606000806000610a8386866001805480602002602001604051908101604052809291908181526020016000905b82821015610a7a5783829060005260206000200180546109ed9061297d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a199061297d565b8015610a665780601f10610a3b57610100808354040283529160200191610a66565b820191906000526020600020905b815481529060010190602001808311610a4957829003601f168201915b5050505050815260200190600101906109ce565b50505050610807565b93509350935093505b92959194509250565b610a9d611011565b6001600160a01b038116610b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610b278161106b565b50565b60606000606080610b8e60405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610bad8b8d018d612a8f565b90925090506060610bc08a8c018c612b47565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610bfa57600080fd5b805167ffffffffffffffff811115610c1457610c146121f4565b604051908082528060200260200182016040528015610c4757816020015b6060815260200190600190039081610c325790505b506020850152805167ffffffffffffffff811115610c6757610c676121f4565b604051908082528060200260200182016040528015610c90578160200160208202803683370190505b5060e08501526000805b8251811015610e7e578251600090849083908110610cba57610cba612a4e565b6020026020010151600001516001600160e01b03191603610d1957828181518110610ce757610ce7612a4e565b60200260200101516020015186602001518281518110610d0957610d09612a4e565b6020026020010181905250610e6c565b848281518110610d2b57610d2b612a4e565b602002602001015115610da25760018660e001518281518110610d5057610d50612a4e565b602002602001019015159081151581525050838281518110610d7457610d74612a4e565b602002602001015186602001518281518110610d9257610d92612a4e565b6020026020010181905250610e5e565b828181518110610db457610db4612a4e565b602002602001015160000151848381518110610dd257610dd2612a4e565b6020026020010151848381518110610dec57610dec612a4e565b602002602001015160200151604051602401610e09929190612ccb565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e5257610e52612a4e565b60200260200101819052505b610e69826001612d0f565b91505b80610e7681612d22565b915050610c9a565b50610e888561155a565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610ecc9190612d3b565b9050600080610eda83611a04565b91509150600081604051602401610ef391815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f4d9187918e910161248c565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610f9c959493929190612dc8565b600060405180830381865afa158015610fb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe191908101906129fc565b91509150600082806020019051810190610ffb9190612a64565b979f979e50909b50959950505050505050505050565b6000546001600160a01b0316331461055d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b15565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008060006110e48a8a610735565b919450849350909150506001600160a01b0382166111085750600091506106129050565b604080516101206020601f8d01819004028201810190925261010081018b8152831515926111dd929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff8111156111ac576111ac6121f4565b6040519080825280602002602001820160405280156111d5578160200160208202803683370190505b50905261155a565b9450505050965096945050505050565b60008060008086868681811061120557611205612a4e565b919091013560f81c9150506000819003611229575060009250829150839050611492565b60006112358287612d0f565b611240906001612d0f565b905060008260421480156112865750888861125c896001612d0f565b81811061126b5761126b612a4e565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156112c45750888861129a600185612e31565b8181106112a9576112a9612a4e565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561133c57611334600060408b8b6112dd8c6002612d0f565b906112e9600189612e31565b926112f693929190612e44565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611c2d9050565b50905061136e565b8888611349896001612d0f565b61135592859290612e44565b604051611363929190612e6e565b604051809103902090505b600080600061137e8c8c876111ed565b925092509250600082856040516020016113a2929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f9190612a64565b90506001600160a01b03811615611483579950975089965061149295505050505050565b50929850919650909450505050505b93509350939050565b60008060006114aa8585611cfe565b90925090508161151c57600185516114c29190612e31565b84146115105760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d650000006044820152606401610b15565b50600091506103569050565b611526858261149b565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff81111561157f5761157f6121f4565b6040519080825280602002602001820160405280156115dd57816020015b6115ca604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b81526020019060019003908161159d5790505b50905060008367ffffffffffffffff8111156115fb576115fb6121f4565b60405190808252806020026020018201604052801561164157816020015b6040805180820190915260008152606060208201528152602001906001900390816116195790505b5090508367ffffffffffffffff81111561165d5761165d6121f4565b60405190808252806020026020018201604052801561169057816020015b606081526020019060019003908161167b5790505b5086515160a088015191965015906000906116aa90611db5565b9050876080015115806116ba5750805b6117525760405162461bcd60e51b815260206004820152604660248201527f556e6976657273616c5265736f6c7665723a2057696c6463617264206f6e206e60448201527f6f6e2d657874656e646564207265736f6c76657273206973206e6f742073757060648201527f706f727465640000000000000000000000000000000000000000000000000000608482015260a401610b15565b60005b868110156119425760008960200151828151811061177557611775612a4e565b6020026020010151905060008a60e00151838151811061179757611797612a4e565b6020026020010151905080156117cc57818a84815181106117ba576117ba612a4e565b60200260200101819052505050611930565b841580156117d75750835b1561181d578a516040516117f091908490602401612ccb565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b17905291505b6000806000806118318f60a0015187611e30565b935093509350935083156118a657828060200190518101906118539190612efe565b8b8d8151811061186557611865612a4e565b6020026020010181905250818a888151811061188357611883612a4e565b602090810291909101015261189960018d612d0f565b9b50505050505050611930565b8080156118b05750875b156118cc57828060200190518101906118c99190612d3b565b92505b828e88815181106118df576118df612a4e565b60200260200101819052508e60200151878151811061190057611900612a4e565b60200260200101518a888151811061191a5761191a612a4e565b6020026020010151602001819052505050505050505b8061193a81612d22565b915050611755565b508460000361195657505050505050919050565b84845230886040015163a780bab660e01b866040516024016119789190612ff9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050508a606001518b608001518c60a001518d604001518e60c001518a6040516020016119d995949392919061305b565b60408051601f1981840301815290829052630556f18360e41b8252610b159594939291600401613118565b805160609060009081908490611a1b816002612d0f565b67ffffffffffffffff811115611a3357611a336121f4565b6040519080825280601f01601f191660200182016040528015611a5d576020820181803683370190505b50945060009350808403611aa257600060f81b85600081518110611a8357611a83612a4e565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611aba57611aba612a4e565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611b7c578360f81b868260010181518110611b2057611b20612a4e565b60200101906001600160f81b031916908160001a90535084611b49846001840160ff8816611fa9565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611bcc565b600184019350828181518110611b9457611b94612a4e565b602001015160f81c60f81b868260010181518110611bb457611bb4612a4e565b60200101906001600160f81b031916908160001a9053505b8015611bdb5760001901611aa8565b5083611bec83600060ff8716611fa9565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611a8357611a83612a4e565b8251600090600190831115611c4157600080fd5b611c92565b6000603a8210602f83111615611c5e5750602f190190565b60478210604083111615611c7457506036190190565b60678210606083111615611c8a57506056190190565b5060ff919050565b60208501845b84811015611cf457611caf8183015160001a611c46565b611cc16001830184015160001a611c46565b60ff811460ff83141715611cda57600094505050611cf4565b60049190911b1760089490941b9390931792600201611c98565b5050935093915050565b60008083518310611d515760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e647300006044820152606401610b15565b6000848481518110611d6557611d65612a4e565b016020015160f81c90508015611d9157611d8a85611d84866001612d0f565b83611fa9565b9250611d96565b600092505b611da08185612d0f565b611dab906001612d0f565b9150509250929050565b6040516301ffc9a760e01b8152639061b92360e01b60048201526000906001600160a01b038316906301ffc9a79061c350906024016020604051808303818786fa93505050508015611e24575060408051601f3d908101601f19168201909252611e219181019061314c565b60015b61035657506000919050565b60408051808201909152600080825260606020830181905290916000611e568686611fcd565b90503d8115611e7c576000611e6c60008361205f565b909550935060019150610a8c9050565b60048110611f9f576000611e926000600461205f565b90506000611eaa6004611ea58186612e31565b61205f565b9050630556f18360e41b611ebd83613169565b6001600160e01b03191603611f8b57600080600080600085806020019051810190611ee891906131a1565b945094509450945094508d6001600160a01b0316856001600160a01b031603611f81576040518060600160405280866001600160a01b0316815260200185815260200184815250604051602001611f3f9190613251565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b50909950975060009650610a8c95505050505050565b5050505050611f9c565b600096509450859250610a8c915050565b50505b5092959194509250565b8251600090611fb88385612d0f565b1115611fc357600080fd5b5091016020012090565b60006001600160a01b0383163b61204c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e74726163740000000000000000000000000000000000006064820152608401610b15565b600080835160208501865afa9392505050565b60608167ffffffffffffffff81111561207a5761207a6121f4565b6040519080825280601f01601f1916602001820160405280156120a4576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156120fa579160200282015b828111156120fa57825182906120ea90826132b3565b50916020019190600101906120d4565b5061210692915061210a565b5090565b8082111561210657600061211e8282612127565b5060010161210a565b5080546121339061297d565b6000825580601f10612143575050565b601f016020900490600052602060002090810190610b2791905b80821115612106576000815560010161215d565b6001600160e01b031981168114610b2757600080fd5b60006020828403121561219957600080fd5b81356121a481612171565b9392505050565b60008083601f8401126121bd57600080fd5b50813567ffffffffffffffff8111156121d557600080fd5b6020830191508360208285010111156121ed57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561222d5761222d6121f4565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561225c5761225c6121f4565b604052919050565b600067ffffffffffffffff82111561227e5761227e6121f4565b50601f01601f191660200190565b600061229f61229a84612264565b612233565b90508281528383830111156122b357600080fd5b828260208301376000602084830101529392505050565b600082601f8301126122db57600080fd5b6121a48383356020850161228c565b600067ffffffffffffffff821115612304576123046121f4565b5060051b60200190565b600082601f83011261231f57600080fd5b8135602061232f61229a836122ea565b82815260059290921b8401810191818101908684111561234e57600080fd5b8286015b848110156123a357803567ffffffffffffffff8111156123725760008081fd5b8701603f810189136123845760008081fd5b61239589868301356040840161228c565b845250918301918301612352565b509695505050505050565b600080600080606085870312156123c457600080fd5b843567ffffffffffffffff808211156123dc57600080fd5b6123e8888389016121ab565b9096509450602087013591508082111561240157600080fd5b61240d888389016122ca565b9350604087013591508082111561242357600080fd5b506124308782880161230e565b91505092959194509250565b60005b8381101561245757818101518382015260200161243f565b50506000910152565b6000815180845261247881602086016020860161243c565b601f01601f19169290920160200192915050565b60408152600061249f6040830185612460565b90506001600160a01b03831660208301529392505050565b600082601f8301126124c857600080fd5b813560206124d861229a836122ea565b82815260059290921b840181019181810190868411156124f757600080fd5b8286015b848110156123a357803567ffffffffffffffff81111561251b5760008081fd5b6125298986838b01016122ca565b8452509183019183016124fb565b60008060006040848603121561254c57600080fd5b833567ffffffffffffffff8082111561256457600080fd5b612570878388016121ab565b9095509350602086013591508082111561258957600080fd5b50612596868287016124b7565b9150509250925092565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156125f757605f198887030185526125e5868351612460565b955093820193908201906001016125c9565b50508394506001600160a01b03871681870152505050509392505050565b6000806000806040858703121561262b57600080fd5b843567ffffffffffffffff8082111561264357600080fd5b61264f888389016121ab565b9096509450602087013591508082111561266857600080fd5b50612675878288016121ab565b95989497509550505050565b6080815260006126946080830187612460565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156126d357600080fd5b843567ffffffffffffffff808211156126eb57600080fd5b6126f7888389016121ab565b9096509450602087013591508082111561271057600080fd5b61240d888389016124b7565b60008060008060008060a0878903121561273557600080fd5b863567ffffffffffffffff8082111561274d57600080fd5b6127598a838b016121ab565b9098509650602089013591508082111561277257600080fd5b61277e8a838b016122ca565b9550604089013591508082111561279457600080fd5b6127a08a838b0161230e565b9450606089013591506127b282612171565b909250608088013590808211156127c857600080fd5b506127d589828a016122ca565b9150509295509295509295565b6000602082840312156127f457600080fd5b813567ffffffffffffffff81111561280b57600080fd5b6128178482850161230e565b949350505050565b60008060006040848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016121ab565b9095509350602086013591508082111561287157600080fd5b50612596868287016122ca565b6000806020838503121561289157600080fd5b823567ffffffffffffffff8111156128a857600080fd5b6128b4858286016121ab565b90969095509350505050565b6000602082840312156128d257600080fd5b5035919050565b6020815260006121a46020830184612460565b60008060006040848603121561290157600080fd5b833567ffffffffffffffff8082111561291957600080fd5b612925878388016121ab565b9095509350602086013591508082111561293e57600080fd5b506125968682870161230e565b6001600160a01b0381168114610b2757600080fd5b60006020828403121561297257600080fd5b81356121a48161294b565b600181811c9082168061299157607f821691505b6020821081036129b157634e487b7160e01b600052602260045260246000fd5b50919050565b600082601f8301126129c857600080fd5b81516129d661229a82612264565b8181528460208386010111156129eb57600080fd5b61281782602083016020870161243c565b60008060408385031215612a0f57600080fd5b825167ffffffffffffffff811115612a2657600080fd5b612a32858286016129b7565b9250506020830151612a438161294b565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a7657600080fd5b81516121a48161294b565b8015158114610b2757600080fd5b60008060408385031215612aa257600080fd5b823567ffffffffffffffff80821115612aba57600080fd5b818501915085601f830112612ace57600080fd5b81356020612ade61229a836122ea565b82815260059290921b84018101918181019089841115612afd57600080fd5b948201945b83861015612b24578535612b1581612a81565b82529482019490820190612b02565b96505086013592505080821115612b3a57600080fd5b50611dab858286016124b7565b600080600080600060a08688031215612b5f57600080fd5b612b698635612a81565b85359450612b7a602087013561294b565b6020860135935067ffffffffffffffff8060408801351115612b9b57600080fd5b612bab886040890135890161230e565b93508060608801351115612bbe57600080fd5b612bce88606089013589016122ca565b92508060808801351115612be157600080fd5b6080870135870188601f820112612bf757600080fd5b612c0461229a82356122ea565b81358082526020808301929160051b8401018b1015612c2257600080fd5b602083015b6020843560051b850101811015612cb9578481351115612c4657600080fd5b803584016040818e03601f19011215612c5e57600080fd5b612c6661220a565b612c736020830135612171565b602082013581528660408301351115612c8b57600080fd5b612c9e8e602060408501358501016122ca565b60208201528085525050602083019250602081019050612c27565b50809450505050509295509295909350565b604081526000612cde6040830185612460565b8281036020840152612cf08185612460565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612cf9565b600060018201612d3457612d34612cf9565b5060010190565b600060208284031215612d4d57600080fd5b815167ffffffffffffffff811115612d6457600080fd5b612817848285016129b7565b600082825180855260208086019550808260051b84010181860160005b84811015612dbb57601f19868403018952612da9838351612460565b98840198925090830190600101612d8d565b5090979650505050505050565b60a081526000612ddb60a0830188612460565b8281036020840152612ded8188612460565b90508281036040840152612e018187612d70565b90506001600160e01b0319851660608401528281036080840152612e258185612460565b98975050505050505050565b8181038181111561035657610356612cf9565b60008085851115612e5457600080fd5b83861115612e6157600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f830112612e8f57600080fd5b81516020612e9f61229a836122ea565b82815260059290921b84018101918181019086841115612ebe57600080fd5b8286015b848110156123a357805167ffffffffffffffff811115612ee25760008081fd5b612ef08986838b01016129b7565b845250918301918301612ec2565b600060208284031215612f1057600080fd5b815167ffffffffffffffff80821115612f2857600080fd5b9083019060608286031215612f3c57600080fd5b604051606081018181108382111715612f5757612f576121f4565b6040528251612f658161294b565b8152602083015182811115612f7957600080fd5b612f8587828601612e7e565b602083015250604083015182811115612f9d57600080fd5b612fa9878286016129b7565b60408301525095945050505050565b6001600160a01b0381511682526000602082015160606020850152612fe06060850182612d70565b905060408301518482036040860152612cf08282612460565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561304e57603f1988860301845261303c858351612fb8565b94509285019290850190600101613020565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261308760a0850188612d70565b84810360608601526130998188612460565b905084810360808601528086518083528483019150848160051b84010185890160005b8381101561310557858303601f19018552815180516001600160e01b03191684528801518884018890526130f288850182612460565b95890195935050908701906001016130bc565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061313a60a0830187612d70565b8281036040840152612e018187612460565b60006020828403121561315e57600080fd5b81516121a481612a81565b6000815160208301516001600160e01b0319808216935060048310156131995780818460040360031b1b83161693505b505050919050565b600080600080600060a086880312156131b957600080fd5b85516131c48161294b565b602087015190955067ffffffffffffffff808211156131e257600080fd5b6131ee89838a01612e7e565b9550604088015191508082111561320457600080fd5b61321089838a016129b7565b94506060880151915061322282612171565b60808801519193508082111561323757600080fd5b50613244888289016129b7565b9150509295509295909350565b6020815260006121a46020830184612fb8565b601f8211156132ae57600081815260208120601f850160051c8101602086101561328b5750805b601f850160051c820191505b818110156132aa57828155600101613297565b5050505b505050565b815167ffffffffffffffff8111156132cd576132cd6121f4565b6132e1816132db845461297d565b84613264565b602080601f83116001811461331657600084156132fe5750858301515b600019600386901b1c1916600185901b1785556132aa565b600085815260208120601f198616915b8281101561334557888601518255948401946001909101908401613326565b50858210156133635787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220c75a929088eba339e8efd5544f5405265d4fcf80b2ff6979b74bf7f1e4398c6f64736f6c63430008110033", - "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612187565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046123ae565b61035c565b60405161015a92919061248c565b610197610192366004612537565b610391565b60405161015a9291906125a0565b6101b86101b3366004612615565b61047e565b60405161015a9493929190612681565b6101d061054b565b005b6101976101e03660046126bd565b61055f565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461271c565b610587565b6101d06102563660046127e2565b61061d565b61017661026936600461281f565b61063c565b61028161027c36600461287e565b610735565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b43660046128c0565b61075b565b60405161015a91906128d9565b6101b86102d43660046128ec565b610807565b6101976102e7366004612615565b6108f8565b6101766102fa366004612615565b61093c565b6101b861030d36600461287e565b6109a0565b6101d0610320366004612960565b610a95565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b60405180602001604052806000815250610587565b9150915094509492505050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156104695783829060005260206000200180546103dc9061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546104089061297d565b80156104555780601f1061042a57610100808354040283529160200191610455565b820191906000526020600020905b81548152906001019060200180831161043857829003601f168201915b5050505050815260200190600101906103bd565b5050505061055f565b91509150935093915050565b6060600080808080808061049c8c8c8c8c636dc4fb7360e01b610b2a565b935093509350935060008151111561050e57600080828060200190518101906104c591906129fc565b915091506000866000815181106104de576104de612a4e565b60200260200101518060200190518101906104f99190612a64565b929a5091985096509294506105409350505050565b6105338460008151811061052457610524612a4e565b60200260200101518484610eb0565b9750975097509750505050505b945094509450949050565b610553611011565b61055d600061106b565b565b606060006103848686868663b4a8580160e01b604051806020016040528060008152506110d3565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105a357905050905086816000815181106105ce576105ce612a4e565b60200260200101819052506000806105ea8b8b858b8b8b6110d3565b915091508160008151811061060157610601612a4e565b602002602001015181945094505050505b965096945050505050565b610625611011565b80516106389060019060208401906120b4565b5050565b606060006104728585856001805480602002602001604051908101604052809291908181526020016000905b828210156107145783829060005260206000200180546106879061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546106b39061297d565b80156107005780601f106106d557610100808354040283529160200191610700565b820191906000526020600020905b8154815290600101906020018083116106e357829003601f168201915b505050505081526020019060010190610668565b5050505063e0a8541260e01b60405180602001604052806000815250610587565b60008060008060008061074a888860006111ed565b919750955093505050509250925092565b6001818154811061076b57600080fd5b9060005260206000200160009150905080546107869061297d565b80601f01602080910402602001604051908101604052809291908181526020018280546107b29061297d565b80156107ff5780601f106107d4576101008083540402835291602001916107ff565b820191906000526020600020905b8154815290600101906020018083116107e257829003601f168201915b505050505081565b6060600080600080610853600089898080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929392505061149b9050565b60405160240161086591815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f3431000000000000000000000000000000000000000000000000000000001790528151908101909152600080825291925081906108d5908b908b9086908c90636dc4fb7360e01b90610587565b915091506108e482828a610eb0565b965096509650965050505093509350935093565b60606000808061092b888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b2a565b50919a909950975050505050505050565b60606000808061096f888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b2a565b5050915091508160008151811061098857610988612a4e565b60200260200101518193509350505094509492505050565b60606000806000610a8386866001805480602002602001604051908101604052809291908181526020016000905b82821015610a7a5783829060005260206000200180546109ed9061297d565b80601f0160208091040260200160405190810160405280929190818152602001828054610a199061297d565b8015610a665780601f10610a3b57610100808354040283529160200191610a66565b820191906000526020600020905b815481529060010190602001808311610a4957829003601f168201915b5050505050815260200190600101906109ce565b50505050610807565b93509350935093505b92959194509250565b610a9d611011565b6001600160a01b038116610b1e5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b610b278161106b565b50565b60606000606080610b8e60405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610bad8b8d018d612a8f565b90925090506060610bc08a8c018c612b47565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610bfa57600080fd5b805167ffffffffffffffff811115610c1457610c146121f4565b604051908082528060200260200182016040528015610c4757816020015b6060815260200190600190039081610c325790505b506020850152805167ffffffffffffffff811115610c6757610c676121f4565b604051908082528060200260200182016040528015610c90578160200160208202803683370190505b5060e08501526000805b8251811015610e7e578251600090849083908110610cba57610cba612a4e565b6020026020010151600001516001600160e01b03191603610d1957828181518110610ce757610ce7612a4e565b60200260200101516020015186602001518281518110610d0957610d09612a4e565b6020026020010181905250610e6c565b848281518110610d2b57610d2b612a4e565b602002602001015115610da25760018660e001518281518110610d5057610d50612a4e565b602002602001019015159081151581525050838281518110610d7457610d74612a4e565b602002602001015186602001518281518110610d9257610d92612a4e565b6020026020010181905250610e5e565b828181518110610db457610db4612a4e565b602002602001015160000151848381518110610dd257610dd2612a4e565b6020026020010151848381518110610dec57610dec612a4e565b602002602001015160200151604051602401610e09929190612ccb565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e5257610e52612a4e565b60200260200101819052505b610e69826001612d0f565b91505b80610e7681612d22565b915050610c9a565b50610e888561155a565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610ecc9190612d3b565b9050600080610eda83611a04565b91509150600081604051602401610ef391815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f4d9187918e910161248c565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610f9c959493929190612dc8565b600060405180830381865afa158015610fb9573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610fe191908101906129fc565b91509150600082806020019051810190610ffb9190612a64565b979f979e50909b50959950505050505050505050565b6000546001600160a01b0316331461055d5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b15565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b606060008060006110e48a8a610735565b919450849350909150506001600160a01b0382166111085750600091506106129050565b604080516101206020601f8d01819004028201810190925261010081018b8152831515926111dd929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff8111156111ac576111ac6121f4565b6040519080825280602002602001820160405280156111d5578160200160208202803683370190505b50905261155a565b9450505050965096945050505050565b60008060008086868681811061120557611205612a4e565b919091013560f81c9150506000819003611229575060009250829150839050611492565b60006112358287612d0f565b611240906001612d0f565b905060008260421480156112865750888861125c896001612d0f565b81811061126b5761126b612a4e565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156112c45750888861129a600185612e31565b8181106112a9576112a9612a4e565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561133c57611334600060408b8b6112dd8c6002612d0f565b906112e9600189612e31565b926112f693929190612e44565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611c2d9050565b50905061136e565b8888611349896001612d0f565b61135592859290612e44565b604051611363929190612e6e565b604051809103902090505b600080600061137e8c8c876111ed565b925092509250600082856040516020016113a2929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561143b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061145f9190612a64565b90506001600160a01b03811615611483579950975089965061149295505050505050565b50929850919650909450505050505b93509350939050565b60008060006114aa8585611cfe565b90925090508161151c57600185516114c29190612e31565b84146115105760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d650000006044820152606401610b15565b50600091506103569050565b611526858261149b565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff81111561157f5761157f6121f4565b6040519080825280602002602001820160405280156115dd57816020015b6115ca604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b81526020019060019003908161159d5790505b50905060008367ffffffffffffffff8111156115fb576115fb6121f4565b60405190808252806020026020018201604052801561164157816020015b6040805180820190915260008152606060208201528152602001906001900390816116195790505b5090508367ffffffffffffffff81111561165d5761165d6121f4565b60405190808252806020026020018201604052801561169057816020015b606081526020019060019003908161167b5790505b5086515160a088015191965015906000906116aa90611db5565b9050876080015115806116ba5750805b6117525760405162461bcd60e51b815260206004820152604660248201527f556e6976657273616c5265736f6c7665723a2057696c6463617264206f6e206e60448201527f6f6e2d657874656e646564207265736f6c76657273206973206e6f742073757060648201527f706f727465640000000000000000000000000000000000000000000000000000608482015260a401610b15565b60005b868110156119425760008960200151828151811061177557611775612a4e565b6020026020010151905060008a60e00151838151811061179757611797612a4e565b6020026020010151905080156117cc57818a84815181106117ba576117ba612a4e565b60200260200101819052505050611930565b841580156117d75750835b1561181d578a516040516117f091908490602401612ccb565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b17905291505b6000806000806118318f60a0015187611e30565b935093509350935083156118a657828060200190518101906118539190612efe565b8b8d8151811061186557611865612a4e565b6020026020010181905250818a888151811061188357611883612a4e565b602090810291909101015261189960018d612d0f565b9b50505050505050611930565b8080156118b05750875b156118cc57828060200190518101906118c99190612d3b565b92505b828e88815181106118df576118df612a4e565b60200260200101819052508e60200151878151811061190057611900612a4e565b60200260200101518a888151811061191a5761191a612a4e565b6020026020010151602001819052505050505050505b8061193a81612d22565b915050611755565b508460000361195657505050505050919050565b84845230886040015163a780bab660e01b866040516024016119789190612ff9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b0383818316178352505050508a606001518b608001518c60a001518d604001518e60c001518a6040516020016119d995949392919061305b565b60408051601f1981840301815290829052630556f18360e41b8252610b159594939291600401613118565b805160609060009081908490611a1b816002612d0f565b67ffffffffffffffff811115611a3357611a336121f4565b6040519080825280601f01601f191660200182016040528015611a5d576020820181803683370190505b50945060009350808403611aa257600060f81b85600081518110611a8357611a83612a4e565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611aba57611aba612a4e565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611b7c578360f81b868260010181518110611b2057611b20612a4e565b60200101906001600160f81b031916908160001a90535084611b49846001840160ff8816611fa9565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611bcc565b600184019350828181518110611b9457611b94612a4e565b602001015160f81c60f81b868260010181518110611bb457611bb4612a4e565b60200101906001600160f81b031916908160001a9053505b8015611bdb5760001901611aa8565b5083611bec83600060ff8716611fa9565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611a8357611a83612a4e565b8251600090600190831115611c4157600080fd5b611c92565b6000603a8210602f83111615611c5e5750602f190190565b60478210604083111615611c7457506036190190565b60678210606083111615611c8a57506056190190565b5060ff919050565b60208501845b84811015611cf457611caf8183015160001a611c46565b611cc16001830184015160001a611c46565b60ff811460ff83141715611cda57600094505050611cf4565b60049190911b1760089490941b9390931792600201611c98565b5050935093915050565b60008083518310611d515760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e647300006044820152606401610b15565b6000848481518110611d6557611d65612a4e565b016020015160f81c90508015611d9157611d8a85611d84866001612d0f565b83611fa9565b9250611d96565b600092505b611da08185612d0f565b611dab906001612d0f565b9150509250929050565b6040516301ffc9a760e01b8152639061b92360e01b60048201526000906001600160a01b038316906301ffc9a79061c350906024016020604051808303818786fa93505050508015611e24575060408051601f3d908101601f19168201909252611e219181019061314c565b60015b61035657506000919050565b60408051808201909152600080825260606020830181905290916000611e568686611fcd565b90503d8115611e7c576000611e6c60008361205f565b909550935060019150610a8c9050565b60048110611f9f576000611e926000600461205f565b90506000611eaa6004611ea58186612e31565b61205f565b9050630556f18360e41b611ebd83613169565b6001600160e01b03191603611f8b57600080600080600085806020019051810190611ee891906131a1565b945094509450945094508d6001600160a01b0316856001600160a01b031603611f81576040518060600160405280866001600160a01b0316815260200185815260200184815250604051602001611f3f9190613251565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b50909950975060009650610a8c95505050505050565b5050505050611f9c565b600096509450859250610a8c915050565b50505b5092959194509250565b8251600090611fb88385612d0f565b1115611fc357600080fd5b5091016020012090565b60006001600160a01b0383163b61204c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e74726163740000000000000000000000000000000000006064820152608401610b15565b600080835160208501865afa9392505050565b60608167ffffffffffffffff81111561207a5761207a6121f4565b6040519080825280601f01601f1916602001820160405280156120a4576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156120fa579160200282015b828111156120fa57825182906120ea90826132b3565b50916020019190600101906120d4565b5061210692915061210a565b5090565b8082111561210657600061211e8282612127565b5060010161210a565b5080546121339061297d565b6000825580601f10612143575050565b601f016020900490600052602060002090810190610b2791905b80821115612106576000815560010161215d565b6001600160e01b031981168114610b2757600080fd5b60006020828403121561219957600080fd5b81356121a481612171565b9392505050565b60008083601f8401126121bd57600080fd5b50813567ffffffffffffffff8111156121d557600080fd5b6020830191508360208285010111156121ed57600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff8111828210171561222d5761222d6121f4565b60405290565b604051601f8201601f1916810167ffffffffffffffff8111828210171561225c5761225c6121f4565b604052919050565b600067ffffffffffffffff82111561227e5761227e6121f4565b50601f01601f191660200190565b600061229f61229a84612264565b612233565b90508281528383830111156122b357600080fd5b828260208301376000602084830101529392505050565b600082601f8301126122db57600080fd5b6121a48383356020850161228c565b600067ffffffffffffffff821115612304576123046121f4565b5060051b60200190565b600082601f83011261231f57600080fd5b8135602061232f61229a836122ea565b82815260059290921b8401810191818101908684111561234e57600080fd5b8286015b848110156123a357803567ffffffffffffffff8111156123725760008081fd5b8701603f810189136123845760008081fd5b61239589868301356040840161228c565b845250918301918301612352565b509695505050505050565b600080600080606085870312156123c457600080fd5b843567ffffffffffffffff808211156123dc57600080fd5b6123e8888389016121ab565b9096509450602087013591508082111561240157600080fd5b61240d888389016122ca565b9350604087013591508082111561242357600080fd5b506124308782880161230e565b91505092959194509250565b60005b8381101561245757818101518382015260200161243f565b50506000910152565b6000815180845261247881602086016020860161243c565b601f01601f19169290920160200192915050565b60408152600061249f6040830185612460565b90506001600160a01b03831660208301529392505050565b600082601f8301126124c857600080fd5b813560206124d861229a836122ea565b82815260059290921b840181019181810190868411156124f757600080fd5b8286015b848110156123a357803567ffffffffffffffff81111561251b5760008081fd5b6125298986838b01016122ca565b8452509183019183016124fb565b60008060006040848603121561254c57600080fd5b833567ffffffffffffffff8082111561256457600080fd5b612570878388016121ab565b9095509350602086013591508082111561258957600080fd5b50612596868287016124b7565b9150509250925092565b6000604082016040835280855180835260608501915060608160051b8601019250602080880160005b838110156125f757605f198887030185526125e5868351612460565b955093820193908201906001016125c9565b50508394506001600160a01b03871681870152505050509392505050565b6000806000806040858703121561262b57600080fd5b843567ffffffffffffffff8082111561264357600080fd5b61264f888389016121ab565b9096509450602087013591508082111561266857600080fd5b50612675878288016121ab565b95989497509550505050565b6080815260006126946080830187612460565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156126d357600080fd5b843567ffffffffffffffff808211156126eb57600080fd5b6126f7888389016121ab565b9096509450602087013591508082111561271057600080fd5b61240d888389016124b7565b60008060008060008060a0878903121561273557600080fd5b863567ffffffffffffffff8082111561274d57600080fd5b6127598a838b016121ab565b9098509650602089013591508082111561277257600080fd5b61277e8a838b016122ca565b9550604089013591508082111561279457600080fd5b6127a08a838b0161230e565b9450606089013591506127b282612171565b909250608088013590808211156127c857600080fd5b506127d589828a016122ca565b9150509295509295509295565b6000602082840312156127f457600080fd5b813567ffffffffffffffff81111561280b57600080fd5b6128178482850161230e565b949350505050565b60008060006040848603121561283457600080fd5b833567ffffffffffffffff8082111561284c57600080fd5b612858878388016121ab565b9095509350602086013591508082111561287157600080fd5b50612596868287016122ca565b6000806020838503121561289157600080fd5b823567ffffffffffffffff8111156128a857600080fd5b6128b4858286016121ab565b90969095509350505050565b6000602082840312156128d257600080fd5b5035919050565b6020815260006121a46020830184612460565b60008060006040848603121561290157600080fd5b833567ffffffffffffffff8082111561291957600080fd5b612925878388016121ab565b9095509350602086013591508082111561293e57600080fd5b506125968682870161230e565b6001600160a01b0381168114610b2757600080fd5b60006020828403121561297257600080fd5b81356121a48161294b565b600181811c9082168061299157607f821691505b6020821081036129b157634e487b7160e01b600052602260045260246000fd5b50919050565b600082601f8301126129c857600080fd5b81516129d661229a82612264565b8181528460208386010111156129eb57600080fd5b61281782602083016020870161243c565b60008060408385031215612a0f57600080fd5b825167ffffffffffffffff811115612a2657600080fd5b612a32858286016129b7565b9250506020830151612a438161294b565b809150509250929050565b634e487b7160e01b600052603260045260246000fd5b600060208284031215612a7657600080fd5b81516121a48161294b565b8015158114610b2757600080fd5b60008060408385031215612aa257600080fd5b823567ffffffffffffffff80821115612aba57600080fd5b818501915085601f830112612ace57600080fd5b81356020612ade61229a836122ea565b82815260059290921b84018101918181019089841115612afd57600080fd5b948201945b83861015612b24578535612b1581612a81565b82529482019490820190612b02565b96505086013592505080821115612b3a57600080fd5b50611dab858286016124b7565b600080600080600060a08688031215612b5f57600080fd5b612b698635612a81565b85359450612b7a602087013561294b565b6020860135935067ffffffffffffffff8060408801351115612b9b57600080fd5b612bab886040890135890161230e565b93508060608801351115612bbe57600080fd5b612bce88606089013589016122ca565b92508060808801351115612be157600080fd5b6080870135870188601f820112612bf757600080fd5b612c0461229a82356122ea565b81358082526020808301929160051b8401018b1015612c2257600080fd5b602083015b6020843560051b850101811015612cb9578481351115612c4657600080fd5b803584016040818e03601f19011215612c5e57600080fd5b612c6661220a565b612c736020830135612171565b602082013581528660408301351115612c8b57600080fd5b612c9e8e602060408501358501016122ca565b60208201528085525050602083019250602081019050612c27565b50809450505050509295509295909350565b604081526000612cde6040830185612460565b8281036020840152612cf08185612460565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612cf9565b600060018201612d3457612d34612cf9565b5060010190565b600060208284031215612d4d57600080fd5b815167ffffffffffffffff811115612d6457600080fd5b612817848285016129b7565b600082825180855260208086019550808260051b84010181860160005b84811015612dbb57601f19868403018952612da9838351612460565b98840198925090830190600101612d8d565b5090979650505050505050565b60a081526000612ddb60a0830188612460565b8281036020840152612ded8188612460565b90508281036040840152612e018187612d70565b90506001600160e01b0319851660608401528281036080840152612e258185612460565b98975050505050505050565b8181038181111561035657610356612cf9565b60008085851115612e5457600080fd5b83861115612e6157600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f830112612e8f57600080fd5b81516020612e9f61229a836122ea565b82815260059290921b84018101918181019086841115612ebe57600080fd5b8286015b848110156123a357805167ffffffffffffffff811115612ee25760008081fd5b612ef08986838b01016129b7565b845250918301918301612ec2565b600060208284031215612f1057600080fd5b815167ffffffffffffffff80821115612f2857600080fd5b9083019060608286031215612f3c57600080fd5b604051606081018181108382111715612f5757612f576121f4565b6040528251612f658161294b565b8152602083015182811115612f7957600080fd5b612f8587828601612e7e565b602083015250604083015182811115612f9d57600080fd5b612fa9878286016129b7565b60408301525095945050505050565b6001600160a01b0381511682526000602082015160606020850152612fe06060850182612d70565b905060408301518482036040860152612cf08282612460565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561304e57603f1988860301845261303c858351612fb8565b94509285019290850190600101613020565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261308760a0850188612d70565b84810360608601526130998188612460565b905084810360808601528086518083528483019150848160051b84010185890160005b8381101561310557858303601f19018552815180516001600160e01b03191684528801518884018890526130f288850182612460565b95890195935050908701906001016130bc565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061313a60a0830187612d70565b8281036040840152612e018187612460565b60006020828403121561315e57600080fd5b81516121a481612a81565b6000815160208301516001600160e01b0319808216935060048310156131995780818460040360031b1b83161693505b505050919050565b600080600080600060a086880312156131b957600080fd5b85516131c48161294b565b602087015190955067ffffffffffffffff808211156131e257600080fd5b6131ee89838a01612e7e565b9550604088015191508082111561320457600080fd5b61321089838a016129b7565b94506060880151915061322282612171565b60808801519193508082111561323757600080fd5b50613244888289016129b7565b9150509295509295909350565b6020815260006121a46020830184612fb8565b601f8211156132ae57600081815260208120601f850160051c8101602086101561328b5750805b601f850160051c820191505b818110156132aa57828155600101613297565b5050505b505050565b815167ffffffffffffffff8111156132cd576132cd6121f4565b6132e1816132db845461297d565b84613264565b602080601f83116001811461331657600084156132fe5750858301515b600019600386901b1c1916600185901b1785556132aa565b600085815260208120601f198616915b8281101561334557888601518255948401946001909101908401613326565b50858210156133635787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea2646970667358221220c75a929088eba339e8efd5544f5405265d4fcf80b2ff6979b74bf7f1e4398c6f64736f6c63430008110033", + "numDeployments": 2, + "solcInputHash": "a268c4117fbf03c1acd17a54ea249795", + "metadata": "{\"compiler\":{\"version\":\"0.8.17+commit.8df45f5f\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_registry\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"status\",\"type\":\"uint16\"},{\"internalType\":\"string\",\"name\":\"message\",\"type\":\"string\"}],\"internalType\":\"struct HttpErrorItem[]\",\"name\":\"errors\",\"type\":\"tuple[]\"}],\"name\":\"HttpError\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"internalType\":\"string[]\",\"name\":\"urls\",\"type\":\"string[]\"},{\"internalType\":\"bytes\",\"name\":\"callData\",\"type\":\"bytes\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"OffchainLookup\",\"type\":\"error\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"name\":\"ResolverError\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverNotContract\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ResolverWildcardNotSupported\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"},{\"internalType\":\"bytes4\",\"name\":\"callbackFunction\",\"type\":\"bytes4\"},{\"internalType\":\"bytes\",\"name\":\"metaData\",\"type\":\"bytes\"}],\"name\":\"_resolveSingle\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"batchGatewayURLs\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"}],\"name\":\"findResolver\",\"outputs\":[{\"internalType\":\"contract Resolver\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"registry\",\"outputs\":[{\"internalType\":\"contract ENS\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"}],\"name\":\"resolve\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes[]\",\"name\":\"data\",\"type\":\"bytes[]\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"resolve\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"name\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"resolve\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveCallback\",\"outputs\":[{\"components\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"},{\"internalType\":\"bytes\",\"name\":\"returnData\",\"type\":\"bytes\"}],\"internalType\":\"struct Result[]\",\"name\":\"\",\"type\":\"tuple[]\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"resolveSingleCallback\",\"outputs\":[{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"},{\"internalType\":\"string[]\",\"name\":\"gateways\",\"type\":\"string[]\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"reverseName\",\"type\":\"bytes\"}],\"name\":\"reverse\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"response\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"extraData\",\"type\":\"bytes\"}],\"name\":\"reverseCallback\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string[]\",\"name\":\"_urls\",\"type\":\"string[]\"}],\"name\":\"setGatewayURLs\",\"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\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"findResolver(bytes)\":{\"details\":\"Finds a resolver by recursively querying the registry, starting at the longest name and progressively removing labels until it finds a result.\",\"params\":{\"name\":\"The name to resolve, in DNS-encoded and normalised form.\"},\"returns\":{\"_0\":\"resolver The Resolver responsible for this name.\",\"_1\":\"namehash The namehash of the full name.\",\"_2\":\"finalOffset The offset of the first label with a resolver.\"}},\"owner()\":{\"details\":\"Returns the address of the current owner.\"},\"renounceOwnership()\":{\"details\":\"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.\"},\"resolve(bytes,bytes)\":{\"details\":\"Performs ENS name resolution for the supplied name and resolution data.\",\"params\":{\"data\":\"The resolution data, as specified in ENSIP-10.\",\"name\":\"The name to resolve, in normalised and DNS-encoded form.\"},\"returns\":{\"_0\":\"The result of resolving the name.\"}},\"reverse(bytes,string[])\":{\"details\":\"Performs ENS name reverse resolution for the supplied reverse name.\",\"params\":{\"reverseName\":\"The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\"},\"returns\":{\"_0\":\"The resolved name, the resolved address, the reverse resolver address, and the resolver address.\"}},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"transferOwnership(address)\":{\"details\":\"Transfers ownership of the contract to a new account (`newOwner`). Can only be called by the current owner.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"notice\":\"The Universal Resolver is a contract that handles the work of resolving a name entirely onchain, making it possible to make a single smart contract call to resolve an ENS name.\",\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/utils/UniversalResolver.sol\":\"UniversalResolver\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":1200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/Ownable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/Context.sol\\\";\\n\\n/**\\n * @dev Contract module which provides a basic access control mechanism, where\\n * there is an account (an owner) that can be granted exclusive access to\\n * specific functions.\\n *\\n * By default, the owner account will be the one that deploys the contract. This\\n * can later be changed with {transferOwnership}.\\n *\\n * This module is used through inheritance. It will make available the modifier\\n * `onlyOwner`, which can be applied to your functions to restrict their use to\\n * the owner.\\n */\\nabstract contract Ownable is Context {\\n address private _owner;\\n\\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\\n\\n /**\\n * @dev Initializes the contract setting the deployer as the initial owner.\\n */\\n constructor() {\\n _transferOwnership(_msgSender());\\n }\\n\\n /**\\n * @dev Throws if called by any account other than the owner.\\n */\\n modifier onlyOwner() {\\n _checkOwner();\\n _;\\n }\\n\\n /**\\n * @dev Returns the address of the current owner.\\n */\\n function owner() public view virtual returns (address) {\\n return _owner;\\n }\\n\\n /**\\n * @dev Throws if the sender is not the owner.\\n */\\n function _checkOwner() internal view virtual {\\n require(owner() == _msgSender(), \\\"Ownable: caller is not the owner\\\");\\n }\\n\\n /**\\n * @dev Leaves the contract without owner. It will not be possible to call\\n * `onlyOwner` functions anymore. Can only be called by the current owner.\\n *\\n * NOTE: Renouncing ownership will leave the contract without an owner,\\n * thereby removing any functionality that is only available to the owner.\\n */\\n function renounceOwnership() public virtual onlyOwner {\\n _transferOwnership(address(0));\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Can only be called by the current owner.\\n */\\n function transferOwnership(address newOwner) public virtual onlyOwner {\\n require(newOwner != address(0), \\\"Ownable: new owner is the zero address\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /**\\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\\n * Internal function without access restriction.\\n */\\n function _transferOwnership(address newOwner) internal virtual {\\n address oldOwner = _owner;\\n _owner = newOwner;\\n emit OwnershipTransferred(oldOwner, newOwner);\\n }\\n}\\n\",\"keccak256\":\"0xa94b34880e3c1b0b931662cb1c09e5dfa6662f31cba80e07c5ee71cd135c9673\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\\n *\\n * _Available since v4.8._\\n */\\n function verifyCallResultFromTarget(\\n address target,\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n if (success) {\\n if (returndata.length == 0) {\\n // only check isContract if the call was successful and the return data is empty\\n // otherwise we already know that it was a contract\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n }\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n /**\\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason or using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n _revert(returndata, errorMessage);\\n }\\n }\\n\\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n}\\n\",\"keccak256\":\"0xf96f969e24029d43d0df89e59d365f277021dac62b48e1c1e3ebe0acdd7f1ca1\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/registry/ENS.sol\":{\"content\":\"pragma solidity >=0.8.4;\\n\\ninterface ENS {\\n // Logged when the owner of a node assigns a new owner to a subnode.\\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\\n\\n // Logged when the owner of a node transfers ownership to a new account.\\n event Transfer(bytes32 indexed node, address owner);\\n\\n // Logged when the resolver for a node changes.\\n event NewResolver(bytes32 indexed node, address resolver);\\n\\n // Logged when the TTL of a node changes\\n event NewTTL(bytes32 indexed node, uint64 ttl);\\n\\n // Logged when an operator is added or removed.\\n event ApprovalForAll(\\n address indexed owner,\\n address indexed operator,\\n bool approved\\n );\\n\\n function setRecord(\\n bytes32 node,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeRecord(\\n bytes32 node,\\n bytes32 label,\\n address owner,\\n address resolver,\\n uint64 ttl\\n ) external;\\n\\n function setSubnodeOwner(\\n bytes32 node,\\n bytes32 label,\\n address owner\\n ) external returns (bytes32);\\n\\n function setResolver(bytes32 node, address resolver) external;\\n\\n function setOwner(bytes32 node, address owner) external;\\n\\n function setTTL(bytes32 node, uint64 ttl) external;\\n\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n function owner(bytes32 node) external view returns (address);\\n\\n function resolver(bytes32 node) external view returns (address);\\n\\n function ttl(bytes32 node) external view returns (uint64);\\n\\n function recordExists(bytes32 node) external view returns (bool);\\n\\n function isApprovedForAll(\\n address owner,\\n address operator\\n ) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x7cb1158c7d268b63de1468e28e2711b28d686e2628ddb22da2149cd93ddeafda\"},\"contracts/resolvers/Resolver.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport \\\"./profiles/IABIResolver.sol\\\";\\nimport \\\"./profiles/IAddressResolver.sol\\\";\\nimport \\\"./profiles/IAddrResolver.sol\\\";\\nimport \\\"./profiles/IContentHashResolver.sol\\\";\\nimport \\\"./profiles/IDNSRecordResolver.sol\\\";\\nimport \\\"./profiles/IDNSZoneResolver.sol\\\";\\nimport \\\"./profiles/IInterfaceResolver.sol\\\";\\nimport \\\"./profiles/INameResolver.sol\\\";\\nimport \\\"./profiles/IPubkeyResolver.sol\\\";\\nimport \\\"./profiles/ITextResolver.sol\\\";\\nimport \\\"./profiles/IExtendedResolver.sol\\\";\\n\\n/**\\n * A generic resolver interface which includes all the functions including the ones deprecated\\n */\\ninterface Resolver is\\n IERC165,\\n IABIResolver,\\n IAddressResolver,\\n IAddrResolver,\\n IContentHashResolver,\\n IDNSRecordResolver,\\n IDNSZoneResolver,\\n IInterfaceResolver,\\n INameResolver,\\n IPubkeyResolver,\\n ITextResolver,\\n IExtendedResolver\\n{\\n /* Deprecated events */\\n event ContentChanged(bytes32 indexed node, bytes32 hash);\\n\\n function setApprovalForAll(address, bool) external;\\n\\n function approve(bytes32 node, address delegate, bool approved) external;\\n\\n function isApprovedForAll(address account, address operator) external;\\n\\n function isApprovedFor(\\n address owner,\\n bytes32 node,\\n address delegate\\n ) external;\\n\\n function setABI(\\n bytes32 node,\\n uint256 contentType,\\n bytes calldata data\\n ) external;\\n\\n function setAddr(bytes32 node, address addr) external;\\n\\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\\n\\n function setContenthash(bytes32 node, bytes calldata hash) external;\\n\\n function setDnsrr(bytes32 node, bytes calldata data) external;\\n\\n function setName(bytes32 node, string calldata _name) external;\\n\\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\\n\\n function setText(\\n bytes32 node,\\n string calldata key,\\n string calldata value\\n ) external;\\n\\n function setInterface(\\n bytes32 node,\\n bytes4 interfaceID,\\n address implementer\\n ) external;\\n\\n function multicall(\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n function multicallWithNodeCheck(\\n bytes32 nodehash,\\n bytes[] calldata data\\n ) external returns (bytes[] memory results);\\n\\n /* Deprecated functions */\\n function content(bytes32 node) external view returns (bytes32);\\n\\n function multihash(bytes32 node) external view returns (bytes memory);\\n\\n function setContent(bytes32 node, bytes32 hash) external;\\n\\n function setMultihash(bytes32 node, bytes calldata hash) external;\\n}\\n\",\"keccak256\":\"0xfc77ab6b7c59c3ebfe1c720bdebf9b08c2488ff7ac9501a9aa056c5d6d5b50c5\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IABIResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IABIResolver {\\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\\n\\n /**\\n * Returns the ABI associated with an ENS node.\\n * Defined in EIP205.\\n * @param node The ENS node to query\\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\\n * @return contentType The content type of the return value\\n * @return data The ABI data\\n */\\n function ABI(\\n bytes32 node,\\n uint256 contentTypes\\n ) external view returns (uint256, bytes memory);\\n}\\n\",\"keccak256\":\"0x85b373d02d19374fe570af407f459768285704bf7f30ab17c30eabfb5a10e4c3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddrResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the legacy (ETH-only) addr function.\\n */\\ninterface IAddrResolver {\\n event AddrChanged(bytes32 indexed node, address a);\\n\\n /**\\n * Returns the address associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated address.\\n */\\n function addr(bytes32 node) external view returns (address payable);\\n}\\n\",\"keccak256\":\"0x2ad7f2fc60ebe0f93745fe70247f6a854f66af732483fda2a3c5e055614445e8\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IAddressResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\n/**\\n * Interface for the new (multicoin) addr function.\\n */\\ninterface IAddressResolver {\\n event AddressChanged(\\n bytes32 indexed node,\\n uint256 coinType,\\n bytes newAddress\\n );\\n\\n function addr(\\n bytes32 node,\\n uint256 coinType\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x411447c1e90c51e09702815a85ec725ffbbe37cf96e8cc4d2a8bd4ad8a59d73e\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IContentHashResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IContentHashResolver {\\n event ContenthashChanged(bytes32 indexed node, bytes hash);\\n\\n /**\\n * Returns the contenthash associated with an ENS node.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function contenthash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xd95cd77684ba5752c428d7dceb4ecc6506ac94f4fbb910489637eb68dcd8e366\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSRecordResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSRecordResolver {\\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\\n event DNSRecordChanged(\\n bytes32 indexed node,\\n bytes name,\\n uint16 resource,\\n bytes record\\n );\\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\\n\\n /**\\n * Obtain a DNS record.\\n * @param node the namehash of the node for which to fetch the record\\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\\n * @return the DNS record in wire format if present, otherwise empty\\n */\\n function dnsRecord(\\n bytes32 node,\\n bytes32 name,\\n uint16 resource\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xcfa52200edd337f2c6c5bf402352600584da033b21323603e53de33051a3e25d\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IDNSZoneResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IDNSZoneResolver {\\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\\n event DNSZonehashChanged(\\n bytes32 indexed node,\\n bytes lastzonehash,\\n bytes zonehash\\n );\\n\\n /**\\n * zonehash obtains the hash for the zone.\\n * @param node The ENS node to query.\\n * @return The associated contenthash.\\n */\\n function zonehash(bytes32 node) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0xca1b3a16e7005533f2800a3e66fcdccf7c574deac7913d8c810f40aec1d58dc0\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IExtendedResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\ninterface IExtendedResolver {\\n function resolve(\\n bytes memory name,\\n bytes memory data\\n ) external view returns (bytes memory);\\n}\\n\",\"keccak256\":\"0x5d81521cfae7d9a4475d27533cd8ed0d3475d369eb0674fd90ffbdbdf292faa3\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IInterfaceResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IInterfaceResolver {\\n event InterfaceChanged(\\n bytes32 indexed node,\\n bytes4 indexed interfaceID,\\n address implementer\\n );\\n\\n /**\\n * Returns the address of a contract that implements the specified interface for this name.\\n * If an implementer has not been set for this interfaceID and name, the resolver will query\\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\\n * will be returned.\\n * @param node The ENS node to query.\\n * @param interfaceID The EIP 165 interface ID to check for.\\n * @return The address that implements this interface, or 0 if the interface is unsupported.\\n */\\n function interfaceImplementer(\\n bytes32 node,\\n bytes4 interfaceID\\n ) external view returns (address);\\n}\\n\",\"keccak256\":\"0x390321fb58f7b927df9562450981e74b4be3907e7c09df321fd3b7409b63ae28\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/INameResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface INameResolver {\\n event NameChanged(bytes32 indexed node, string name);\\n\\n /**\\n * Returns the name associated with an ENS node, for reverse records.\\n * Defined in EIP181.\\n * @param node The ENS node to query.\\n * @return The associated name.\\n */\\n function name(bytes32 node) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x9ec392b612447b1acbdc01114f2da2837a658d3f3157f60a99c5269f0b623346\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/IPubkeyResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface IPubkeyResolver {\\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\\n\\n /**\\n * Returns the SECP256k1 public key associated with an ENS node.\\n * Defined in EIP 619.\\n * @param node The ENS node to query\\n * @return x The X coordinate of the curve point for the public key.\\n * @return y The Y coordinate of the curve point for the public key.\\n */\\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\\n}\\n\",\"keccak256\":\"0x69748947093dd2fda9ddcebd0adf19a6d1e7600df1d4b1462a0417156caddca7\",\"license\":\"MIT\"},\"contracts/resolvers/profiles/ITextResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.4;\\n\\ninterface ITextResolver {\\n event TextChanged(\\n bytes32 indexed node,\\n string indexed indexedKey,\\n string key,\\n string value\\n );\\n\\n /**\\n * Returns the text data associated with an ENS node and key.\\n * @param node The ENS node to query.\\n * @param key The text data key to query.\\n * @return The associated text data.\\n */\\n function text(\\n bytes32 node,\\n string calldata key\\n ) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x7c5debb3c42cd9f5de2274ea7aa053f238608314b62db441c40e31cea2543fd5\",\"license\":\"MIT\"},\"contracts/utils/HexUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\nlibrary HexUtils {\\n /**\\n * @dev Attempts to parse bytes32 from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexStringToBytes32(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (bytes32 r, bool valid) {\\n valid = true;\\n assembly {\\n // check that the index to read to is not past the end of the string\\n if gt(lastIdx, mload(str)) {\\n revert(0, 0)\\n }\\n\\n function getHex(c) -> ascii {\\n // chars 48-57: 0-9\\n if and(gt(c, 47), lt(c, 58)) {\\n ascii := sub(c, 48)\\n leave\\n }\\n // chars 65-70: A-F\\n if and(gt(c, 64), lt(c, 71)) {\\n ascii := add(sub(c, 65), 10)\\n leave\\n }\\n // chars 97-102: a-f\\n if and(gt(c, 96), lt(c, 103)) {\\n ascii := add(sub(c, 97), 10)\\n leave\\n }\\n // invalid char\\n ascii := 0xff\\n }\\n\\n let ptr := add(str, 32)\\n for {\\n let i := idx\\n } lt(i, lastIdx) {\\n i := add(i, 2)\\n } {\\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\\n // if either byte is invalid, set invalid and break loop\\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\\n valid := false\\n break\\n }\\n let combined := or(shl(4, byte1), byte2)\\n r := or(shl(8, r), combined)\\n }\\n }\\n }\\n\\n /**\\n * @dev Attempts to parse an address from a hex string\\n * @param str The string to parse\\n * @param idx The offset to start parsing at\\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\\n */\\n function hexToAddress(\\n bytes memory str,\\n uint256 idx,\\n uint256 lastIdx\\n ) internal pure returns (address, bool) {\\n if (lastIdx - idx < 40) return (address(0x0), false);\\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\\n return (address(uint160(uint256(r))), valid);\\n }\\n}\\n\",\"keccak256\":\"0xcae20ad72181f47dfe7fba7d88e8d902a01576b16e93362878e726989d6cfb4d\",\"license\":\"MIT\"},\"contracts/utils/LowLevelCallUtils.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n\\npragma solidity ^0.8.13;\\n\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\n\\nlibrary LowLevelCallUtils {\\n using Address for address;\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data\\n ) internal view returns (bool success) {\\n return functionStaticCall(target, data, gasleft());\\n }\\n\\n /**\\n * @dev Makes a static call to the specified `target` with `data` using `gasLimit`. Return data can be fetched with\\n * `returnDataSize` and `readReturnData`.\\n * @param target The address to staticcall.\\n * @param data The data to pass to the call.\\n * @param gasLimit The gas limit to use for the call.\\n * @return success True if the call succeeded, or false if it reverts.\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n uint256 gasLimit\\n ) internal view returns (bool success) {\\n require(\\n target.isContract(),\\n \\\"LowLevelCallUtils: static call to non-contract\\\"\\n );\\n assembly {\\n success := staticcall(\\n gasLimit,\\n target,\\n add(data, 32),\\n mload(data),\\n 0,\\n 0\\n )\\n }\\n }\\n\\n /**\\n * @dev Returns the size of the return data of the most recent external call.\\n */\\n function returnDataSize() internal pure returns (uint256 len) {\\n assembly {\\n len := returndatasize()\\n }\\n }\\n\\n /**\\n * @dev Reads return data from the most recent external call.\\n * @param offset Offset into the return data.\\n * @param length Number of bytes to return.\\n */\\n function readReturnData(\\n uint256 offset,\\n uint256 length\\n ) internal pure returns (bytes memory data) {\\n data = new bytes(length);\\n assembly {\\n returndatacopy(add(data, 32), offset, length)\\n }\\n }\\n\\n /**\\n * @dev Reverts with the return data from the most recent external call.\\n */\\n function propagateRevert() internal pure {\\n assembly {\\n returndatacopy(0, 0, returndatasize())\\n revert(0, returndatasize())\\n }\\n }\\n}\\n\",\"keccak256\":\"0xba30d0a44a6a2f1557e4913108b25d8b36cb40a54f44ac98086465d6bf77c5e6\",\"license\":\"MIT\"},\"contracts/utils/NameEncoder.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.13;\\n\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\n\\nlibrary NameEncoder {\\n using BytesUtils for bytes;\\n\\n function dnsEncodeName(\\n string memory name\\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\\n uint8 labelLength = 0;\\n bytes memory bytesName = bytes(name);\\n uint256 length = bytesName.length;\\n dnsName = new bytes(length + 2);\\n node = 0;\\n if (length == 0) {\\n dnsName[0] = 0;\\n return (dnsName, node);\\n }\\n\\n // use unchecked to save gas since we check for an underflow\\n // and we check for the length before the loop\\n unchecked {\\n for (uint256 i = length - 1; i >= 0; i--) {\\n if (bytesName[i] == \\\".\\\") {\\n dnsName[i + 1] = bytes1(labelLength);\\n node = keccak256(\\n abi.encodePacked(\\n node,\\n bytesName.keccak(i + 1, labelLength)\\n )\\n );\\n labelLength = 0;\\n } else {\\n labelLength += 1;\\n dnsName[i + 1] = bytesName[i];\\n }\\n if (i == 0) {\\n break;\\n }\\n }\\n }\\n\\n node = keccak256(\\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\\n );\\n\\n dnsName[0] = bytes1(labelLength);\\n return (dnsName, node);\\n }\\n}\\n\",\"keccak256\":\"0x63fd5f360cef8c9b8b8cfdff20d3f0e955b4c8ac7dfac758788223c61678aad1\",\"license\":\"MIT\"},\"contracts/utils/UniversalResolver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.17 <0.9.0;\\n\\nimport {ERC165} from \\\"@openzeppelin/contracts/utils/introspection/ERC165.sol\\\";\\nimport {Ownable} from \\\"@openzeppelin/contracts/access/Ownable.sol\\\";\\nimport {Address} from \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport {LowLevelCallUtils} from \\\"./LowLevelCallUtils.sol\\\";\\nimport {ENS} from \\\"../registry/ENS.sol\\\";\\nimport {IExtendedResolver} from \\\"../resolvers/profiles/IExtendedResolver.sol\\\";\\nimport {Resolver, INameResolver, IAddrResolver} from \\\"../resolvers/Resolver.sol\\\";\\nimport {NameEncoder} from \\\"./NameEncoder.sol\\\";\\nimport {BytesUtils} from \\\"../wrapper/BytesUtils.sol\\\";\\nimport {HexUtils} from \\\"./HexUtils.sol\\\";\\n\\nerror OffchainLookup(\\n address sender,\\n string[] urls,\\n bytes callData,\\n bytes4 callbackFunction,\\n bytes extraData\\n);\\n\\nerror ResolverNotFound();\\n\\nerror ResolverWildcardNotSupported();\\n\\nerror ResolverNotContract();\\n\\nerror ResolverError(bytes returnData);\\n\\nerror HttpError(HttpErrorItem[] errors);\\n\\nstruct HttpErrorItem {\\n uint16 status;\\n string message;\\n}\\n\\nstruct MulticallData {\\n bytes name;\\n bytes[] data;\\n string[] gateways;\\n bytes4 callbackFunction;\\n bool isWildcard;\\n address resolver;\\n bytes metaData;\\n bool[] failures;\\n}\\n\\nstruct MulticallChecks {\\n bool isCallback;\\n bool hasExtendedResolver;\\n}\\n\\nstruct OffchainLookupCallData {\\n address sender;\\n string[] urls;\\n bytes callData;\\n}\\n\\nstruct OffchainLookupExtraData {\\n bytes4 callbackFunction;\\n bytes data;\\n}\\n\\nstruct Result {\\n bool success;\\n bytes returnData;\\n}\\n\\ninterface BatchGateway {\\n function query(\\n OffchainLookupCallData[] memory data\\n ) external returns (bool[] memory failures, bytes[] memory responses);\\n}\\n\\n/**\\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\\n * making it possible to make a single smart contract call to resolve an ENS name.\\n */\\ncontract UniversalResolver is ERC165, Ownable {\\n using Address for address;\\n using NameEncoder for string;\\n using BytesUtils for bytes;\\n using HexUtils for bytes;\\n\\n string[] public batchGatewayURLs;\\n ENS public immutable registry;\\n\\n constructor(address _registry, string[] memory _urls) {\\n registry = ENS(_registry);\\n batchGatewayURLs = _urls;\\n }\\n\\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\\n batchGatewayURLs = _urls;\\n }\\n\\n /**\\n * @dev Performs ENS name resolution for the supplied name and resolution data.\\n * @param name The name to resolve, in normalised and DNS-encoded form.\\n * @param data The resolution data, as specified in ENSIP-10.\\n * @return The result of resolving the name.\\n */\\n function resolve(\\n bytes calldata name,\\n bytes memory data\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n batchGatewayURLs,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data\\n ) external view returns (Result[] memory, address) {\\n return resolve(name, data, batchGatewayURLs);\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways\\n ) external view returns (bytes memory, address) {\\n return\\n _resolveSingle(\\n name,\\n data,\\n gateways,\\n this.resolveSingleCallback.selector,\\n \\\"\\\"\\n );\\n }\\n\\n function resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways\\n ) public view returns (Result[] memory, address) {\\n return\\n _resolve(name, data, gateways, this.resolveCallback.selector, \\\"\\\");\\n }\\n\\n function _resolveSingle(\\n bytes calldata name,\\n bytes memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) public view returns (bytes memory, address) {\\n bytes[] memory dataArr = new bytes[](1);\\n dataArr[0] = data;\\n (Result[] memory results, address resolver) = _resolve(\\n name,\\n dataArr,\\n gateways,\\n callbackFunction,\\n metaData\\n );\\n\\n Result memory result = results[0];\\n\\n _checkResolveSingle(result);\\n\\n return (result.returnData, resolver);\\n }\\n\\n function _resolve(\\n bytes calldata name,\\n bytes[] memory data,\\n string[] memory gateways,\\n bytes4 callbackFunction,\\n bytes memory metaData\\n ) internal view returns (Result[] memory results, address resolverAddress) {\\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\\n resolverAddress = address(resolver);\\n if (resolverAddress == address(0)) {\\n revert ResolverNotFound();\\n }\\n\\n if (!resolverAddress.isContract()) {\\n revert ResolverNotContract();\\n }\\n\\n bool isWildcard = finalOffset != 0;\\n\\n results = _multicall(\\n MulticallData(\\n name,\\n data,\\n gateways,\\n callbackFunction,\\n isWildcard,\\n resolverAddress,\\n metaData,\\n new bool[](data.length)\\n )\\n );\\n }\\n\\n function reverse(\\n bytes calldata reverseName\\n ) external view returns (string memory, address, address, address) {\\n return reverse(reverseName, batchGatewayURLs);\\n }\\n\\n /**\\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\\n */\\n function reverse(\\n bytes calldata reverseName,\\n string[] memory gateways\\n ) public view returns (string memory, address, address, address) {\\n bytes memory encodedCall = abi.encodeCall(\\n INameResolver.name,\\n reverseName.namehash(0)\\n );\\n (\\n bytes memory reverseResolvedData,\\n address reverseResolverAddress\\n ) = _resolveSingle(\\n reverseName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n \\\"\\\"\\n );\\n\\n return\\n getForwardDataFromReverse(\\n reverseResolvedData,\\n reverseResolverAddress,\\n gateways\\n );\\n }\\n\\n function getForwardDataFromReverse(\\n bytes memory resolvedReverseData,\\n address reverseResolverAddress,\\n string[] memory gateways\\n ) internal view returns (string memory, address, address, address) {\\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\\n\\n (bytes memory encodedName, bytes32 namehash) = resolvedName\\n .dnsEncodeName();\\n\\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\\n bytes memory metaData = abi.encode(\\n resolvedName,\\n reverseResolverAddress\\n );\\n (bytes memory resolvedData, address resolverAddress) = this\\n ._resolveSingle(\\n encodedName,\\n encodedCall,\\n gateways,\\n this.reverseCallback.selector,\\n metaData\\n );\\n\\n address resolvedAddress = abi.decode(resolvedData, (address));\\n\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n function resolveSingleCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (bytes memory, address) {\\n (Result[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveSingleCallback.selector\\n );\\n Result memory result = results[0];\\n\\n _checkResolveSingle(result);\\n\\n return (result.returnData, resolver);\\n }\\n\\n function resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (Result[] memory, address) {\\n (Result[] memory results, address resolver, , ) = _resolveCallback(\\n response,\\n extraData,\\n this.resolveCallback.selector\\n );\\n return (results, resolver);\\n }\\n\\n function reverseCallback(\\n bytes calldata response,\\n bytes calldata extraData\\n ) external view returns (string memory, address, address, address) {\\n (\\n Result[] memory results,\\n address resolverAddress,\\n string[] memory gateways,\\n bytes memory metaData\\n ) = _resolveCallback(\\n response,\\n extraData,\\n this.reverseCallback.selector\\n );\\n\\n Result memory result = results[0];\\n\\n if (!result.success) {\\n revert ResolverError(result.returnData);\\n }\\n\\n if (metaData.length > 0) {\\n (string memory resolvedName, address reverseResolverAddress) = abi\\n .decode(metaData, (string, address));\\n address resolvedAddress = abi.decode(result.returnData, (address));\\n return (\\n resolvedName,\\n resolvedAddress,\\n reverseResolverAddress,\\n resolverAddress\\n );\\n }\\n\\n return\\n getForwardDataFromReverse(\\n result.returnData,\\n resolverAddress,\\n gateways\\n );\\n }\\n\\n function supportsInterface(\\n bytes4 interfaceId\\n ) public view virtual override returns (bool) {\\n return\\n interfaceId == type(IExtendedResolver).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n function _resolveCallback(\\n bytes calldata response,\\n bytes calldata extraData,\\n bytes4 callbackFunction\\n )\\n internal\\n view\\n returns (Result[] memory, address, string[] memory, bytes memory)\\n {\\n MulticallData memory multicallData;\\n multicallData.callbackFunction = callbackFunction;\\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\\n response,\\n (bool[], bytes[])\\n );\\n OffchainLookupExtraData[] memory extraDatas;\\n (\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n ) = abi.decode(\\n extraData,\\n (bool, address, string[], bytes, OffchainLookupExtraData[])\\n );\\n require(responses.length <= extraDatas.length);\\n multicallData.data = new bytes[](extraDatas.length);\\n multicallData.failures = new bool[](extraDatas.length);\\n uint256 offchainCount = 0;\\n for (uint256 i = 0; i < extraDatas.length; i++) {\\n if (extraDatas[i].callbackFunction == bytes4(0)) {\\n // This call did not require an offchain lookup; use the previous input data.\\n multicallData.data[i] = extraDatas[i].data;\\n } else {\\n if (failures[offchainCount]) {\\n multicallData.failures[i] = true;\\n multicallData.data[i] = responses[offchainCount];\\n } else {\\n multicallData.data[i] = abi.encodeWithSelector(\\n extraDatas[i].callbackFunction,\\n responses[offchainCount],\\n extraDatas[i].data\\n );\\n }\\n offchainCount = offchainCount + 1;\\n }\\n }\\n\\n return (\\n _multicall(multicallData),\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData\\n );\\n }\\n\\n /**\\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\\n * the error with the data necessary to continue the request where it left off.\\n * @param target The address to call.\\n * @param data The data to call `target` with.\\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\\n * @return result Whether the call succeeded.\\n */\\n function callWithOffchainLookupPropagation(\\n address target,\\n bytes memory data,\\n bool isSafe\\n )\\n internal\\n view\\n returns (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool result\\n )\\n {\\n if (isSafe) {\\n result = LowLevelCallUtils.functionStaticCall(target, data);\\n } else {\\n result = LowLevelCallUtils.functionStaticCall(target, data, 50000);\\n }\\n uint256 size = LowLevelCallUtils.returnDataSize();\\n\\n if (result) {\\n return (\\n false,\\n LowLevelCallUtils.readReturnData(0, size),\\n extraData,\\n true\\n );\\n }\\n\\n // Failure\\n if (size >= 4) {\\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\\n // Offchain lookup. Decode the revert message and create our own that nests it.\\n bytes memory revertData = LowLevelCallUtils.readReturnData(\\n 4,\\n size - 4\\n );\\n if (bytes4(errorId) == OffchainLookup.selector) {\\n (\\n address wrappedSender,\\n string[] memory wrappedUrls,\\n bytes memory wrappedCallData,\\n bytes4 wrappedCallbackFunction,\\n bytes memory wrappedExtraData\\n ) = abi.decode(\\n revertData,\\n (address, string[], bytes, bytes4, bytes)\\n );\\n if (wrappedSender == target) {\\n returnData = abi.encode(\\n OffchainLookupCallData(\\n wrappedSender,\\n wrappedUrls,\\n wrappedCallData\\n )\\n );\\n extraData = OffchainLookupExtraData(\\n wrappedCallbackFunction,\\n wrappedExtraData\\n );\\n return (true, returnData, extraData, false);\\n }\\n } else {\\n returnData = bytes.concat(errorId, revertData);\\n return (false, returnData, extraData, false);\\n }\\n }\\n }\\n\\n /**\\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\\n * removing labels until it finds a result.\\n * @param name The name to resolve, in DNS-encoded and normalised form.\\n * @return resolver The Resolver responsible for this name.\\n * @return namehash The namehash of the full name.\\n * @return finalOffset The offset of the first label with a resolver.\\n */\\n function findResolver(\\n bytes calldata name\\n ) public view returns (Resolver, bytes32, uint256) {\\n (\\n address resolver,\\n bytes32 namehash,\\n uint256 finalOffset\\n ) = findResolver(name, 0);\\n return (Resolver(resolver), namehash, finalOffset);\\n }\\n\\n function findResolver(\\n bytes calldata name,\\n uint256 offset\\n ) internal view returns (address, bytes32, uint256) {\\n uint256 labelLength = uint256(uint8(name[offset]));\\n if (labelLength == 0) {\\n return (address(0), bytes32(0), offset);\\n }\\n uint256 nextLabel = offset + labelLength + 1;\\n bytes32 labelHash;\\n if (\\n labelLength == 66 &&\\n // 0x5b == '['\\n name[offset + 1] == 0x5b &&\\n // 0x5d == ']'\\n name[nextLabel - 1] == 0x5d\\n ) {\\n // Encrypted label\\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\\n .hexStringToBytes32(0, 64);\\n } else {\\n labelHash = keccak256(name[offset + 1:nextLabel]);\\n }\\n (\\n address parentresolver,\\n bytes32 parentnode,\\n uint256 parentoffset\\n ) = findResolver(name, nextLabel);\\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\\n address resolver = registry.resolver(node);\\n if (resolver != address(0)) {\\n return (resolver, node, offset);\\n }\\n return (parentresolver, node, parentoffset);\\n }\\n\\n function _checkInterface(\\n address resolver,\\n bytes4 interfaceId\\n ) internal view returns (bool) {\\n try\\n Resolver(resolver).supportsInterface{gas: 50000}(interfaceId)\\n returns (bool supported) {\\n return supported;\\n } catch {\\n return false;\\n }\\n }\\n\\n function _checkSafetyAndItem(\\n bytes memory name,\\n bytes memory item,\\n address resolver,\\n MulticallChecks memory multicallChecks\\n ) internal view returns (bool, bytes memory) {\\n if (!multicallChecks.isCallback) {\\n if (multicallChecks.hasExtendedResolver) {\\n return (\\n true,\\n abi.encodeCall(IExtendedResolver.resolve, (name, item))\\n );\\n }\\n return (_checkInterface(resolver, bytes4(item)), item);\\n }\\n return (true, item);\\n }\\n\\n function _checkMulticall(\\n MulticallData memory multicallData\\n ) internal view returns (MulticallChecks memory) {\\n bool isCallback = multicallData.name.length == 0;\\n bool hasExtendedResolver = _checkInterface(\\n multicallData.resolver,\\n type(IExtendedResolver).interfaceId\\n );\\n\\n if (multicallData.isWildcard && !hasExtendedResolver) {\\n revert ResolverWildcardNotSupported();\\n }\\n\\n return MulticallChecks(isCallback, hasExtendedResolver);\\n }\\n\\n function _checkResolveSingle(Result memory result) internal pure {\\n if (!result.success) {\\n if (bytes4(result.returnData) == HttpError.selector) {\\n (, HttpErrorItem[] memory errors) = abi.decode(\\n result.returnData,\\n (bytes4, HttpErrorItem[])\\n );\\n revert HttpError(errors);\\n }\\n revert ResolverError(result.returnData);\\n }\\n }\\n\\n function _multicall(\\n MulticallData memory multicallData\\n ) internal view returns (Result[] memory results) {\\n uint256 length = multicallData.data.length;\\n uint256 offchainCount = 0;\\n OffchainLookupCallData[]\\n memory callDatas = new OffchainLookupCallData[](length);\\n OffchainLookupExtraData[]\\n memory extraDatas = new OffchainLookupExtraData[](length);\\n results = new Result[](length);\\n MulticallChecks memory multicallChecks = _checkMulticall(multicallData);\\n\\n for (uint256 i = 0; i < length; i++) {\\n bytes memory item = multicallData.data[i];\\n bool failure = multicallData.failures[i];\\n\\n if (failure) {\\n results[i] = Result(false, item);\\n continue;\\n }\\n\\n bool isSafe = false;\\n (isSafe, item) = _checkSafetyAndItem(\\n multicallData.name,\\n item,\\n multicallData.resolver,\\n multicallChecks\\n );\\n\\n (\\n bool offchain,\\n bytes memory returnData,\\n OffchainLookupExtraData memory extraData,\\n bool success\\n ) = callWithOffchainLookupPropagation(\\n multicallData.resolver,\\n item,\\n isSafe\\n );\\n\\n if (offchain) {\\n callDatas[offchainCount] = abi.decode(\\n returnData,\\n (OffchainLookupCallData)\\n );\\n extraDatas[i] = extraData;\\n offchainCount += 1;\\n continue;\\n }\\n\\n if (success && multicallChecks.hasExtendedResolver) {\\n // if this is a successful resolve() call, unwrap the result\\n returnData = abi.decode(returnData, (bytes));\\n }\\n results[i] = Result(success, returnData);\\n extraDatas[i].data = multicallData.data[i];\\n }\\n\\n if (offchainCount == 0) {\\n return results;\\n }\\n\\n // Trim callDatas if offchain data exists\\n assembly {\\n mstore(callDatas, offchainCount)\\n }\\n\\n revert OffchainLookup(\\n address(this),\\n multicallData.gateways,\\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\\n multicallData.callbackFunction,\\n abi.encode(\\n multicallData.isWildcard,\\n multicallData.resolver,\\n multicallData.gateways,\\n multicallData.metaData,\\n extraDatas\\n )\\n );\\n }\\n}\\n\",\"keccak256\":\"0xa5a28872264a6164671800e3e1a604bc01fc2f316392651e9805b6901354cdf5\",\"license\":\"MIT\"},\"contracts/wrapper/BytesUtils.sol\":{\"content\":\"//SPDX-License-Identifier: MIT\\npragma solidity ~0.8.17;\\n\\nlibrary BytesUtils {\\n /*\\n * @dev Returns the keccak-256 hash of a byte range.\\n * @param self The byte string to hash.\\n * @param offset The position to start hashing at.\\n * @param len The number of bytes to hash.\\n * @return The hash of the byte range.\\n */\\n function keccak(\\n bytes memory self,\\n uint256 offset,\\n uint256 len\\n ) internal pure returns (bytes32 ret) {\\n require(offset + len <= self.length);\\n assembly {\\n ret := keccak256(add(add(self, 32), offset), len)\\n }\\n }\\n\\n /**\\n * @dev Returns the ENS namehash of a DNS-encoded name.\\n * @param self The DNS-encoded name to hash.\\n * @param offset The offset at which to start hashing.\\n * @return The namehash of the name.\\n */\\n function namehash(\\n bytes memory self,\\n uint256 offset\\n ) internal pure returns (bytes32) {\\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\\n if (labelhash == bytes32(0)) {\\n require(offset == self.length - 1, \\\"namehash: Junk at end of name\\\");\\n return bytes32(0);\\n }\\n return\\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\\n }\\n\\n /**\\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\\n * @param self The byte string to read a label from.\\n * @param idx The index to read a label at.\\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\\n * @return newIdx The index of the start of the next label.\\n */\\n function readLabel(\\n bytes memory self,\\n uint256 idx\\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\\n require(idx < self.length, \\\"readLabel: Index out of bounds\\\");\\n uint256 len = uint256(uint8(self[idx]));\\n if (len > 0) {\\n labelhash = keccak(self, idx + 1, len);\\n } else {\\n labelhash = bytes32(0);\\n }\\n newIdx = idx + len + 1;\\n }\\n}\\n\",\"keccak256\":\"0xf862cd86d749158a554e3cb517efa9097331ec0cf7225117f21e96fb50c67edb\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60a06040523480156200001157600080fd5b5060405162003c3038038062003c308339810160408190526200003491620001da565b6200003f336200006a565b6001600160a01b038216608052805162000061906001906020840190620000ba565b5050506200049c565b600080546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b82805482825590600052602060002090810192821562000105579160200282015b82811115620001055782518290620000f49082620003d0565b5091602001919060010190620000db565b506200011392915062000117565b5090565b80821115620001135760006200012e828262000138565b5060010162000117565b508054620001469062000341565b6000825580601f1062000157575050565b601f0160209004906000526020600020908101906200017791906200017a565b50565b5b808211156200011357600081556001016200017b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715620001d257620001d262000191565b604052919050565b6000806040808486031215620001ef57600080fd5b83516001600160a01b03811681146200020757600080fd5b602085810151919450906001600160401b03808211156200022757600080fd5b8187019150601f88818401126200023d57600080fd5b82518281111562000252576200025262000191565b8060051b62000263868201620001a7565b918252848101860191868101908c8411156200027e57600080fd5b87870192505b838310156200032e578251868111156200029e5760008081fd5b8701603f81018e13620002b15760008081fd5b8881015187811115620002c857620002c862000191565b620002db818801601f19168b01620001a7565b8181528f8c838501011115620002f15760008081fd5b60005b8281101562000311578381018d01518282018d01528b01620002f4565b5060009181018b0191909152835250918701919087019062000284565b8099505050505050505050509250929050565b600181811c908216806200035657607f821691505b6020821081036200037757634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115620003cb57600081815260208120601f850160051c81016020861015620003a65750805b601f850160051c820191505b81811015620003c757828155600101620003b2565b5050505b505050565b81516001600160401b03811115620003ec57620003ec62000191565b6200040481620003fd845462000341565b846200037d565b602080601f8311600181146200043c5760008415620004235750858301515b600019600386901b1c1916600185901b178555620003c7565b600085815260208120601f198616915b828110156200046d578886015182559484019460019091019084016200044c565b50858210156200048c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b608051613771620004bf600039600081816101ea015261151701526137716000f3fe608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612388565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046125a8565b61035c565b60405161015a929190612686565b610197610192366004612731565b610392565b60405161015a92919061279a565b6101b86101b3366004612823565b61047f565b60405161015a949392919061288f565b6101d061056f565b005b6101976101e03660046128cb565b610583565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461292a565b6105ab565b6101d06102563660046129f0565b61064e565b610176610269366004612a2d565b61066d565b61028161027c366004612a8c565b610766565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b4366004612ace565b61078c565b60405161015a9190612ae7565b6101b86102d4366004612afa565b610838565b6101976102e7366004612823565b61092a565b6101766102fa366004612823565b61096e565b6101b861030d366004612a8c565b6109e0565b6101d0610320366004612b6e565b610ad3565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b604051806020016040528060008152506105ab565b915091505b94509492505050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b8282101561046a5783829060005260206000200180546103dd90612b8b565b80601f016020809104026020016040519081016040528092919081815260200182805461040990612b8b565b80156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050815260200190600101906103be565b50505050610583565b91509150935093915050565b6060600080808080808061049d8c8c8c8c636dc4fb7360e01b610b63565b93509350935093506000846000815181106104ba576104ba612bc5565b6020026020010151905080600001516104f5578060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60405180910390fd5b81511561054757600080838060200190518101906105139190612c20565b91509150600083602001518060200190518101906105319190612c72565b929b509199509750939550610564945050505050565b61055681602001518585610ee9565b985098509850985050505050505b945094509450949050565b61057761104a565b61058160006110a4565b565b606060006103848686868663b4a8580160e01b6040518060200160405280600081525061110c565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105c757905050905086816000815181106105f2576105f2612bc5565b602002602001018190525060008061060e8b8b858b8b8b61110c565b9150915060008260008151811061062757610627612bc5565b6020026020010151905061063a8161128d565b602001519b909a5098505050505050505050565b61065661104a565b80516106699060019060208401906122b5565b5050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b828210156107455783829060005260206000200180546106b890612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612b8b565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081526020019060010190610699565b5050505063e0a8541260e01b604051806020016040528060008152506105ab565b60008060008060008061077b88886000611310565b919750955093505050509250925092565b6001818154811061079c57600080fd5b9060005260206000200160009150905080546107b790612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546107e390612b8b565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b505050505081565b6060600080600080610884600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115be9050565b60405160240161089691815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f343100000000000000000000000000000000000000000000000000000000179052815190810190915260008082529192508190610906908b908b9086908c90636dc4fb7360e01b906105ab565b9150915061091582828a610ee9565b96509650965096505050505b93509350935093565b60606000808061095d888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b63565b50919a909950975050505050505050565b6060600080806109a1888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b63565b5050915091506000826000815181106109bc576109bc612bc5565b602002602001015190506109cf8161128d565b602001519890975095505050505050565b60606000806000610ac386866001805480602002602001604051908101604052809291908181526020016000905b82821015610aba578382906000526020600020018054610a2d90612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990612b8b565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b505050505081526020019060010190610a0e565b50505050610838565b9299919850965090945092505050565b610adb61104a565b6001600160a01b038116610b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ec565b610b60816110a4565b50565b60606000606080610bc760405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610be68b8d018d612c9d565b90925090506060610bf98a8c018c612d55565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610c3357600080fd5b805167ffffffffffffffff811115610c4d57610c4d6123ee565b604051908082528060200260200182016040528015610c8057816020015b6060815260200190600190039081610c6b5790505b506020850152805167ffffffffffffffff811115610ca057610ca06123ee565b604051908082528060200260200182016040528015610cc9578160200160208202803683370190505b5060e08501526000805b8251811015610eb7578251600090849083908110610cf357610cf3612bc5565b6020026020010151600001516001600160e01b03191603610d5257828181518110610d2057610d20612bc5565b60200260200101516020015186602001518281518110610d4257610d42612bc5565b6020026020010181905250610ea5565b848281518110610d6457610d64612bc5565b602002602001015115610ddb5760018660e001518281518110610d8957610d89612bc5565b602002602001019015159081151581525050838281518110610dad57610dad612bc5565b602002602001015186602001518281518110610dcb57610dcb612bc5565b6020026020010181905250610e97565b828181518110610ded57610ded612bc5565b602002602001015160000151848381518110610e0b57610e0b612bc5565b6020026020010151848381518110610e2557610e25612bc5565b602002602001015160200151604051602401610e42929190612ed9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e8b57610e8b612bc5565b60200260200101819052505b610ea2826001612f1d565b91505b80610eaf81612f30565b915050610cd3565b50610ec18561167d565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610f059190612f49565b9050600080610f1383611a88565b91509150600081604051602401610f2c91815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f869187918e9101612686565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610fd5959493929190612fd3565b600060405180830381865afa158015610ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101a9190810190612c20565b915091506000828060200190518101906110349190612c72565b979f979e50909b50959950505050505050505050565b6000546001600160a01b031633146105815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ec565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080600061111d8a8a610766565b919450849350909150506001600160a01b038216611167576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383163b6111a8576040517f4981ac0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b81528315159261127d929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff81111561124c5761124c6123ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b50905261167d565b9450505050965096945050505050565b8051610b6057602081015163ca7a4e7560e01b906112aa9061303c565b6001600160e01b031916036112f157600081602001518060200190518101906112d39190613074565b9150508060405163ca7a4e7560e01b81526004016104ec919061318a565b8060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60008060008086868681811061132857611328612bc5565b919091013560f81c915050600081900361134c5750600092508291508390506115b5565b60006113588287612f1d565b611363906001612f1d565b905060008260421480156113a95750888861137f896001612f1d565b81811061138e5761138e612bc5565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156113e7575088886113bd600185613202565b8181106113cc576113cc612bc5565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561145f57611457600060408b8b6114008c6002612f1d565b9061140c600189613202565b9261141993929190613215565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611cb19050565b509050611491565b888861146c896001612f1d565b61147892859290613215565b60405161148692919061323f565b604051809103902090505b60008060006114a18c8c87611310565b925092509250600082856040516020016114c5929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612c72565b90506001600160a01b038116156115a657995097508996506115b595505050505050565b50929850919650909450505050505b93509350939050565b60008060006115cd8585611d82565b90925090508161163f57600185516115e59190613202565b84146116335760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016104ec565b50600091506103569050565b61164985826115be565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156116a2576116a26123ee565b60405190808252806020026020018201604052801561170057816020015b6116ed604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816116c05790505b50905060008367ffffffffffffffff81111561171e5761171e6123ee565b60405190808252806020026020018201604052801561176457816020015b60408051808201909152600081526060602082015281526020019060019003908161173c5790505b5090508367ffffffffffffffff811115611780576117806123ee565b6040519080825280602002602001820160405280156117c657816020015b60408051808201909152600081526060602082015281526020019060019003908161179e5790505b50945060006117d487611e39565b905060005b858110156119c7576000886020015182815181106117f9576117f9612bc5565b6020026020010151905060008960e00151838151811061181b5761181b612bc5565b6020026020010151905080156118675760405180604001604052806000151581526020018381525089848151811061185557611855612bc5565b602002602001018190525050506119b5565b600061187d8b60000151848d60a0015188611ed0565b809450819250505060008060008061189a8f60a001518887611f58565b9350935093509350831561191057828060200190518101906118bc91906132cf565b8b8d815181106118ce576118ce612bc5565b6020026020010181905250818a89815181106118ec576118ec612bc5565b602090810291909101015261190260018d612f1d565b9b50505050505050506119b5565b80801561191e575088602001515b1561193a57828060200190518101906119379190612f49565b92505b60405180604001604052808215158152602001848152508e898151811061196357611963612bc5565b60200260200101819052508e60200151888151811061198457611984612bc5565b60200260200101518a898151811061199e5761199e612bc5565b602002602001015160200181905250505050505050505b806119bf81612f30565b9150506117d9565b50836000036119da575050505050919050565b83835230876040015163a780bab660e01b856040516024016119fc91906133ca565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505089606001518a608001518b60a001518c604001518d60c0015189604051602001611a5d95949392919061342c565b60408051601f1981840301815290829052630556f18360e41b82526104ec95949392916004016134e9565b805160609060009081908490611a9f816002612f1d565b67ffffffffffffffff811115611ab757611ab76123ee565b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b50945060009350808403611b2657600060f81b85600081518110611b0757611b07612bc5565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611b3e57611b3e612bc5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611c00578360f81b868260010181518110611ba457611ba4612bc5565b60200101906001600160f81b031916908160001a90535084611bcd846001840160ff8816612110565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611c50565b600184019350828181518110611c1857611c18612bc5565b602001015160f81c60f81b868260010181518110611c3857611c38612bc5565b60200101906001600160f81b031916908160001a9053505b8015611c5f5760001901611b2c565b5083611c7083600060ff8716612110565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611b0757611b07612bc5565b8251600090600190831115611cc557600080fd5b611d16565b6000603a8210602f83111615611ce25750602f190190565b60478210604083111615611cf857506036190190565b60678210606083111615611d0e57506056190190565b5060ff919050565b60208501845b84811015611d7857611d338183015160001a611cca565b611d456001830184015160001a611cca565b60ff811460ff83141715611d5e57600094505050611d78565b60049190911b1760089490941b9390931792600201611d1c565b5050935093915050565b60008083518310611dd55760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016104ec565b6000848481518110611de957611de9612bc5565b016020015160f81c90508015611e1557611e0e85611e08866001612f1d565b83612110565b9250611e1a565b600092505b611e248185612f1d565b611e2f906001612f1d565b9150509250929050565b604080518082019091526000808252602082015281515160a0830151901590600090611e6c90639061b92360e01b612134565b905083608001518015611e7d575080155b15611eb4576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915291151582521515602082015292915050565b600060608260000151611f4c57826020015115611f305760018686604051602401611efc929190612ed9565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b1790529092509050610389565b611f4284611f3d8761303c565b612134565b8591509150610389565b50600195939450505050565b604080518082019091526000808252606060208301819052909160008415611f8b57611f8487876121b9565b9050611f9b565b611f98878761c3506121cd565b90505b3d8115611fbf576000611faf600083612260565b9095509350600191506109219050565b60048110612106576000611fd560006004612260565b90506000611fed6004611fe88186613202565b612260565b9050630556f18360e41b6120008361303c565b6001600160e01b031916036120ce5760008060008060008580602001905181019061202b919061351d565b945094509450945094508e6001600160a01b0316856001600160a01b0316036120c4576040518060600160405280866001600160a01b031681526020018581526020018481525060405160200161208291906135cd565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b5090995097506000965061092195505050505050565b5050505050612103565b81816040516020016120e19291906135e0565b60408051601f1981840301815291905260009750955086935061092192505050565b50505b5093509350935093565b825160009061211f8385612f1d565b111561212a57600080fd5b5091016020012090565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a79061c350906024016020604051808303818786fa935050505080156121a6575060408051601f3d908101601f191682019092526121a39181019061360f565b60015b6121b257506000610356565b9050610356565b60006121c683835a6121cd565b9392505050565b60006001600160a01b0384163b61224c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e747261637400000000000000000000000000000000000060648201526084016104ec565b6000808451602086018786fa949350505050565b60608167ffffffffffffffff81111561227b5761227b6123ee565b6040519080825280601f01601f1916602001820160405280156122a5576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156122fb579160200282015b828111156122fb57825182906122eb908261367b565b50916020019190600101906122d5565b5061230792915061230b565b5090565b8082111561230757600061231f8282612328565b5060010161230b565b50805461233490612b8b565b6000825580601f10612344575050565b601f016020900490600052602060002090810190610b6091905b80821115612307576000815560010161235e565b6001600160e01b031981168114610b6057600080fd5b60006020828403121561239a57600080fd5b81356121c681612372565b60008083601f8401126123b757600080fd5b50813567ffffffffffffffff8111156123cf57600080fd5b6020830191508360208285010111156123e757600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612427576124276123ee565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612456576124566123ee565b604052919050565b600067ffffffffffffffff821115612478576124786123ee565b50601f01601f191660200190565b60006124996124948461245e565b61242d565b90508281528383830111156124ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124d557600080fd5b6121c683833560208501612486565b600067ffffffffffffffff8211156124fe576124fe6123ee565b5060051b60200190565b600082601f83011261251957600080fd5b81356020612529612494836124e4565b82815260059290921b8401810191818101908684111561254857600080fd5b8286015b8481101561259d57803567ffffffffffffffff81111561256c5760008081fd5b8701603f8101891361257e5760008081fd5b61258f898683013560408401612486565b84525091830191830161254c565b509695505050505050565b600080600080606085870312156125be57600080fd5b843567ffffffffffffffff808211156125d657600080fd5b6125e2888389016123a5565b909650945060208701359150808211156125fb57600080fd5b612607888389016124c4565b9350604087013591508082111561261d57600080fd5b5061262a87828801612508565b91505092959194509250565b60005b83811015612651578181015183820152602001612639565b50506000910152565b60008151808452612672816020860160208601612636565b601f01601f19169290920160200192915050565b604081526000612699604083018561265a565b90506001600160a01b03831660208301529392505050565b600082601f8301126126c257600080fd5b813560206126d2612494836124e4565b82815260059290921b840181019181810190868411156126f157600080fd5b8286015b8481101561259d57803567ffffffffffffffff8111156127155760008081fd5b6127238986838b01016124c4565b8452509183019183016126f5565b60008060006040848603121561274657600080fd5b833567ffffffffffffffff8082111561275e57600080fd5b61276a878388016123a5565b9095509350602086013591508082111561278357600080fd5b50612790868287016126b1565b9150509250925092565b6000604080830181845280865180835260608601915060608160051b8701019250602080890160005b8381101561280457888603605f1901855281518051151587528301518387018890526127f18888018261265a565b96505093820193908201906001016127c3565b50508395506001600160a01b0388168188015250505050509392505050565b6000806000806040858703121561283957600080fd5b843567ffffffffffffffff8082111561285157600080fd5b61285d888389016123a5565b9096509450602087013591508082111561287657600080fd5b50612883878288016123a5565b95989497509550505050565b6080815260006128a2608083018761265a565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156128e157600080fd5b843567ffffffffffffffff808211156128f957600080fd5b612905888389016123a5565b9096509450602087013591508082111561291e57600080fd5b612607888389016126b1565b60008060008060008060a0878903121561294357600080fd5b863567ffffffffffffffff8082111561295b57600080fd5b6129678a838b016123a5565b9098509650602089013591508082111561298057600080fd5b61298c8a838b016124c4565b955060408901359150808211156129a257600080fd5b6129ae8a838b01612508565b9450606089013591506129c082612372565b909250608088013590808211156129d657600080fd5b506129e389828a016124c4565b9150509295509295509295565b600060208284031215612a0257600080fd5b813567ffffffffffffffff811115612a1957600080fd5b612a2584828501612508565b949350505050565b600080600060408486031215612a4257600080fd5b833567ffffffffffffffff80821115612a5a57600080fd5b612a66878388016123a5565b90955093506020860135915080821115612a7f57600080fd5b50612790868287016124c4565b60008060208385031215612a9f57600080fd5b823567ffffffffffffffff811115612ab657600080fd5b612ac2858286016123a5565b90969095509350505050565b600060208284031215612ae057600080fd5b5035919050565b6020815260006121c6602083018461265a565b600080600060408486031215612b0f57600080fd5b833567ffffffffffffffff80821115612b2757600080fd5b612b33878388016123a5565b90955093506020860135915080821115612b4c57600080fd5b5061279086828701612508565b6001600160a01b0381168114610b6057600080fd5b600060208284031215612b8057600080fd5b81356121c681612b59565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600082601f830112612bec57600080fd5b8151612bfa6124948261245e565b818152846020838601011115612c0f57600080fd5b612a25826020830160208701612636565b60008060408385031215612c3357600080fd5b825167ffffffffffffffff811115612c4a57600080fd5b612c5685828601612bdb565b9250506020830151612c6781612b59565b809150509250929050565b600060208284031215612c8457600080fd5b81516121c681612b59565b8015158114610b6057600080fd5b60008060408385031215612cb057600080fd5b823567ffffffffffffffff80821115612cc857600080fd5b818501915085601f830112612cdc57600080fd5b81356020612cec612494836124e4565b82815260059290921b84018101918181019089841115612d0b57600080fd5b948201945b83861015612d32578535612d2381612c8f565b82529482019490820190612d10565b96505086013592505080821115612d4857600080fd5b50611e2f858286016126b1565b600080600080600060a08688031215612d6d57600080fd5b612d778635612c8f565b85359450612d886020870135612b59565b6020860135935067ffffffffffffffff8060408801351115612da957600080fd5b612db98860408901358901612508565b93508060608801351115612dcc57600080fd5b612ddc88606089013589016124c4565b92508060808801351115612def57600080fd5b6080870135870188601f820112612e0557600080fd5b612e1261249482356124e4565b81358082526020808301929160051b8401018b1015612e3057600080fd5b602083015b6020843560051b850101811015612ec7578481351115612e5457600080fd5b803584016040818e03601f19011215612e6c57600080fd5b612e74612404565b612e816020830135612372565b602082013581528660408301351115612e9957600080fd5b612eac8e602060408501358501016124c4565b60208201528085525050602083019250602081019050612e35565b50809450505050509295509295909350565b604081526000612eec604083018561265a565b8281036020840152612efe818561265a565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612f07565b600060018201612f4257612f42612f07565b5060010190565b600060208284031215612f5b57600080fd5b815167ffffffffffffffff811115612f7257600080fd5b612a2584828501612bdb565b600081518084526020808501808196508360051b8101915082860160005b85811015612fc6578284038952612fb484835161265a565b98850198935090840190600101612f9c565b5091979650505050505050565b60a081526000612fe660a083018861265a565b8281036020840152612ff8818861265a565b9050828103604084015261300c8187612f7e565b90506001600160e01b0319851660608401528281036080840152613030818561265a565b98975050505050505050565b6000815160208301516001600160e01b03198082169350600483101561306c5780818460040360031b1b83161693505b505050919050565b600080604080848603121561308857600080fd5b835161309381612372565b8093505060208085015167ffffffffffffffff808211156130b357600080fd5b818701915087601f8301126130c757600080fd5b81516130d5612494826124e4565b81815260059190911b8301840190848101908a8311156130f457600080fd5b8585015b83811015613178578051858111156131105760008081fd5b8601808d03601f19018913156131265760008081fd5b61312e612404565b8882015161ffff811681146131435760008081fd5b8152818a0151878111156131575760008081fd5b6131658f8b83860101612bdb565b828b0152508452509186019186016130f8565b50809750505050505050509250929050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156131f457888303603f190185528151805161ffff1684528701518784018790526131e18785018261265a565b95880195935050908601906001016131b1565b509098975050505050505050565b8181038181111561035657610356612f07565b6000808585111561322557600080fd5b8386111561323257600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f83011261326057600080fd5b81516020613270612494836124e4565b82815260059290921b8401810191818101908684111561328f57600080fd5b8286015b8481101561259d57805167ffffffffffffffff8111156132b35760008081fd5b6132c18986838b0101612bdb565b845250918301918301613293565b6000602082840312156132e157600080fd5b815167ffffffffffffffff808211156132f957600080fd5b908301906060828603121561330d57600080fd5b604051606081018181108382111715613328576133286123ee565b604052825161333681612b59565b815260208301518281111561334a57600080fd5b6133568782860161324f565b60208301525060408301518281111561336e57600080fd5b61337a87828601612bdb565b60408301525095945050505050565b6001600160a01b03815116825260006020820151606060208501526133b16060850182612f7e565b905060408301518482036040860152612efe828261265a565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561341f57603f1988860301845261340d858351613389565b945092850192908501906001016133f1565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261345860a0850188612f7e565b848103606086015261346a818861265a565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156134d657858303601f19018552815180516001600160e01b03191684528801518884018890526134c38885018261265a565b958901959350509087019060010161348d565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061350b60a0830187612f7e565b828103604084015261300c818761265a565b600080600080600060a0868803121561353557600080fd5b855161354081612b59565b602087015190955067ffffffffffffffff8082111561355e57600080fd5b61356a89838a0161324f565b9550604088015191508082111561358057600080fd5b61358c89838a01612bdb565b94506060880151915061359e82612372565b6080880151919350808211156135b357600080fd5b506135c088828901612bdb565b9150509295509295909350565b6020815260006121c66020830184613389565b600083516135f2818460208801612636565b835190830190613606818360208801612636565b01949350505050565b60006020828403121561362157600080fd5b81516121c681612c8f565b601f82111561367657600081815260208120601f850160051c810160208610156136535750805b601f850160051c820191505b818110156136725782815560010161365f565b5050505b505050565b815167ffffffffffffffff811115613695576136956123ee565b6136a9816136a38454612b8b565b8461362c565b602080601f8311600181146136de57600084156136c65750858301515b600019600386901b1c1916600185901b178555613672565b600085815260208120601f198616915b8281101561370d578886015182559484019460019091019084016136ee565b508582101561372b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea264697066735822122035159d52a0e04cc6441dfed903a33c70a9ca44587807027ddef3eb9b76c1cb2264736f6c63430008110033", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106101365760003560e01c80638e5ea8df116100b2578063b241d0d311610081578063e0a8541211610066578063e0a85412146102ec578063ec11c823146102ff578063f2fde38b1461031257600080fd5b8063b241d0d3146102c6578063b4a85801146102d957600080fd5b80638e5ea8df146102485780639061b9231461025b578063a1cbcbaf1461026e578063a6b16419146102a657600080fd5b8063715018a6116101095780637b103999116100ee5780637b103999146101e55780638da5cb5b146102245780638e25a0f31461023557600080fd5b8063715018a6146101c857806376286c00146101d257600080fd5b806301ffc9a71461013b5780630667cfea14610163578063206c74c9146101845780636dc4fb73146101a5575b600080fd5b61014e610149366004612388565b610325565b60405190151581526020015b60405180910390f35b6101766101713660046125a8565b61035c565b60405161015a929190612686565b610197610192366004612731565b610392565b60405161015a92919061279a565b6101b86101b3366004612823565b61047f565b60405161015a949392919061288f565b6101d061056f565b005b6101976101e03660046128cb565b610583565b61020c7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b03909116815260200161015a565b6000546001600160a01b031661020c565b61017661024336600461292a565b6105ab565b6101d06102563660046129f0565b61064e565b610176610269366004612a2d565b61066d565b61028161027c366004612a8c565b610766565b604080516001600160a01b03909416845260208401929092529082015260600161015a565b6102b96102b4366004612ace565b61078c565b60405161015a9190612ae7565b6101b86102d4366004612afa565b610838565b6101976102e7366004612823565b61092a565b6101766102fa366004612823565b61096e565b6101b861030d366004612a8c565b6109e0565b6101d0610320366004612b6e565b610ad3565b60006001600160e01b03198216639061b92360e01b148061035657506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060006103848686868663e0a8541260e01b604051806020016040528060008152506105ab565b915091505b94509492505050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b8282101561046a5783829060005260206000200180546103dd90612b8b565b80601f016020809104026020016040519081016040528092919081815260200182805461040990612b8b565b80156104565780601f1061042b57610100808354040283529160200191610456565b820191906000526020600020905b81548152906001019060200180831161043957829003601f168201915b5050505050815260200190600101906103be565b50505050610583565b91509150935093915050565b6060600080808080808061049d8c8c8c8c636dc4fb7360e01b610b63565b93509350935093506000846000815181106104ba576104ba612bc5565b6020026020010151905080600001516104f5578060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60405180910390fd5b81511561054757600080838060200190518101906105139190612c20565b91509150600083602001518060200190518101906105319190612c72565b929b509199509750939550610564945050505050565b61055681602001518585610ee9565b985098509850985050505050505b945094509450949050565b61057761104a565b61058160006110a4565b565b606060006103848686868663b4a8580160e01b6040518060200160405280600081525061110c565b6040805160018082528183019092526060916000918291816020015b60608152602001906001900390816105c757905050905086816000815181106105f2576105f2612bc5565b602002602001018190525060008061060e8b8b858b8b8b61110c565b9150915060008260008151811061062757610627612bc5565b6020026020010151905061063a8161128d565b602001519b909a5098505050505050505050565b61065661104a565b80516106699060019060208401906122b5565b5050565b606060006104738585856001805480602002602001604051908101604052809291908181526020016000905b828210156107455783829060005260206000200180546106b890612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546106e490612b8b565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b505050505081526020019060010190610699565b5050505063e0a8541260e01b604051806020016040528060008152506105ab565b60008060008060008061077b88886000611310565b919750955093505050509250925092565b6001818154811061079c57600080fd5b9060005260206000200160009150905080546107b790612b8b565b80601f01602080910402602001604051908101604052809291908181526020018280546107e390612b8b565b80156108305780601f1061080557610100808354040283529160200191610830565b820191906000526020600020905b81548152906001019060200180831161081357829003601f168201915b505050505081565b6060600080600080610884600089898080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092939250506115be9050565b60405160240161089691815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f691f343100000000000000000000000000000000000000000000000000000000179052815190810190915260008082529192508190610906908b908b9086908c90636dc4fb7360e01b906105ab565b9150915061091582828a610ee9565b96509650965096505050505b93509350935093565b60606000808061095d888888887fb4a8580100000000000000000000000000000000000000000000000000000000610b63565b50919a909950975050505050505050565b6060600080806109a1888888887fe0a8541200000000000000000000000000000000000000000000000000000000610b63565b5050915091506000826000815181106109bc576109bc612bc5565b602002602001015190506109cf8161128d565b602001519890975095505050505050565b60606000806000610ac386866001805480602002602001604051908101604052809291908181526020016000905b82821015610aba578382906000526020600020018054610a2d90612b8b565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5990612b8b565b8015610aa65780601f10610a7b57610100808354040283529160200191610aa6565b820191906000526020600020905b815481529060010190602001808311610a8957829003601f168201915b505050505081526020019060010190610a0e565b50505050610838565b9299919850965090945092505050565b610adb61104a565b6001600160a01b038116610b575760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ec565b610b60816110a4565b50565b60606000606080610bc760405180610100016040528060608152602001606081526020016060815260200160006001600160e01b031916815260200160001515815260200160006001600160a01b0316815260200160608152602001606081525090565b6001600160e01b031986166060820152600080610be68b8d018d612c9d565b90925090506060610bf98a8c018c612d55565b60c089019190915260408801919091526001600160a01b0390911660a08701529015156080860152805183519192501015610c3357600080fd5b805167ffffffffffffffff811115610c4d57610c4d6123ee565b604051908082528060200260200182016040528015610c8057816020015b6060815260200190600190039081610c6b5790505b506020850152805167ffffffffffffffff811115610ca057610ca06123ee565b604051908082528060200260200182016040528015610cc9578160200160208202803683370190505b5060e08501526000805b8251811015610eb7578251600090849083908110610cf357610cf3612bc5565b6020026020010151600001516001600160e01b03191603610d5257828181518110610d2057610d20612bc5565b60200260200101516020015186602001518281518110610d4257610d42612bc5565b6020026020010181905250610ea5565b848281518110610d6457610d64612bc5565b602002602001015115610ddb5760018660e001518281518110610d8957610d89612bc5565b602002602001019015159081151581525050838281518110610dad57610dad612bc5565b602002602001015186602001518281518110610dcb57610dcb612bc5565b6020026020010181905250610e97565b828181518110610ded57610ded612bc5565b602002602001015160000151848381518110610e0b57610e0b612bc5565b6020026020010151848381518110610e2557610e25612bc5565b602002602001015160200151604051602401610e42929190612ed9565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505086602001518281518110610e8b57610e8b612bc5565b60200260200101819052505b610ea2826001612f1d565b91505b80610eaf81612f30565b915050610cd3565b50610ec18561167d565b8560a0015186604001518760c001519850985098509850505050505095509550955095915050565b606060008060008087806020019051810190610f059190612f49565b9050600080610f1383611a88565b91509150600081604051602401610f2c91815260200190565b60408051601f19818403018152918152602080830180516001600160e01b03167f3b3b57de000000000000000000000000000000000000000000000000000000001790529051919250600091610f869187918e9101612686565b6040516020818303038152906040529050600080306001600160a01b0316638e25a0f387868f636dc4fb7360e01b886040518663ffffffff1660e01b8152600401610fd5959493929190612fd3565b600060405180830381865afa158015610ff2573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261101a9190810190612c20565b915091506000828060200190518101906110349190612c72565b979f979e50909b50959950505050505050505050565b6000546001600160a01b031633146105815760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ec565b600080546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b6060600080600061111d8a8a610766565b919450849350909150506001600160a01b038216611167576040517f7199966d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0383163b6111a8576040517f4981ac0500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b604080516101206020601f8d01819004028201810190925261010081018b81528315159261127d929182918f908f9081908501838280828437600092019190915250505090825250602081018c9052604081018b90526001600160e01b03198a16606082015283151560808201526001600160a01b03871660a082015260c081018990528b5160e09091019067ffffffffffffffff81111561124c5761124c6123ee565b604051908082528060200260200182016040528015611275578160200160208202803683370190505b50905261167d565b9450505050965096945050505050565b8051610b6057602081015163ca7a4e7560e01b906112aa9061303c565b6001600160e01b031916036112f157600081602001518060200190518101906112d39190613074565b9150508060405163ca7a4e7560e01b81526004016104ec919061318a565b8060200151604051634ae063a960e11b81526004016104ec9190612ae7565b60008060008086868681811061132857611328612bc5565b919091013560f81c915050600081900361134c5750600092508291508390506115b5565b60006113588287612f1d565b611363906001612f1d565b905060008260421480156113a95750888861137f896001612f1d565b81811061138e5761138e612bc5565b9050013560f81c60f81b6001600160f81b031916605b60f81b145b80156113e7575088886113bd600185613202565b8181106113cc576113cc612bc5565b9050013560f81c60f81b6001600160f81b031916605d60f81b145b1561145f57611457600060408b8b6114008c6002612f1d565b9061140c600189613202565b9261141993929190613215565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929493925050611cb19050565b509050611491565b888861146c896001612f1d565b61147892859290613215565b60405161148692919061323f565b604051809103902090505b60008060006114a18c8c87611310565b925092509250600082856040516020016114c5929190918252602082015260400190565b60408051601f198184030181529082905280516020909101207f0178b8bf0000000000000000000000000000000000000000000000000000000082526004820181905291506000906001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690630178b8bf90602401602060405180830381865afa15801561155e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115829190612c72565b90506001600160a01b038116156115a657995097508996506115b595505050505050565b50929850919650909450505050505b93509350939050565b60008060006115cd8585611d82565b90925090508161163f57600185516115e59190613202565b84146116335760405162461bcd60e51b815260206004820152601d60248201527f6e616d65686173683a204a756e6b20617420656e64206f66206e616d6500000060448201526064016104ec565b50600091506103569050565b61164985826115be565b6040805160208101929092528101839052606001604051602081830303815290604052805190602001209250505092915050565b6020810151516060906000808267ffffffffffffffff8111156116a2576116a26123ee565b60405190808252806020026020018201604052801561170057816020015b6116ed604051806060016040528060006001600160a01b0316815260200160608152602001606081525090565b8152602001906001900390816116c05790505b50905060008367ffffffffffffffff81111561171e5761171e6123ee565b60405190808252806020026020018201604052801561176457816020015b60408051808201909152600081526060602082015281526020019060019003908161173c5790505b5090508367ffffffffffffffff811115611780576117806123ee565b6040519080825280602002602001820160405280156117c657816020015b60408051808201909152600081526060602082015281526020019060019003908161179e5790505b50945060006117d487611e39565b905060005b858110156119c7576000886020015182815181106117f9576117f9612bc5565b6020026020010151905060008960e00151838151811061181b5761181b612bc5565b6020026020010151905080156118675760405180604001604052806000151581526020018381525089848151811061185557611855612bc5565b602002602001018190525050506119b5565b600061187d8b60000151848d60a0015188611ed0565b809450819250505060008060008061189a8f60a001518887611f58565b9350935093509350831561191057828060200190518101906118bc91906132cf565b8b8d815181106118ce576118ce612bc5565b6020026020010181905250818a89815181106118ec576118ec612bc5565b602090810291909101015261190260018d612f1d565b9b50505050505050506119b5565b80801561191e575088602001515b1561193a57828060200190518101906119379190612f49565b92505b60405180604001604052808215158152602001848152508e898151811061196357611963612bc5565b60200260200101819052508e60200151888151811061198457611984612bc5565b60200260200101518a898151811061199e5761199e612bc5565b602002602001015160200181905250505050505050505b806119bf81612f30565b9150506117d9565b50836000036119da575050505050919050565b83835230876040015163a780bab660e01b856040516024016119fc91906133ca565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b03838183161783525050505089606001518a608001518b60a001518c604001518d60c0015189604051602001611a5d95949392919061342c565b60408051601f1981840301815290829052630556f18360e41b82526104ec95949392916004016134e9565b805160609060009081908490611a9f816002612f1d565b67ffffffffffffffff811115611ab757611ab76123ee565b6040519080825280601f01601f191660200182016040528015611ae1576020820181803683370190505b50945060009350808403611b2657600060f81b85600081518110611b0757611b07612bc5565b60200101906001600160f81b031916908160001a905350505050915091565b60001981015b828181518110611b3e57611b3e612bc5565b01602001517fff00000000000000000000000000000000000000000000000000000000000000167f2e0000000000000000000000000000000000000000000000000000000000000003611c00578360f81b868260010181518110611ba457611ba4612bc5565b60200101906001600160f81b031916908160001a90535084611bcd846001840160ff8816612110565b60408051602081019390935282015260600160405160208183030381529060405280519060200120945060009350611c50565b600184019350828181518110611c1857611c18612bc5565b602001015160f81c60f81b868260010181518110611c3857611c38612bc5565b60200101906001600160f81b031916908160001a9053505b8015611c5f5760001901611b2c565b5083611c7083600060ff8716612110565b6040805160208101939093528201526060016040516020818303038152906040528051906020012093508260f81b85600081518110611b0757611b07612bc5565b8251600090600190831115611cc557600080fd5b611d16565b6000603a8210602f83111615611ce25750602f190190565b60478210604083111615611cf857506036190190565b60678210606083111615611d0e57506056190190565b5060ff919050565b60208501845b84811015611d7857611d338183015160001a611cca565b611d456001830184015160001a611cca565b60ff811460ff83141715611d5e57600094505050611d78565b60049190911b1760089490941b9390931792600201611d1c565b5050935093915050565b60008083518310611dd55760405162461bcd60e51b815260206004820152601e60248201527f726561644c6162656c3a20496e646578206f7574206f6620626f756e6473000060448201526064016104ec565b6000848481518110611de957611de9612bc5565b016020015160f81c90508015611e1557611e0e85611e08866001612f1d565b83612110565b9250611e1a565b600092505b611e248185612f1d565b611e2f906001612f1d565b9150509250929050565b604080518082019091526000808252602082015281515160a0830151901590600090611e6c90639061b92360e01b612134565b905083608001518015611e7d575080155b15611eb4576040517f82c2c72800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040805180820190915291151582521515602082015292915050565b600060608260000151611f4c57826020015115611f305760018686604051602401611efc929190612ed9565b60408051601f198184030181529190526020810180516001600160e01b0316639061b92360e01b1790529092509050610389565b611f4284611f3d8761303c565b612134565b8591509150610389565b50600195939450505050565b604080518082019091526000808252606060208301819052909160008415611f8b57611f8487876121b9565b9050611f9b565b611f98878761c3506121cd565b90505b3d8115611fbf576000611faf600083612260565b9095509350600191506109219050565b60048110612106576000611fd560006004612260565b90506000611fed6004611fe88186613202565b612260565b9050630556f18360e41b6120008361303c565b6001600160e01b031916036120ce5760008060008060008580602001905181019061202b919061351d565b945094509450945094508e6001600160a01b0316856001600160a01b0316036120c4576040518060600160405280866001600160a01b031681526020018581526020018481525060405160200161208291906135cd565b60408051601f198184030181528282019091526001600160e01b03199093168152602081019190915260019b5090995097506000965061092195505050505050565b5050505050612103565b81816040516020016120e19291906135e0565b60408051601f1981840301815291905260009750955086935061092192505050565b50505b5093509350935093565b825160009061211f8385612f1d565b111561212a57600080fd5b5091016020012090565b6040516301ffc9a760e01b81526001600160e01b0319821660048201526000906001600160a01b038416906301ffc9a79061c350906024016020604051808303818786fa935050505080156121a6575060408051601f3d908101601f191682019092526121a39181019061360f565b60015b6121b257506000610356565b9050610356565b60006121c683835a6121cd565b9392505050565b60006001600160a01b0384163b61224c5760405162461bcd60e51b815260206004820152602e60248201527f4c6f774c6576656c43616c6c5574696c733a207374617469632063616c6c207460448201527f6f206e6f6e2d636f6e747261637400000000000000000000000000000000000060648201526084016104ec565b6000808451602086018786fa949350505050565b60608167ffffffffffffffff81111561227b5761227b6123ee565b6040519080825280601f01601f1916602001820160405280156122a5576020820181803683370190505b5090508183602083013e92915050565b8280548282559060005260206000209081019282156122fb579160200282015b828111156122fb57825182906122eb908261367b565b50916020019190600101906122d5565b5061230792915061230b565b5090565b8082111561230757600061231f8282612328565b5060010161230b565b50805461233490612b8b565b6000825580601f10612344575050565b601f016020900490600052602060002090810190610b6091905b80821115612307576000815560010161235e565b6001600160e01b031981168114610b6057600080fd5b60006020828403121561239a57600080fd5b81356121c681612372565b60008083601f8401126123b757600080fd5b50813567ffffffffffffffff8111156123cf57600080fd5b6020830191508360208285010111156123e757600080fd5b9250929050565b634e487b7160e01b600052604160045260246000fd5b6040805190810167ffffffffffffffff81118282101715612427576124276123ee565b60405290565b604051601f8201601f1916810167ffffffffffffffff81118282101715612456576124566123ee565b604052919050565b600067ffffffffffffffff821115612478576124786123ee565b50601f01601f191660200190565b60006124996124948461245e565b61242d565b90508281528383830111156124ad57600080fd5b828260208301376000602084830101529392505050565b600082601f8301126124d557600080fd5b6121c683833560208501612486565b600067ffffffffffffffff8211156124fe576124fe6123ee565b5060051b60200190565b600082601f83011261251957600080fd5b81356020612529612494836124e4565b82815260059290921b8401810191818101908684111561254857600080fd5b8286015b8481101561259d57803567ffffffffffffffff81111561256c5760008081fd5b8701603f8101891361257e5760008081fd5b61258f898683013560408401612486565b84525091830191830161254c565b509695505050505050565b600080600080606085870312156125be57600080fd5b843567ffffffffffffffff808211156125d657600080fd5b6125e2888389016123a5565b909650945060208701359150808211156125fb57600080fd5b612607888389016124c4565b9350604087013591508082111561261d57600080fd5b5061262a87828801612508565b91505092959194509250565b60005b83811015612651578181015183820152602001612639565b50506000910152565b60008151808452612672816020860160208601612636565b601f01601f19169290920160200192915050565b604081526000612699604083018561265a565b90506001600160a01b03831660208301529392505050565b600082601f8301126126c257600080fd5b813560206126d2612494836124e4565b82815260059290921b840181019181810190868411156126f157600080fd5b8286015b8481101561259d57803567ffffffffffffffff8111156127155760008081fd5b6127238986838b01016124c4565b8452509183019183016126f5565b60008060006040848603121561274657600080fd5b833567ffffffffffffffff8082111561275e57600080fd5b61276a878388016123a5565b9095509350602086013591508082111561278357600080fd5b50612790868287016126b1565b9150509250925092565b6000604080830181845280865180835260608601915060608160051b8701019250602080890160005b8381101561280457888603605f1901855281518051151587528301518387018890526127f18888018261265a565b96505093820193908201906001016127c3565b50508395506001600160a01b0388168188015250505050509392505050565b6000806000806040858703121561283957600080fd5b843567ffffffffffffffff8082111561285157600080fd5b61285d888389016123a5565b9096509450602087013591508082111561287657600080fd5b50612883878288016123a5565b95989497509550505050565b6080815260006128a2608083018761265a565b6001600160a01b0395861660208401529385166040830152509216606090920191909152919050565b600080600080606085870312156128e157600080fd5b843567ffffffffffffffff808211156128f957600080fd5b612905888389016123a5565b9096509450602087013591508082111561291e57600080fd5b612607888389016126b1565b60008060008060008060a0878903121561294357600080fd5b863567ffffffffffffffff8082111561295b57600080fd5b6129678a838b016123a5565b9098509650602089013591508082111561298057600080fd5b61298c8a838b016124c4565b955060408901359150808211156129a257600080fd5b6129ae8a838b01612508565b9450606089013591506129c082612372565b909250608088013590808211156129d657600080fd5b506129e389828a016124c4565b9150509295509295509295565b600060208284031215612a0257600080fd5b813567ffffffffffffffff811115612a1957600080fd5b612a2584828501612508565b949350505050565b600080600060408486031215612a4257600080fd5b833567ffffffffffffffff80821115612a5a57600080fd5b612a66878388016123a5565b90955093506020860135915080821115612a7f57600080fd5b50612790868287016124c4565b60008060208385031215612a9f57600080fd5b823567ffffffffffffffff811115612ab657600080fd5b612ac2858286016123a5565b90969095509350505050565b600060208284031215612ae057600080fd5b5035919050565b6020815260006121c6602083018461265a565b600080600060408486031215612b0f57600080fd5b833567ffffffffffffffff80821115612b2757600080fd5b612b33878388016123a5565b90955093506020860135915080821115612b4c57600080fd5b5061279086828701612508565b6001600160a01b0381168114610b6057600080fd5b600060208284031215612b8057600080fd5b81356121c681612b59565b600181811c90821680612b9f57607f821691505b602082108103612bbf57634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052603260045260246000fd5b600082601f830112612bec57600080fd5b8151612bfa6124948261245e565b818152846020838601011115612c0f57600080fd5b612a25826020830160208701612636565b60008060408385031215612c3357600080fd5b825167ffffffffffffffff811115612c4a57600080fd5b612c5685828601612bdb565b9250506020830151612c6781612b59565b809150509250929050565b600060208284031215612c8457600080fd5b81516121c681612b59565b8015158114610b6057600080fd5b60008060408385031215612cb057600080fd5b823567ffffffffffffffff80821115612cc857600080fd5b818501915085601f830112612cdc57600080fd5b81356020612cec612494836124e4565b82815260059290921b84018101918181019089841115612d0b57600080fd5b948201945b83861015612d32578535612d2381612c8f565b82529482019490820190612d10565b96505086013592505080821115612d4857600080fd5b50611e2f858286016126b1565b600080600080600060a08688031215612d6d57600080fd5b612d778635612c8f565b85359450612d886020870135612b59565b6020860135935067ffffffffffffffff8060408801351115612da957600080fd5b612db98860408901358901612508565b93508060608801351115612dcc57600080fd5b612ddc88606089013589016124c4565b92508060808801351115612def57600080fd5b6080870135870188601f820112612e0557600080fd5b612e1261249482356124e4565b81358082526020808301929160051b8401018b1015612e3057600080fd5b602083015b6020843560051b850101811015612ec7578481351115612e5457600080fd5b803584016040818e03601f19011215612e6c57600080fd5b612e74612404565b612e816020830135612372565b602082013581528660408301351115612e9957600080fd5b612eac8e602060408501358501016124c4565b60208201528085525050602083019250602081019050612e35565b50809450505050509295509295909350565b604081526000612eec604083018561265a565b8281036020840152612efe818561265a565b95945050505050565b634e487b7160e01b600052601160045260246000fd5b8082018082111561035657610356612f07565b600060018201612f4257612f42612f07565b5060010190565b600060208284031215612f5b57600080fd5b815167ffffffffffffffff811115612f7257600080fd5b612a2584828501612bdb565b600081518084526020808501808196508360051b8101915082860160005b85811015612fc6578284038952612fb484835161265a565b98850198935090840190600101612f9c565b5091979650505050505050565b60a081526000612fe660a083018861265a565b8281036020840152612ff8818861265a565b9050828103604084015261300c8187612f7e565b90506001600160e01b0319851660608401528281036080840152613030818561265a565b98975050505050505050565b6000815160208301516001600160e01b03198082169350600483101561306c5780818460040360031b1b83161693505b505050919050565b600080604080848603121561308857600080fd5b835161309381612372565b8093505060208085015167ffffffffffffffff808211156130b357600080fd5b818701915087601f8301126130c757600080fd5b81516130d5612494826124e4565b81815260059190911b8301840190848101908a8311156130f457600080fd5b8585015b83811015613178578051858111156131105760008081fd5b8601808d03601f19018913156131265760008081fd5b61312e612404565b8882015161ffff811681146131435760008081fd5b8152818a0151878111156131575760008081fd5b6131658f8b83860101612bdb565b828b0152508452509186019186016130f8565b50809750505050505050509250929050565b60006020808301818452808551808352604092508286019150828160051b87010184880160005b838110156131f457888303603f190185528151805161ffff1684528701518784018790526131e18785018261265a565b95880195935050908601906001016131b1565b509098975050505050505050565b8181038181111561035657610356612f07565b6000808585111561322557600080fd5b8386111561323257600080fd5b5050820193919092039150565b8183823760009101908152919050565b600082601f83011261326057600080fd5b81516020613270612494836124e4565b82815260059290921b8401810191818101908684111561328f57600080fd5b8286015b8481101561259d57805167ffffffffffffffff8111156132b35760008081fd5b6132c18986838b0101612bdb565b845250918301918301613293565b6000602082840312156132e157600080fd5b815167ffffffffffffffff808211156132f957600080fd5b908301906060828603121561330d57600080fd5b604051606081018181108382111715613328576133286123ee565b604052825161333681612b59565b815260208301518281111561334a57600080fd5b6133568782860161324f565b60208301525060408301518281111561336e57600080fd5b61337a87828601612bdb565b60408301525095945050505050565b6001600160a01b03815116825260006020820151606060208501526133b16060850182612f7e565b905060408301518482036040860152612efe828261265a565b6000602080830181845280855180835260408601915060408160051b870101925083870160005b8281101561341f57603f1988860301845261340d858351613389565b945092850192908501906001016133f1565b5092979650505050505050565b8515158152600060206001600160a01b03871681840152604060a08185015261345860a0850188612f7e565b848103606086015261346a818861265a565b905084810360808601528086518083528483019150848160051b84010185890160005b838110156134d657858303601f19018552815180516001600160e01b03191684528801518884018890526134c38885018261265a565b958901959350509087019060010161348d565b50909d9c50505050505050505050505050565b6001600160a01b038616815260a06020820152600061350b60a0830187612f7e565b828103604084015261300c818761265a565b600080600080600060a0868803121561353557600080fd5b855161354081612b59565b602087015190955067ffffffffffffffff8082111561355e57600080fd5b61356a89838a0161324f565b9550604088015191508082111561358057600080fd5b61358c89838a01612bdb565b94506060880151915061359e82612372565b6080880151919350808211156135b357600080fd5b506135c088828901612bdb565b9150509295509295909350565b6020815260006121c66020830184613389565b600083516135f2818460208801612636565b835190830190613606818360208801612636565b01949350505050565b60006020828403121561362157600080fd5b81516121c681612c8f565b601f82111561367657600081815260208120601f850160051c810160208610156136535750805b601f850160051c820191505b818110156136725782815560010161365f565b5050505b505050565b815167ffffffffffffffff811115613695576136956123ee565b6136a9816136a38454612b8b565b8461362c565b602080601f8311600181146136de57600084156136c65750858301515b600019600386901b1c1916600185901b178555613672565b600085815260208120601f198616915b8281101561370d578886015182559484019460019091019084016136ee565b508582101561372b5787850151600019600388901b60f8161c191681555b5050505050600190811b0190555056fea264697066735822122035159d52a0e04cc6441dfed903a33c70a9ca44587807027ddef3eb9b76c1cb2264736f6c63430008110033", "devdoc": { "kind": "dev", "methods": { @@ -633,7 +718,7 @@ "storageLayout": { "storage": [ { - "astId": 444, + "astId": 7, "contract": "contracts/utils/UniversalResolver.sol:UniversalResolver", "label": "_owner", "offset": 0, @@ -641,7 +726,7 @@ "type": "t_address" }, { - "astId": 18487, + "astId": 1511, "contract": "contracts/utils/UniversalResolver.sol:UniversalResolver", "label": "batchGatewayURLs", "offset": 0, diff --git a/deployments/sepolia/solcInputs/a268c4117fbf03c1acd17a54ea249795.json b/deployments/sepolia/solcInputs/a268c4117fbf03c1acd17a54ea249795.json new file mode 100644 index 00000000..f271bb76 --- /dev/null +++ b/deployments/sepolia/solcInputs/a268c4117fbf03c1acd17a54ea249795.json @@ -0,0 +1,101 @@ +{ + "language": "Solidity", + "sources": { + "@openzeppelin/contracts/access/Ownable.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)\n\npragma solidity ^0.8.0;\n\nimport \"../utils/Context.sol\";\n\n/**\n * @dev Contract module which provides a basic access control mechanism, where\n * there is an account (an owner) that can be granted exclusive access to\n * specific functions.\n *\n * By default, the owner account will be the one that deploys the contract. This\n * can later be changed with {transferOwnership}.\n *\n * This module is used through inheritance. It will make available the modifier\n * `onlyOwner`, which can be applied to your functions to restrict their use to\n * the owner.\n */\nabstract contract Ownable is Context {\n address private _owner;\n\n event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);\n\n /**\n * @dev Initializes the contract setting the deployer as the initial owner.\n */\n constructor() {\n _transferOwnership(_msgSender());\n }\n\n /**\n * @dev Throws if called by any account other than the owner.\n */\n modifier onlyOwner() {\n _checkOwner();\n _;\n }\n\n /**\n * @dev Returns the address of the current owner.\n */\n function owner() public view virtual returns (address) {\n return _owner;\n }\n\n /**\n * @dev Throws if the sender is not the owner.\n */\n function _checkOwner() internal view virtual {\n require(owner() == _msgSender(), \"Ownable: caller is not the owner\");\n }\n\n /**\n * @dev Leaves the contract without owner. It will not be possible to call\n * `onlyOwner` functions anymore. Can only be called by the current owner.\n *\n * NOTE: Renouncing ownership will leave the contract without an owner,\n * thereby removing any functionality that is only available to the owner.\n */\n function renounceOwnership() public virtual onlyOwner {\n _transferOwnership(address(0));\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Can only be called by the current owner.\n */\n function transferOwnership(address newOwner) public virtual onlyOwner {\n require(newOwner != address(0), \"Ownable: new owner is the zero address\");\n _transferOwnership(newOwner);\n }\n\n /**\n * @dev Transfers ownership of the contract to a new account (`newOwner`).\n * Internal function without access restriction.\n */\n function _transferOwnership(address newOwner) internal virtual {\n address oldOwner = _owner;\n _owner = newOwner;\n emit OwnershipTransferred(oldOwner, newOwner);\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Address.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts (last updated v4.8.0) (utils/Address.sol)\n\npragma solidity ^0.8.1;\n\n/**\n * @dev Collection of functions related to the address type\n */\nlibrary Address {\n /**\n * @dev Returns true if `account` is a contract.\n *\n * [IMPORTANT]\n * ====\n * It is unsafe to assume that an address for which this function returns\n * false is an externally-owned account (EOA) and not a contract.\n *\n * Among others, `isContract` will return false for the following\n * types of addresses:\n *\n * - an externally-owned account\n * - a contract in construction\n * - an address where a contract will be created\n * - an address where a contract lived, but was destroyed\n * ====\n *\n * [IMPORTANT]\n * ====\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\n *\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\n * constructor.\n * ====\n */\n function isContract(address account) internal view returns (bool) {\n // This method relies on extcodesize/address.code.length, which returns 0\n // for contracts in construction, since the code is only stored at the end\n // of the constructor execution.\n\n return account.code.length > 0;\n }\n\n /**\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\n * `recipient`, forwarding all available gas and reverting on errors.\n *\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\n * imposed by `transfer`, making them unable to receive funds via\n * `transfer`. {sendValue} removes this limitation.\n *\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\n *\n * IMPORTANT: because control is transferred to `recipient`, care must be\n * taken to not create reentrancy vulnerabilities. Consider using\n * {ReentrancyGuard} or the\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\n */\n function sendValue(address payable recipient, uint256 amount) internal {\n require(address(this).balance >= amount, \"Address: insufficient balance\");\n\n (bool success, ) = recipient.call{value: amount}(\"\");\n require(success, \"Address: unable to send value, recipient may have reverted\");\n }\n\n /**\n * @dev Performs a Solidity function call using a low level `call`. A\n * plain `call` is an unsafe replacement for a function call: use this\n * function instead.\n *\n * If `target` reverts with a revert reason, it is bubbled up by this\n * function (like regular Solidity function calls).\n *\n * Returns the raw returned data. To convert to the expected return value,\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\n *\n * Requirements:\n *\n * - `target` must be a contract.\n * - calling `target` with `data` must not revert.\n *\n * _Available since v3.1._\n */\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, \"Address: low-level call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\n * `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, 0, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but also transferring `value` wei to `target`.\n *\n * Requirements:\n *\n * - the calling contract must have an ETH balance of at least `value`.\n * - the called Solidity function must be `payable`.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value\n ) internal returns (bytes memory) {\n return functionCallWithValue(target, data, value, \"Address: low-level call with value failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\n * with `errorMessage` as a fallback revert reason when `target` reverts.\n *\n * _Available since v3.1._\n */\n function functionCallWithValue(\n address target,\n bytes memory data,\n uint256 value,\n string memory errorMessage\n ) internal returns (bytes memory) {\n require(address(this).balance >= value, \"Address: insufficient balance for call\");\n (bool success, bytes memory returndata) = target.call{value: value}(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\n return functionStaticCall(target, data, \"Address: low-level static call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a static call.\n *\n * _Available since v3.3._\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n (bool success, bytes memory returndata) = target.staticcall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\n return functionDelegateCall(target, data, \"Address: low-level delegate call failed\");\n }\n\n /**\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\n * but performing a delegate call.\n *\n * _Available since v3.4._\n */\n function functionDelegateCall(\n address target,\n bytes memory data,\n string memory errorMessage\n ) internal returns (bytes memory) {\n (bool success, bytes memory returndata) = target.delegatecall(data);\n return verifyCallResultFromTarget(target, success, returndata, errorMessage);\n }\n\n /**\n * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling\n * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.\n *\n * _Available since v4.8._\n */\n function verifyCallResultFromTarget(\n address target,\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal view returns (bytes memory) {\n if (success) {\n if (returndata.length == 0) {\n // only check isContract if the call was successful and the return data is empty\n // otherwise we already know that it was a contract\n require(isContract(target), \"Address: call to non-contract\");\n }\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n /**\n * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the\n * revert reason or using the provided one.\n *\n * _Available since v4.3._\n */\n function verifyCallResult(\n bool success,\n bytes memory returndata,\n string memory errorMessage\n ) internal pure returns (bytes memory) {\n if (success) {\n return returndata;\n } else {\n _revert(returndata, errorMessage);\n }\n }\n\n function _revert(bytes memory returndata, string memory errorMessage) private pure {\n // Look for revert reason and bubble it up if present\n if (returndata.length > 0) {\n // The easiest way to bubble the revert reason is using memory via assembly\n /// @solidity memory-safe-assembly\n assembly {\n let returndata_size := mload(returndata)\n revert(add(32, returndata), returndata_size)\n }\n } else {\n revert(errorMessage);\n }\n }\n}\n" + }, + "@openzeppelin/contracts/utils/Context.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Provides information about the current execution context, including the\n * sender of the transaction and its data. While these are generally available\n * via msg.sender and msg.data, they should not be accessed in such a direct\n * manner, since when dealing with meta-transactions the account sending and\n * paying for execution may not be the actual sender (as far as an application\n * is concerned).\n *\n * This contract is only required for intermediate, library-like contracts.\n */\nabstract contract Context {\n function _msgSender() internal view virtual returns (address) {\n return msg.sender;\n }\n\n function _msgData() internal view virtual returns (bytes calldata) {\n return msg.data;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/ERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\n\npragma solidity ^0.8.0;\n\nimport \"./IERC165.sol\";\n\n/**\n * @dev Implementation of the {IERC165} interface.\n *\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\n * for the additional interface id that will be supported. For example:\n *\n * ```solidity\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\n * }\n * ```\n *\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\n */\nabstract contract ERC165 is IERC165 {\n /**\n * @dev See {IERC165-supportsInterface}.\n */\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\n return interfaceId == type(IERC165).interfaceId;\n }\n}\n" + }, + "@openzeppelin/contracts/utils/introspection/IERC165.sol": { + "content": "// SPDX-License-Identifier: MIT\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\n\npragma solidity ^0.8.0;\n\n/**\n * @dev Interface of the ERC165 standard, as defined in the\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\n *\n * Implementers can declare support of contract interfaces, which can then be\n * queried by others ({ERC165Checker}).\n *\n * For an implementation, see {ERC165}.\n */\ninterface IERC165 {\n /**\n * @dev Returns true if this contract implements the interface defined by\n * `interfaceId`. See the corresponding\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\n * to learn more about how these ids are created.\n *\n * This function call must use less than 30 000 gas.\n */\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\n}\n" + }, + "contracts/registry/ENS.sol": { + "content": "pragma solidity >=0.8.4;\n\ninterface ENS {\n // Logged when the owner of a node assigns a new owner to a subnode.\n event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner);\n\n // Logged when the owner of a node transfers ownership to a new account.\n event Transfer(bytes32 indexed node, address owner);\n\n // Logged when the resolver for a node changes.\n event NewResolver(bytes32 indexed node, address resolver);\n\n // Logged when the TTL of a node changes\n event NewTTL(bytes32 indexed node, uint64 ttl);\n\n // Logged when an operator is added or removed.\n event ApprovalForAll(\n address indexed owner,\n address indexed operator,\n bool approved\n );\n\n function setRecord(\n bytes32 node,\n address owner,\n address resolver,\n uint64 ttl\n ) external;\n\n function setSubnodeRecord(\n bytes32 node,\n bytes32 label,\n address owner,\n address resolver,\n uint64 ttl\n ) external;\n\n function setSubnodeOwner(\n bytes32 node,\n bytes32 label,\n address owner\n ) external returns (bytes32);\n\n function setResolver(bytes32 node, address resolver) external;\n\n function setOwner(bytes32 node, address owner) external;\n\n function setTTL(bytes32 node, uint64 ttl) external;\n\n function setApprovalForAll(address operator, bool approved) external;\n\n function owner(bytes32 node) external view returns (address);\n\n function resolver(bytes32 node) external view returns (address);\n\n function ttl(bytes32 node) external view returns (uint64);\n\n function recordExists(bytes32 node) external view returns (bool);\n\n function isApprovedForAll(\n address owner,\n address operator\n ) external view returns (bool);\n}\n" + }, + "contracts/resolvers/profiles/IABIResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IABIResolver {\n event ABIChanged(bytes32 indexed node, uint256 indexed contentType);\n\n /**\n * Returns the ABI associated with an ENS node.\n * Defined in EIP205.\n * @param node The ENS node to query\n * @param contentTypes A bitwise OR of the ABI formats accepted by the caller.\n * @return contentType The content type of the return value\n * @return data The ABI data\n */\n function ABI(\n bytes32 node,\n uint256 contentTypes\n ) external view returns (uint256, bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IAddressResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/**\n * Interface for the new (multicoin) addr function.\n */\ninterface IAddressResolver {\n event AddressChanged(\n bytes32 indexed node,\n uint256 coinType,\n bytes newAddress\n );\n\n function addr(\n bytes32 node,\n uint256 coinType\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IAddrResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\n/**\n * Interface for the legacy (ETH-only) addr function.\n */\ninterface IAddrResolver {\n event AddrChanged(bytes32 indexed node, address a);\n\n /**\n * Returns the address associated with an ENS node.\n * @param node The ENS node to query.\n * @return The associated address.\n */\n function addr(bytes32 node) external view returns (address payable);\n}\n" + }, + "contracts/resolvers/profiles/IContentHashResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IContentHashResolver {\n event ContenthashChanged(bytes32 indexed node, bytes hash);\n\n /**\n * Returns the contenthash associated with an ENS node.\n * @param node The ENS node to query.\n * @return The associated contenthash.\n */\n function contenthash(bytes32 node) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IDNSRecordResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IDNSRecordResolver {\n // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated.\n event DNSRecordChanged(\n bytes32 indexed node,\n bytes name,\n uint16 resource,\n bytes record\n );\n // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted.\n event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource);\n\n /**\n * Obtain a DNS record.\n * @param node the namehash of the node for which to fetch the record\n * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record\n * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types\n * @return the DNS record in wire format if present, otherwise empty\n */\n function dnsRecord(\n bytes32 node,\n bytes32 name,\n uint16 resource\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IDNSZoneResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IDNSZoneResolver {\n // DNSZonehashChanged is emitted whenever a given node's zone hash is updated.\n event DNSZonehashChanged(\n bytes32 indexed node,\n bytes lastzonehash,\n bytes zonehash\n );\n\n /**\n * zonehash obtains the hash for the zone.\n * @param node The ENS node to query.\n * @return The associated contenthash.\n */\n function zonehash(bytes32 node) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IExtendedResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\ninterface IExtendedResolver {\n function resolve(\n bytes memory name,\n bytes memory data\n ) external view returns (bytes memory);\n}\n" + }, + "contracts/resolvers/profiles/IInterfaceResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IInterfaceResolver {\n event InterfaceChanged(\n bytes32 indexed node,\n bytes4 indexed interfaceID,\n address implementer\n );\n\n /**\n * Returns the address of a contract that implements the specified interface for this name.\n * If an implementer has not been set for this interfaceID and name, the resolver will query\n * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that\n * contract implements EIP165 and returns `true` for the specified interfaceID, its address\n * will be returned.\n * @param node The ENS node to query.\n * @param interfaceID The EIP 165 interface ID to check for.\n * @return The address that implements this interface, or 0 if the interface is unsupported.\n */\n function interfaceImplementer(\n bytes32 node,\n bytes4 interfaceID\n ) external view returns (address);\n}\n" + }, + "contracts/resolvers/profiles/INameResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface INameResolver {\n event NameChanged(bytes32 indexed node, string name);\n\n /**\n * Returns the name associated with an ENS node, for reverse records.\n * Defined in EIP181.\n * @param node The ENS node to query.\n * @return The associated name.\n */\n function name(bytes32 node) external view returns (string memory);\n}\n" + }, + "contracts/resolvers/profiles/IPubkeyResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface IPubkeyResolver {\n event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y);\n\n /**\n * Returns the SECP256k1 public key associated with an ENS node.\n * Defined in EIP 619.\n * @param node The ENS node to query\n * @return x The X coordinate of the curve point for the public key.\n * @return y The Y coordinate of the curve point for the public key.\n */\n function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y);\n}\n" + }, + "contracts/resolvers/profiles/ITextResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\ninterface ITextResolver {\n event TextChanged(\n bytes32 indexed node,\n string indexed indexedKey,\n string key,\n string value\n );\n\n /**\n * Returns the text data associated with an ENS node and key.\n * @param node The ENS node to query.\n * @param key The text data key to query.\n * @return The associated text data.\n */\n function text(\n bytes32 node,\n string calldata key\n ) external view returns (string memory);\n}\n" + }, + "contracts/resolvers/Resolver.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity >=0.8.4;\n\nimport \"@openzeppelin/contracts/utils/introspection/IERC165.sol\";\nimport \"./profiles/IABIResolver.sol\";\nimport \"./profiles/IAddressResolver.sol\";\nimport \"./profiles/IAddrResolver.sol\";\nimport \"./profiles/IContentHashResolver.sol\";\nimport \"./profiles/IDNSRecordResolver.sol\";\nimport \"./profiles/IDNSZoneResolver.sol\";\nimport \"./profiles/IInterfaceResolver.sol\";\nimport \"./profiles/INameResolver.sol\";\nimport \"./profiles/IPubkeyResolver.sol\";\nimport \"./profiles/ITextResolver.sol\";\nimport \"./profiles/IExtendedResolver.sol\";\n\n/**\n * A generic resolver interface which includes all the functions including the ones deprecated\n */\ninterface Resolver is\n IERC165,\n IABIResolver,\n IAddressResolver,\n IAddrResolver,\n IContentHashResolver,\n IDNSRecordResolver,\n IDNSZoneResolver,\n IInterfaceResolver,\n INameResolver,\n IPubkeyResolver,\n ITextResolver,\n IExtendedResolver\n{\n /* Deprecated events */\n event ContentChanged(bytes32 indexed node, bytes32 hash);\n\n function setApprovalForAll(address, bool) external;\n\n function approve(bytes32 node, address delegate, bool approved) external;\n\n function isApprovedForAll(address account, address operator) external;\n\n function isApprovedFor(\n address owner,\n bytes32 node,\n address delegate\n ) external;\n\n function setABI(\n bytes32 node,\n uint256 contentType,\n bytes calldata data\n ) external;\n\n function setAddr(bytes32 node, address addr) external;\n\n function setAddr(bytes32 node, uint256 coinType, bytes calldata a) external;\n\n function setContenthash(bytes32 node, bytes calldata hash) external;\n\n function setDnsrr(bytes32 node, bytes calldata data) external;\n\n function setName(bytes32 node, string calldata _name) external;\n\n function setPubkey(bytes32 node, bytes32 x, bytes32 y) external;\n\n function setText(\n bytes32 node,\n string calldata key,\n string calldata value\n ) external;\n\n function setInterface(\n bytes32 node,\n bytes4 interfaceID,\n address implementer\n ) external;\n\n function multicall(\n bytes[] calldata data\n ) external returns (bytes[] memory results);\n\n function multicallWithNodeCheck(\n bytes32 nodehash,\n bytes[] calldata data\n ) external returns (bytes[] memory results);\n\n /* Deprecated functions */\n function content(bytes32 node) external view returns (bytes32);\n\n function multihash(bytes32 node) external view returns (bytes memory);\n\n function setContent(bytes32 node, bytes32 hash) external;\n\n function setMultihash(bytes32 node, bytes calldata hash) external;\n}\n" + }, + "contracts/utils/HexUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.4;\n\nlibrary HexUtils {\n /**\n * @dev Attempts to parse bytes32 from a hex string\n * @param str The string to parse\n * @param idx The offset to start parsing at\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\n */\n function hexStringToBytes32(\n bytes memory str,\n uint256 idx,\n uint256 lastIdx\n ) internal pure returns (bytes32 r, bool valid) {\n valid = true;\n assembly {\n // check that the index to read to is not past the end of the string\n if gt(lastIdx, mload(str)) {\n revert(0, 0)\n }\n\n function getHex(c) -> ascii {\n // chars 48-57: 0-9\n if and(gt(c, 47), lt(c, 58)) {\n ascii := sub(c, 48)\n leave\n }\n // chars 65-70: A-F\n if and(gt(c, 64), lt(c, 71)) {\n ascii := add(sub(c, 65), 10)\n leave\n }\n // chars 97-102: a-f\n if and(gt(c, 96), lt(c, 103)) {\n ascii := add(sub(c, 97), 10)\n leave\n }\n // invalid char\n ascii := 0xff\n }\n\n let ptr := add(str, 32)\n for {\n let i := idx\n } lt(i, lastIdx) {\n i := add(i, 2)\n } {\n let byte1 := getHex(byte(0, mload(add(ptr, i))))\n let byte2 := getHex(byte(0, mload(add(ptr, add(i, 1)))))\n // if either byte is invalid, set invalid and break loop\n if or(eq(byte1, 0xff), eq(byte2, 0xff)) {\n valid := false\n break\n }\n let combined := or(shl(4, byte1), byte2)\n r := or(shl(8, r), combined)\n }\n }\n }\n\n /**\n * @dev Attempts to parse an address from a hex string\n * @param str The string to parse\n * @param idx The offset to start parsing at\n * @param lastIdx The (exclusive) last index in `str` to consider. Use `str.length` to scan the whole string.\n */\n function hexToAddress(\n bytes memory str,\n uint256 idx,\n uint256 lastIdx\n ) internal pure returns (address, bool) {\n if (lastIdx - idx < 40) return (address(0x0), false);\n (bytes32 r, bool valid) = hexStringToBytes32(str, idx, lastIdx);\n return (address(uint160(uint256(r))), valid);\n }\n}\n" + }, + "contracts/utils/LowLevelCallUtils.sol": { + "content": "// SPDX-License-Identifier: MIT\n\npragma solidity ^0.8.13;\n\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\n\nlibrary LowLevelCallUtils {\n using Address for address;\n\n /**\n * @dev Makes a static call to the specified `target` with `data`. Return data can be fetched with\n * `returnDataSize` and `readReturnData`.\n * @param target The address to staticcall.\n * @param data The data to pass to the call.\n * @return success True if the call succeeded, or false if it reverts.\n */\n function functionStaticCall(\n address target,\n bytes memory data\n ) internal view returns (bool success) {\n return functionStaticCall(target, data, gasleft());\n }\n\n /**\n * @dev Makes a static call to the specified `target` with `data` using `gasLimit`. Return data can be fetched with\n * `returnDataSize` and `readReturnData`.\n * @param target The address to staticcall.\n * @param data The data to pass to the call.\n * @param gasLimit The gas limit to use for the call.\n * @return success True if the call succeeded, or false if it reverts.\n */\n function functionStaticCall(\n address target,\n bytes memory data,\n uint256 gasLimit\n ) internal view returns (bool success) {\n require(\n target.isContract(),\n \"LowLevelCallUtils: static call to non-contract\"\n );\n assembly {\n success := staticcall(\n gasLimit,\n target,\n add(data, 32),\n mload(data),\n 0,\n 0\n )\n }\n }\n\n /**\n * @dev Returns the size of the return data of the most recent external call.\n */\n function returnDataSize() internal pure returns (uint256 len) {\n assembly {\n len := returndatasize()\n }\n }\n\n /**\n * @dev Reads return data from the most recent external call.\n * @param offset Offset into the return data.\n * @param length Number of bytes to return.\n */\n function readReturnData(\n uint256 offset,\n uint256 length\n ) internal pure returns (bytes memory data) {\n data = new bytes(length);\n assembly {\n returndatacopy(add(data, 32), offset, length)\n }\n }\n\n /**\n * @dev Reverts with the return data from the most recent external call.\n */\n function propagateRevert() internal pure {\n assembly {\n returndatacopy(0, 0, returndatasize())\n revert(0, returndatasize())\n }\n }\n}\n" + }, + "contracts/utils/NameEncoder.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity ^0.8.13;\n\nimport {BytesUtils} from \"../wrapper/BytesUtils.sol\";\n\nlibrary NameEncoder {\n using BytesUtils for bytes;\n\n function dnsEncodeName(\n string memory name\n ) internal pure returns (bytes memory dnsName, bytes32 node) {\n uint8 labelLength = 0;\n bytes memory bytesName = bytes(name);\n uint256 length = bytesName.length;\n dnsName = new bytes(length + 2);\n node = 0;\n if (length == 0) {\n dnsName[0] = 0;\n return (dnsName, node);\n }\n\n // use unchecked to save gas since we check for an underflow\n // and we check for the length before the loop\n unchecked {\n for (uint256 i = length - 1; i >= 0; i--) {\n if (bytesName[i] == \".\") {\n dnsName[i + 1] = bytes1(labelLength);\n node = keccak256(\n abi.encodePacked(\n node,\n bytesName.keccak(i + 1, labelLength)\n )\n );\n labelLength = 0;\n } else {\n labelLength += 1;\n dnsName[i + 1] = bytesName[i];\n }\n if (i == 0) {\n break;\n }\n }\n }\n\n node = keccak256(\n abi.encodePacked(node, bytesName.keccak(0, labelLength))\n );\n\n dnsName[0] = bytes1(labelLength);\n return (dnsName, node);\n }\n}\n" + }, + "contracts/utils/UniversalResolver.sol": { + "content": "// SPDX-License-Identifier: MIT\npragma solidity >=0.8.17 <0.9.0;\n\nimport {ERC165} from \"@openzeppelin/contracts/utils/introspection/ERC165.sol\";\nimport {Ownable} from \"@openzeppelin/contracts/access/Ownable.sol\";\nimport {Address} from \"@openzeppelin/contracts/utils/Address.sol\";\nimport {LowLevelCallUtils} from \"./LowLevelCallUtils.sol\";\nimport {ENS} from \"../registry/ENS.sol\";\nimport {IExtendedResolver} from \"../resolvers/profiles/IExtendedResolver.sol\";\nimport {Resolver, INameResolver, IAddrResolver} from \"../resolvers/Resolver.sol\";\nimport {NameEncoder} from \"./NameEncoder.sol\";\nimport {BytesUtils} from \"../wrapper/BytesUtils.sol\";\nimport {HexUtils} from \"./HexUtils.sol\";\n\nerror OffchainLookup(\n address sender,\n string[] urls,\n bytes callData,\n bytes4 callbackFunction,\n bytes extraData\n);\n\nerror ResolverNotFound();\n\nerror ResolverWildcardNotSupported();\n\nerror ResolverNotContract();\n\nerror ResolverError(bytes returnData);\n\nerror HttpError(HttpErrorItem[] errors);\n\nstruct HttpErrorItem {\n uint16 status;\n string message;\n}\n\nstruct MulticallData {\n bytes name;\n bytes[] data;\n string[] gateways;\n bytes4 callbackFunction;\n bool isWildcard;\n address resolver;\n bytes metaData;\n bool[] failures;\n}\n\nstruct MulticallChecks {\n bool isCallback;\n bool hasExtendedResolver;\n}\n\nstruct OffchainLookupCallData {\n address sender;\n string[] urls;\n bytes callData;\n}\n\nstruct OffchainLookupExtraData {\n bytes4 callbackFunction;\n bytes data;\n}\n\nstruct Result {\n bool success;\n bytes returnData;\n}\n\ninterface BatchGateway {\n function query(\n OffchainLookupCallData[] memory data\n ) external returns (bool[] memory failures, bytes[] memory responses);\n}\n\n/**\n * The Universal Resolver is a contract that handles the work of resolving a name entirely onchain,\n * making it possible to make a single smart contract call to resolve an ENS name.\n */\ncontract UniversalResolver is ERC165, Ownable {\n using Address for address;\n using NameEncoder for string;\n using BytesUtils for bytes;\n using HexUtils for bytes;\n\n string[] public batchGatewayURLs;\n ENS public immutable registry;\n\n constructor(address _registry, string[] memory _urls) {\n registry = ENS(_registry);\n batchGatewayURLs = _urls;\n }\n\n function setGatewayURLs(string[] memory _urls) public onlyOwner {\n batchGatewayURLs = _urls;\n }\n\n /**\n * @dev Performs ENS name resolution for the supplied name and resolution data.\n * @param name The name to resolve, in normalised and DNS-encoded form.\n * @param data The resolution data, as specified in ENSIP-10.\n * @return The result of resolving the name.\n */\n function resolve(\n bytes calldata name,\n bytes memory data\n ) external view returns (bytes memory, address) {\n return\n _resolveSingle(\n name,\n data,\n batchGatewayURLs,\n this.resolveSingleCallback.selector,\n \"\"\n );\n }\n\n function resolve(\n bytes calldata name,\n bytes[] memory data\n ) external view returns (Result[] memory, address) {\n return resolve(name, data, batchGatewayURLs);\n }\n\n function resolve(\n bytes calldata name,\n bytes memory data,\n string[] memory gateways\n ) external view returns (bytes memory, address) {\n return\n _resolveSingle(\n name,\n data,\n gateways,\n this.resolveSingleCallback.selector,\n \"\"\n );\n }\n\n function resolve(\n bytes calldata name,\n bytes[] memory data,\n string[] memory gateways\n ) public view returns (Result[] memory, address) {\n return\n _resolve(name, data, gateways, this.resolveCallback.selector, \"\");\n }\n\n function _resolveSingle(\n bytes calldata name,\n bytes memory data,\n string[] memory gateways,\n bytes4 callbackFunction,\n bytes memory metaData\n ) public view returns (bytes memory, address) {\n bytes[] memory dataArr = new bytes[](1);\n dataArr[0] = data;\n (Result[] memory results, address resolver) = _resolve(\n name,\n dataArr,\n gateways,\n callbackFunction,\n metaData\n );\n\n Result memory result = results[0];\n\n _checkResolveSingle(result);\n\n return (result.returnData, resolver);\n }\n\n function _resolve(\n bytes calldata name,\n bytes[] memory data,\n string[] memory gateways,\n bytes4 callbackFunction,\n bytes memory metaData\n ) internal view returns (Result[] memory results, address resolverAddress) {\n (Resolver resolver, , uint256 finalOffset) = findResolver(name);\n resolverAddress = address(resolver);\n if (resolverAddress == address(0)) {\n revert ResolverNotFound();\n }\n\n if (!resolverAddress.isContract()) {\n revert ResolverNotContract();\n }\n\n bool isWildcard = finalOffset != 0;\n\n results = _multicall(\n MulticallData(\n name,\n data,\n gateways,\n callbackFunction,\n isWildcard,\n resolverAddress,\n metaData,\n new bool[](data.length)\n )\n );\n }\n\n function reverse(\n bytes calldata reverseName\n ) external view returns (string memory, address, address, address) {\n return reverse(reverseName, batchGatewayURLs);\n }\n\n /**\n * @dev Performs ENS name reverse resolution for the supplied reverse name.\n * @param reverseName The reverse name to resolve, in normalised and DNS-encoded form. e.g. b6E040C9ECAaE172a89bD561c5F73e1C48d28cd9.addr.reverse\n * @return The resolved name, the resolved address, the reverse resolver address, and the resolver address.\n */\n function reverse(\n bytes calldata reverseName,\n string[] memory gateways\n ) public view returns (string memory, address, address, address) {\n bytes memory encodedCall = abi.encodeCall(\n INameResolver.name,\n reverseName.namehash(0)\n );\n (\n bytes memory reverseResolvedData,\n address reverseResolverAddress\n ) = _resolveSingle(\n reverseName,\n encodedCall,\n gateways,\n this.reverseCallback.selector,\n \"\"\n );\n\n return\n getForwardDataFromReverse(\n reverseResolvedData,\n reverseResolverAddress,\n gateways\n );\n }\n\n function getForwardDataFromReverse(\n bytes memory resolvedReverseData,\n address reverseResolverAddress,\n string[] memory gateways\n ) internal view returns (string memory, address, address, address) {\n string memory resolvedName = abi.decode(resolvedReverseData, (string));\n\n (bytes memory encodedName, bytes32 namehash) = resolvedName\n .dnsEncodeName();\n\n bytes memory encodedCall = abi.encodeCall(IAddrResolver.addr, namehash);\n bytes memory metaData = abi.encode(\n resolvedName,\n reverseResolverAddress\n );\n (bytes memory resolvedData, address resolverAddress) = this\n ._resolveSingle(\n encodedName,\n encodedCall,\n gateways,\n this.reverseCallback.selector,\n metaData\n );\n\n address resolvedAddress = abi.decode(resolvedData, (address));\n\n return (\n resolvedName,\n resolvedAddress,\n reverseResolverAddress,\n resolverAddress\n );\n }\n\n function resolveSingleCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (bytes memory, address) {\n (Result[] memory results, address resolver, , ) = _resolveCallback(\n response,\n extraData,\n this.resolveSingleCallback.selector\n );\n Result memory result = results[0];\n\n _checkResolveSingle(result);\n\n return (result.returnData, resolver);\n }\n\n function resolveCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (Result[] memory, address) {\n (Result[] memory results, address resolver, , ) = _resolveCallback(\n response,\n extraData,\n this.resolveCallback.selector\n );\n return (results, resolver);\n }\n\n function reverseCallback(\n bytes calldata response,\n bytes calldata extraData\n ) external view returns (string memory, address, address, address) {\n (\n Result[] memory results,\n address resolverAddress,\n string[] memory gateways,\n bytes memory metaData\n ) = _resolveCallback(\n response,\n extraData,\n this.reverseCallback.selector\n );\n\n Result memory result = results[0];\n\n if (!result.success) {\n revert ResolverError(result.returnData);\n }\n\n if (metaData.length > 0) {\n (string memory resolvedName, address reverseResolverAddress) = abi\n .decode(metaData, (string, address));\n address resolvedAddress = abi.decode(result.returnData, (address));\n return (\n resolvedName,\n resolvedAddress,\n reverseResolverAddress,\n resolverAddress\n );\n }\n\n return\n getForwardDataFromReverse(\n result.returnData,\n resolverAddress,\n gateways\n );\n }\n\n function supportsInterface(\n bytes4 interfaceId\n ) public view virtual override returns (bool) {\n return\n interfaceId == type(IExtendedResolver).interfaceId ||\n super.supportsInterface(interfaceId);\n }\n\n function _resolveCallback(\n bytes calldata response,\n bytes calldata extraData,\n bytes4 callbackFunction\n )\n internal\n view\n returns (Result[] memory, address, string[] memory, bytes memory)\n {\n MulticallData memory multicallData;\n multicallData.callbackFunction = callbackFunction;\n (bool[] memory failures, bytes[] memory responses) = abi.decode(\n response,\n (bool[], bytes[])\n );\n OffchainLookupExtraData[] memory extraDatas;\n (\n multicallData.isWildcard,\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData,\n extraDatas\n ) = abi.decode(\n extraData,\n (bool, address, string[], bytes, OffchainLookupExtraData[])\n );\n require(responses.length <= extraDatas.length);\n multicallData.data = new bytes[](extraDatas.length);\n multicallData.failures = new bool[](extraDatas.length);\n uint256 offchainCount = 0;\n for (uint256 i = 0; i < extraDatas.length; i++) {\n if (extraDatas[i].callbackFunction == bytes4(0)) {\n // This call did not require an offchain lookup; use the previous input data.\n multicallData.data[i] = extraDatas[i].data;\n } else {\n if (failures[offchainCount]) {\n multicallData.failures[i] = true;\n multicallData.data[i] = responses[offchainCount];\n } else {\n multicallData.data[i] = abi.encodeWithSelector(\n extraDatas[i].callbackFunction,\n responses[offchainCount],\n extraDatas[i].data\n );\n }\n offchainCount = offchainCount + 1;\n }\n }\n\n return (\n _multicall(multicallData),\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData\n );\n }\n\n /**\n * @dev Makes a call to `target` with `data`. If the call reverts with an `OffchainLookup` error, wraps\n * the error with the data necessary to continue the request where it left off.\n * @param target The address to call.\n * @param data The data to call `target` with.\n * @return offchain Whether the call reverted with an `OffchainLookup` error.\n * @return returnData If `target` did not revert, contains the return data from the call to `target`. Otherwise, contains a `OffchainLookupCallData` struct.\n * @return extraData If `target` did not revert, is empty. Otherwise, contains a `OffchainLookupExtraData` struct.\n * @return result Whether the call succeeded.\n */\n function callWithOffchainLookupPropagation(\n address target,\n bytes memory data,\n bool isSafe\n )\n internal\n view\n returns (\n bool offchain,\n bytes memory returnData,\n OffchainLookupExtraData memory extraData,\n bool result\n )\n {\n if (isSafe) {\n result = LowLevelCallUtils.functionStaticCall(target, data);\n } else {\n result = LowLevelCallUtils.functionStaticCall(target, data, 50000);\n }\n uint256 size = LowLevelCallUtils.returnDataSize();\n\n if (result) {\n return (\n false,\n LowLevelCallUtils.readReturnData(0, size),\n extraData,\n true\n );\n }\n\n // Failure\n if (size >= 4) {\n bytes memory errorId = LowLevelCallUtils.readReturnData(0, 4);\n // Offchain lookup. Decode the revert message and create our own that nests it.\n bytes memory revertData = LowLevelCallUtils.readReturnData(\n 4,\n size - 4\n );\n if (bytes4(errorId) == OffchainLookup.selector) {\n (\n address wrappedSender,\n string[] memory wrappedUrls,\n bytes memory wrappedCallData,\n bytes4 wrappedCallbackFunction,\n bytes memory wrappedExtraData\n ) = abi.decode(\n revertData,\n (address, string[], bytes, bytes4, bytes)\n );\n if (wrappedSender == target) {\n returnData = abi.encode(\n OffchainLookupCallData(\n wrappedSender,\n wrappedUrls,\n wrappedCallData\n )\n );\n extraData = OffchainLookupExtraData(\n wrappedCallbackFunction,\n wrappedExtraData\n );\n return (true, returnData, extraData, false);\n }\n } else {\n returnData = bytes.concat(errorId, revertData);\n return (false, returnData, extraData, false);\n }\n }\n }\n\n /**\n * @dev Finds a resolver by recursively querying the registry, starting at the longest name and progressively\n * removing labels until it finds a result.\n * @param name The name to resolve, in DNS-encoded and normalised form.\n * @return resolver The Resolver responsible for this name.\n * @return namehash The namehash of the full name.\n * @return finalOffset The offset of the first label with a resolver.\n */\n function findResolver(\n bytes calldata name\n ) public view returns (Resolver, bytes32, uint256) {\n (\n address resolver,\n bytes32 namehash,\n uint256 finalOffset\n ) = findResolver(name, 0);\n return (Resolver(resolver), namehash, finalOffset);\n }\n\n function findResolver(\n bytes calldata name,\n uint256 offset\n ) internal view returns (address, bytes32, uint256) {\n uint256 labelLength = uint256(uint8(name[offset]));\n if (labelLength == 0) {\n return (address(0), bytes32(0), offset);\n }\n uint256 nextLabel = offset + labelLength + 1;\n bytes32 labelHash;\n if (\n labelLength == 66 &&\n // 0x5b == '['\n name[offset + 1] == 0x5b &&\n // 0x5d == ']'\n name[nextLabel - 1] == 0x5d\n ) {\n // Encrypted label\n (labelHash, ) = bytes(name[offset + 2:nextLabel - 1])\n .hexStringToBytes32(0, 64);\n } else {\n labelHash = keccak256(name[offset + 1:nextLabel]);\n }\n (\n address parentresolver,\n bytes32 parentnode,\n uint256 parentoffset\n ) = findResolver(name, nextLabel);\n bytes32 node = keccak256(abi.encodePacked(parentnode, labelHash));\n address resolver = registry.resolver(node);\n if (resolver != address(0)) {\n return (resolver, node, offset);\n }\n return (parentresolver, node, parentoffset);\n }\n\n function _checkInterface(\n address resolver,\n bytes4 interfaceId\n ) internal view returns (bool) {\n try\n Resolver(resolver).supportsInterface{gas: 50000}(interfaceId)\n returns (bool supported) {\n return supported;\n } catch {\n return false;\n }\n }\n\n function _checkSafetyAndItem(\n bytes memory name,\n bytes memory item,\n address resolver,\n MulticallChecks memory multicallChecks\n ) internal view returns (bool, bytes memory) {\n if (!multicallChecks.isCallback) {\n if (multicallChecks.hasExtendedResolver) {\n return (\n true,\n abi.encodeCall(IExtendedResolver.resolve, (name, item))\n );\n }\n return (_checkInterface(resolver, bytes4(item)), item);\n }\n return (true, item);\n }\n\n function _checkMulticall(\n MulticallData memory multicallData\n ) internal view returns (MulticallChecks memory) {\n bool isCallback = multicallData.name.length == 0;\n bool hasExtendedResolver = _checkInterface(\n multicallData.resolver,\n type(IExtendedResolver).interfaceId\n );\n\n if (multicallData.isWildcard && !hasExtendedResolver) {\n revert ResolverWildcardNotSupported();\n }\n\n return MulticallChecks(isCallback, hasExtendedResolver);\n }\n\n function _checkResolveSingle(Result memory result) internal pure {\n if (!result.success) {\n if (bytes4(result.returnData) == HttpError.selector) {\n (, HttpErrorItem[] memory errors) = abi.decode(\n result.returnData,\n (bytes4, HttpErrorItem[])\n );\n revert HttpError(errors);\n }\n revert ResolverError(result.returnData);\n }\n }\n\n function _multicall(\n MulticallData memory multicallData\n ) internal view returns (Result[] memory results) {\n uint256 length = multicallData.data.length;\n uint256 offchainCount = 0;\n OffchainLookupCallData[]\n memory callDatas = new OffchainLookupCallData[](length);\n OffchainLookupExtraData[]\n memory extraDatas = new OffchainLookupExtraData[](length);\n results = new Result[](length);\n MulticallChecks memory multicallChecks = _checkMulticall(multicallData);\n\n for (uint256 i = 0; i < length; i++) {\n bytes memory item = multicallData.data[i];\n bool failure = multicallData.failures[i];\n\n if (failure) {\n results[i] = Result(false, item);\n continue;\n }\n\n bool isSafe = false;\n (isSafe, item) = _checkSafetyAndItem(\n multicallData.name,\n item,\n multicallData.resolver,\n multicallChecks\n );\n\n (\n bool offchain,\n bytes memory returnData,\n OffchainLookupExtraData memory extraData,\n bool success\n ) = callWithOffchainLookupPropagation(\n multicallData.resolver,\n item,\n isSafe\n );\n\n if (offchain) {\n callDatas[offchainCount] = abi.decode(\n returnData,\n (OffchainLookupCallData)\n );\n extraDatas[i] = extraData;\n offchainCount += 1;\n continue;\n }\n\n if (success && multicallChecks.hasExtendedResolver) {\n // if this is a successful resolve() call, unwrap the result\n returnData = abi.decode(returnData, (bytes));\n }\n results[i] = Result(success, returnData);\n extraDatas[i].data = multicallData.data[i];\n }\n\n if (offchainCount == 0) {\n return results;\n }\n\n // Trim callDatas if offchain data exists\n assembly {\n mstore(callDatas, offchainCount)\n }\n\n revert OffchainLookup(\n address(this),\n multicallData.gateways,\n abi.encodeWithSelector(BatchGateway.query.selector, callDatas),\n multicallData.callbackFunction,\n abi.encode(\n multicallData.isWildcard,\n multicallData.resolver,\n multicallData.gateways,\n multicallData.metaData,\n extraDatas\n )\n );\n }\n}\n" + }, + "contracts/wrapper/BytesUtils.sol": { + "content": "//SPDX-License-Identifier: MIT\npragma solidity ~0.8.17;\n\nlibrary BytesUtils {\n /*\n * @dev Returns the keccak-256 hash of a byte range.\n * @param self The byte string to hash.\n * @param offset The position to start hashing at.\n * @param len The number of bytes to hash.\n * @return The hash of the byte range.\n */\n function keccak(\n bytes memory self,\n uint256 offset,\n uint256 len\n ) internal pure returns (bytes32 ret) {\n require(offset + len <= self.length);\n assembly {\n ret := keccak256(add(add(self, 32), offset), len)\n }\n }\n\n /**\n * @dev Returns the ENS namehash of a DNS-encoded name.\n * @param self The DNS-encoded name to hash.\n * @param offset The offset at which to start hashing.\n * @return The namehash of the name.\n */\n function namehash(\n bytes memory self,\n uint256 offset\n ) internal pure returns (bytes32) {\n (bytes32 labelhash, uint256 newOffset) = readLabel(self, offset);\n if (labelhash == bytes32(0)) {\n require(offset == self.length - 1, \"namehash: Junk at end of name\");\n return bytes32(0);\n }\n return\n keccak256(abi.encodePacked(namehash(self, newOffset), labelhash));\n }\n\n /**\n * @dev Returns the keccak-256 hash of a DNS-encoded label, and the offset to the start of the next label.\n * @param self The byte string to read a label from.\n * @param idx The index to read a label at.\n * @return labelhash The hash of the label at the specified index, or 0 if it is the last label.\n * @return newIdx The index of the start of the next label.\n */\n function readLabel(\n bytes memory self,\n uint256 idx\n ) internal pure returns (bytes32 labelhash, uint256 newIdx) {\n require(idx < self.length, \"readLabel: Index out of bounds\");\n uint256 len = uint256(uint8(self[idx]));\n if (len > 0) {\n labelhash = keccak(self, idx + 1, len);\n } else {\n labelhash = bytes32(0);\n }\n newIdx = idx + len + 1;\n }\n}\n" + } + }, + "settings": { + "optimizer": { + "enabled": true, + "runs": 1200 + }, + "outputSelection": { + "*": { + "*": [ + "abi", + "evm.bytecode", + "evm.deployedBytecode", + "evm.methodIdentifiers", + "metadata", + "devdoc", + "userdoc", + "storageLayout", + "evm.gasEstimates" + ], + "": [ + "ast" + ] + } + }, + "metadata": { + "useLiteralContent": true + } + } +} \ No newline at end of file