Overview
ETH Balance
0 ETH
Eth Value
$0.00Token Holdings
More Info
Private Name Tags
ContractCreator
Latest 25 from a total of 388,659 transactions (+19 Pending)
Latest 1 internal transaction
Advanced mode:
Parent Transaction Hash | Block | From | To | Value | ||
---|---|---|---|---|---|---|
16387114 | 480 days ago | 0.00279399 ETH |
Loading...
Loading
Contract Name:
PublicResolver
Compiler Version
v0.5.16+commit.9c3226ce
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-02-03 */ // File: @ensdomains/ens/contracts/ENS.sol pragma solidity >=0.4.24; interface ENS { // Logged when the owner of a node assigns a new owner to a subnode. event NewOwner(bytes32 indexed node, bytes32 indexed label, address owner); // Logged when the owner of a node transfers ownership to a new account. event Transfer(bytes32 indexed node, address owner); // Logged when the resolver for a node changes. event NewResolver(bytes32 indexed node, address resolver); // Logged when the TTL of a node changes event NewTTL(bytes32 indexed node, uint64 ttl); function setSubnodeOwner(bytes32 node, bytes32 label, address owner) external; function setResolver(bytes32 node, address resolver) external; function setOwner(bytes32 node, address owner) external; function setTTL(bytes32 node, uint64 ttl) external; function owner(bytes32 node) external view returns (address); function resolver(bytes32 node) external view returns (address); function ttl(bytes32 node) external view returns (uint64); } // File: contracts/ResolverBase.sol pragma solidity ^0.5.0; contract ResolverBase { bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == INTERFACE_META_ID; } function isAuthorised(bytes32 node) internal view returns(bool); modifier authorised(bytes32 node) { require(isAuthorised(node)); _; } function bytesToAddress(bytes memory b) internal pure returns(address payable a) { require(b.length == 20); assembly { a := div(mload(add(b, 32)), exp(256, 12)) } } function addressToBytes(address a) internal pure returns(bytes memory b) { b = new bytes(20); assembly { mstore(add(b, 32), mul(a, exp(256, 12))) } } } // File: contracts/profiles/ABIResolver.sol pragma solidity ^0.5.0; contract ABIResolver is ResolverBase { bytes4 constant private ABI_INTERFACE_ID = 0x2203ab56; event ABIChanged(bytes32 indexed node, uint256 indexed contentType); mapping(bytes32=>mapping(uint256=>bytes)) abis; /** * Sets the ABI associated with an ENS node. * Nodes may have one ABI of each content type. To remove an ABI, set it to * the empty string. * @param node The node to update. * @param contentType The content type of the ABI * @param data The ABI data. */ function setABI(bytes32 node, uint256 contentType, bytes calldata data) external authorised(node) { // Content types must be powers of 2 require(((contentType - 1) & contentType) == 0); abis[node][contentType] = data; emit ABIChanged(node, contentType); } /** * Returns the ABI associated with an ENS node. * Defined in EIP205. * @param node The ENS node to query * @param contentTypes A bitwise OR of the ABI formats accepted by the caller. * @return contentType The content type of the return value * @return data The ABI data */ function ABI(bytes32 node, uint256 contentTypes) external view returns (uint256, bytes memory) { mapping(uint256=>bytes) storage abiset = abis[node]; for (uint256 contentType = 1; contentType <= contentTypes; contentType <<= 1) { if ((contentType & contentTypes) != 0 && abiset[contentType].length > 0) { return (contentType, abiset[contentType]); } } return (0, bytes("")); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == ABI_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/AddrResolver.sol pragma solidity ^0.5.0; contract AddrResolver is ResolverBase { bytes4 constant private ADDR_INTERFACE_ID = 0x3b3b57de; bytes4 constant private ADDRESS_INTERFACE_ID = 0xf1cb7e06; uint constant private COIN_TYPE_ETH = 60; event AddrChanged(bytes32 indexed node, address a); event AddressChanged(bytes32 indexed node, uint coinType, bytes newAddress); mapping(bytes32=>mapping(uint=>bytes)) _addresses; /** * Sets the address associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param a The address to set. */ function setAddr(bytes32 node, address a) external authorised(node) { setAddr(node, COIN_TYPE_ETH, addressToBytes(a)); } /** * Returns the address associated with an ENS node. * @param node The ENS node to query. * @return The associated address. */ function addr(bytes32 node) public view returns (address payable) { bytes memory a = addr(node, COIN_TYPE_ETH); if(a.length == 0) { return address(0); } return bytesToAddress(a); } function setAddr(bytes32 node, uint coinType, bytes memory a) public authorised(node) { emit AddressChanged(node, coinType, a); if(coinType == COIN_TYPE_ETH) { emit AddrChanged(node, bytesToAddress(a)); } _addresses[node][coinType] = a; } function addr(bytes32 node, uint coinType) public view returns(bytes memory) { return _addresses[node][coinType]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == ADDR_INTERFACE_ID || interfaceID == ADDRESS_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/ContentHashResolver.sol pragma solidity ^0.5.0; contract ContentHashResolver is ResolverBase { bytes4 constant private CONTENT_HASH_INTERFACE_ID = 0xbc1c58d1; event ContenthashChanged(bytes32 indexed node, bytes hash); mapping(bytes32=>bytes) hashes; /** * Sets the contenthash associated with an ENS node. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param hash The contenthash to set */ function setContenthash(bytes32 node, bytes calldata hash) external authorised(node) { hashes[node] = hash; emit ContenthashChanged(node, hash); } /** * Returns the contenthash associated with an ENS node. * @param node The ENS node to query. * @return The associated contenthash. */ function contenthash(bytes32 node) external view returns (bytes memory) { return hashes[node]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == CONTENT_HASH_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: @ensdomains/dnssec-oracle/contracts/BytesUtils.sol pragma solidity >0.4.23; library BytesUtils { /* * @dev Returns the keccak-256 hash of a byte range. * @param self The byte string to hash. * @param offset The position to start hashing at. * @param len The number of bytes to hash. * @return The hash of the byte range. */ function keccak(bytes memory self, uint offset, uint len) internal pure returns (bytes32 ret) { require(offset + len <= self.length); assembly { ret := keccak256(add(add(self, 32), offset), len) } } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. * @param self The first bytes to compare. * @param other The second bytes to compare. * @return The result of the comparison. */ function compare(bytes memory self, bytes memory other) internal pure returns (int) { return compare(self, 0, self.length, other, 0, other.length); } /* * @dev Returns a positive number if `other` comes lexicographically after * `self`, a negative number if it comes before, or zero if the * contents of the two bytes are equal. Comparison is done per-rune, * on unicode codepoints. * @param self The first bytes to compare. * @param offset The offset of self. * @param len The length of self. * @param other The second bytes to compare. * @param otheroffset The offset of the other string. * @param otherlen The length of the other string. * @return The result of the comparison. */ function compare(bytes memory self, uint offset, uint len, bytes memory other, uint otheroffset, uint otherlen) internal pure returns (int) { uint shortest = len; if (otherlen < len) shortest = otherlen; uint selfptr; uint otherptr; assembly { selfptr := add(self, add(offset, 32)) otherptr := add(other, add(otheroffset, 32)) } for (uint idx = 0; idx < shortest; idx += 32) { uint a; uint b; assembly { a := mload(selfptr) b := mload(otherptr) } if (a != b) { // Mask out irrelevant bytes and check again uint mask; if (shortest > 32) { mask = uint256(- 1); // aka 0xffffff.... } else { mask = ~(2 ** (8 * (32 - shortest + idx)) - 1); } uint diff = (a & mask) - (b & mask); if (diff != 0) return int(diff); } selfptr += 32; otherptr += 32; } return int(len) - int(otherlen); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @param len The number of bytes to compare * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset, uint len) internal pure returns (bool) { return keccak(self, offset, len) == keccak(other, otherOffset, len); } /* * @dev Returns true if the two byte ranges are equal with offsets. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @param otherOffset The offset into the second byte range. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other, uint otherOffset) internal pure returns (bool) { return keccak(self, offset, self.length - offset) == keccak(other, otherOffset, other.length - otherOffset); } /* * @dev Compares a range of 'self' to all of 'other' and returns True iff * they are equal. * @param self The first byte range to compare. * @param offset The offset into the first byte range. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, uint offset, bytes memory other) internal pure returns (bool) { return self.length >= offset + other.length && equals(self, offset, other, 0, other.length); } /* * @dev Returns true if the two byte ranges are equal. * @param self The first byte range to compare. * @param other The second byte range to compare. * @return True if the byte ranges are equal, false otherwise. */ function equals(bytes memory self, bytes memory other) internal pure returns(bool) { return self.length == other.length && equals(self, 0, other, 0, self.length); } /* * @dev Returns the 8-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 8 bits of the string, interpreted as an integer. */ function readUint8(bytes memory self, uint idx) internal pure returns (uint8 ret) { return uint8(self[idx]); } /* * @dev Returns the 16-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 16 bits of the string, interpreted as an integer. */ function readUint16(bytes memory self, uint idx) internal pure returns (uint16 ret) { require(idx + 2 <= self.length); assembly { ret := and(mload(add(add(self, 2), idx)), 0xFFFF) } } /* * @dev Returns the 32-bit number at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bits of the string, interpreted as an integer. */ function readUint32(bytes memory self, uint idx) internal pure returns (uint32 ret) { require(idx + 4 <= self.length); assembly { ret := and(mload(add(add(self, 4), idx)), 0xFFFFFFFF) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes32(bytes memory self, uint idx) internal pure returns (bytes32 ret) { require(idx + 32 <= self.length); assembly { ret := mload(add(add(self, 32), idx)) } } /* * @dev Returns the 32 byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes * @return The specified 32 bytes of the string. */ function readBytes20(bytes memory self, uint idx) internal pure returns (bytes20 ret) { require(idx + 20 <= self.length); assembly { ret := and(mload(add(add(self, 32), idx)), 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF000000000000000000000000) } } /* * @dev Returns the n byte value at the specified index of self. * @param self The byte string. * @param idx The index into the bytes. * @param len The number of bytes. * @return The specified 32 bytes of the string. */ function readBytesN(bytes memory self, uint idx, uint len) internal pure returns (bytes32 ret) { require(len <= 32); require(idx + len <= self.length); assembly { let mask := not(sub(exp(256, sub(32, len)), 1)) ret := and(mload(add(add(self, 32), idx)), mask) } } function memcpy(uint dest, uint src, uint len) private pure { // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } } /* * @dev Copies a substring into a new byte string. * @param self The byte string to copy from. * @param offset The offset to start copying at. * @param len The number of bytes to copy. */ function substring(bytes memory self, uint offset, uint len) internal pure returns(bytes memory) { require(offset + len <= self.length); bytes memory ret = new bytes(len); uint dest; uint src; assembly { dest := add(ret, 32) src := add(add(self, 32), offset) } memcpy(dest, src, len); return ret; } // Maps characters from 0x30 to 0x7A to their base32 values. // 0xFF represents invalid characters in that range. bytes constant base32HexTable = hex'00010203040506070809FFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1FFFFFFFFFFFFFFFFFFFFF0A0B0C0D0E0F101112131415161718191A1B1C1D1E1F'; /** * @dev Decodes unpadded base32 data of up to one word in length. * @param self The data to decode. * @param off Offset into the string to start at. * @param len Number of characters to decode. * @return The decoded data, left aligned. */ function base32HexDecodeWord(bytes memory self, uint off, uint len) internal pure returns(bytes32) { require(len <= 52); uint ret = 0; uint8 decoded; for(uint i = 0; i < len; i++) { bytes1 char = self[off + i]; require(char >= 0x30 && char <= 0x7A); decoded = uint8(base32HexTable[uint(uint8(char)) - 0x30]); require(decoded <= 0x20); if(i == len - 1) { break; } ret = (ret << 5) | decoded; } uint bitlen = len * 5; if(len % 8 == 0) { // Multiple of 8 characters, no padding ret = (ret << 5) | decoded; } else if(len % 8 == 2) { // Two extra characters - 1 byte ret = (ret << 3) | (decoded >> 2); bitlen -= 2; } else if(len % 8 == 4) { // Four extra characters - 2 bytes ret = (ret << 1) | (decoded >> 4); bitlen -= 4; } else if(len % 8 == 5) { // Five extra characters - 3 bytes ret = (ret << 4) | (decoded >> 1); bitlen -= 1; } else if(len % 8 == 7) { // Seven extra characters - 4 bytes ret = (ret << 2) | (decoded >> 3); bitlen -= 3; } else { revert(); } return bytes32(ret << (256 - bitlen)); } } // File: @ensdomains/buffer/contracts/Buffer.sol pragma solidity >0.4.18; /** * @dev A library for working with mutable byte buffers in Solidity. * * Byte buffers are mutable and expandable, and provide a variety of primitives * for writing to them. At any time you can fetch a bytes object containing the * current contents of the buffer. The bytes object should not be stored between * operations, as it may change due to resizing of the buffer. */ library Buffer { /** * @dev Represents a mutable buffer. Buffers have a current value (buf) and * a capacity. The capacity may be longer than the current value, in * which case it can be extended without the need to allocate more memory. */ struct buffer { bytes buf; uint capacity; } /** * @dev Initializes a buffer with an initial capacity. * @param buf The buffer to initialize. * @param capacity The number of bytes of space to allocate the buffer. * @return The buffer, for chaining. */ function init(buffer memory buf, uint capacity) internal pure returns(buffer memory) { if (capacity % 32 != 0) { capacity += 32 - (capacity % 32); } // Allocate space for the buffer data buf.capacity = capacity; assembly { let ptr := mload(0x40) mstore(buf, ptr) mstore(ptr, 0) mstore(0x40, add(32, add(ptr, capacity))) } return buf; } /** * @dev Initializes a new buffer from an existing bytes object. * Changes to the buffer may mutate the original value. * @param b The bytes object to initialize the buffer with. * @return A new buffer. */ function fromBytes(bytes memory b) internal pure returns(buffer memory) { buffer memory buf; buf.buf = b; buf.capacity = b.length; return buf; } function resize(buffer memory buf, uint capacity) private pure { bytes memory oldbuf = buf.buf; init(buf, capacity); append(buf, oldbuf); } function max(uint a, uint b) private pure returns(uint) { if (a > b) { return a; } return b; } /** * @dev Sets buffer length to 0. * @param buf The buffer to truncate. * @return The original buffer, for chaining.. */ function truncate(buffer memory buf) internal pure returns (buffer memory) { assembly { let bufptr := mload(buf) mstore(bufptr, 0) } return buf; } /** * @dev Writes a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The start offset to write to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes memory data, uint len) internal pure returns(buffer memory) { require(len <= data.length); if (off + len > buf.capacity) { resize(buf, max(buf.capacity, len + off) * 2); } uint dest; uint src; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Start address = buffer address + offset + sizeof(buffer length) dest := add(add(bufptr, 32), off) // Update buffer length if we're extending it if gt(add(len, off), buflen) { mstore(bufptr, add(len, off)) } src := add(data, 32) } // Copy word-length chunks while possible for (; len >= 32; len -= 32) { assembly { mstore(dest, mload(src)) } dest += 32; src += 32; } // Copy remaining bytes uint mask = 256 ** (32 - len) - 1; assembly { let srcpart := and(mload(src), not(mask)) let destpart := and(mload(dest), mask) mstore(dest, or(destpart, srcpart)) } return buf; } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @param len The number of bytes to copy. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data, uint len) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, len); } /** * @dev Appends a byte string to a buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function append(buffer memory buf, bytes memory data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, data.length); } /** * @dev Writes a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write the byte at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeUint8(buffer memory buf, uint off, uint8 data) internal pure returns(buffer memory) { if (off >= buf.capacity) { resize(buf, buf.capacity * 2); } assembly { // Memory address of the buffer data let bufptr := mload(buf) // Length of existing buffer data let buflen := mload(bufptr) // Address = buffer address + sizeof(buffer length) + off let dest := add(add(bufptr, off), 32) mstore8(dest, data) // Update buffer length if we extended it if eq(off, buflen) { mstore(bufptr, add(buflen, 1)) } } return buf; } /** * @dev Appends a byte to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendUint8(buffer memory buf, uint8 data) internal pure returns(buffer memory) { return writeUint8(buf, buf.buf.length, data); } /** * @dev Writes up to 32 bytes to the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (left-aligned). * @return The original buffer, for chaining. */ function write(buffer memory buf, uint off, bytes32 data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; // Right-align data data = data >> (8 * (32 - len)); assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + sizeof(buffer length) + off + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Writes a bytes20 to the buffer. Resizes if doing so would exceed the * capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @return The original buffer, for chaining. */ function writeBytes20(buffer memory buf, uint off, bytes20 data) internal pure returns (buffer memory) { return write(buf, off, bytes32(data), 20); } /** * @dev Appends a bytes20 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chhaining. */ function appendBytes20(buffer memory buf, bytes20 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, bytes32(data), 20); } /** * @dev Appends a bytes32 to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer, for chaining. */ function appendBytes32(buffer memory buf, bytes32 data) internal pure returns (buffer memory) { return write(buf, buf.buf.length, data, 32); } /** * @dev Writes an integer to the buffer. Resizes if doing so would exceed * the capacity of the buffer. * @param buf The buffer to append to. * @param off The offset to write at. * @param data The data to append. * @param len The number of bytes to write (right-aligned). * @return The original buffer, for chaining. */ function writeInt(buffer memory buf, uint off, uint data, uint len) private pure returns(buffer memory) { if (len + off > buf.capacity) { resize(buf, (len + off) * 2); } uint mask = 256 ** len - 1; assembly { // Memory address of the buffer data let bufptr := mload(buf) // Address = buffer address + off + sizeof(buffer length) + len let dest := add(add(bufptr, off), len) mstore(dest, or(and(mload(dest), not(mask)), data)) // Update buffer length if we extended it if gt(add(off, len), mload(bufptr)) { mstore(bufptr, add(off, len)) } } return buf; } /** * @dev Appends a byte to the end of the buffer. Resizes if doing so would * exceed the capacity of the buffer. * @param buf The buffer to append to. * @param data The data to append. * @return The original buffer. */ function appendInt(buffer memory buf, uint data, uint len) internal pure returns(buffer memory) { return writeInt(buf, buf.buf.length, data, len); } } // File: @ensdomains/dnssec-oracle/contracts/RRUtils.sol pragma solidity >0.4.23; /** * @dev RRUtils is a library that provides utilities for parsing DNS resource records. */ library RRUtils { using BytesUtils for *; using Buffer for *; /** * @dev Returns the number of bytes in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The length of the DNS name at 'offset', in bytes. */ function nameLength(bytes memory self, uint offset) internal pure returns(uint) { uint idx = offset; while (true) { assert(idx < self.length); uint labelLen = self.readUint8(idx); idx += labelLen + 1; if (labelLen == 0) { break; } } return idx - offset; } /** * @dev Returns a DNS format name at the specified offset of self. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The name. */ function readName(bytes memory self, uint offset) internal pure returns(bytes memory ret) { uint len = nameLength(self, offset); return self.substring(offset, len); } /** * @dev Returns the number of labels in the DNS name at 'offset' in 'self'. * @param self The byte array to read a name from. * @param offset The offset to start reading at. * @return The number of labels in the DNS name at 'offset', in bytes. */ function labelCount(bytes memory self, uint offset) internal pure returns(uint) { uint count = 0; while (true) { assert(offset < self.length); uint labelLen = self.readUint8(offset); offset += labelLen + 1; if (labelLen == 0) { break; } count += 1; } return count; } /** * @dev An iterator over resource records. */ struct RRIterator { bytes data; uint offset; uint16 dnstype; uint16 class; uint32 ttl; uint rdataOffset; uint nextOffset; } /** * @dev Begins iterating over resource records. * @param self The byte string to read from. * @param offset The offset to start reading at. * @return An iterator object. */ function iterateRRs(bytes memory self, uint offset) internal pure returns (RRIterator memory ret) { ret.data = self; ret.nextOffset = offset; next(ret); } /** * @dev Returns true iff there are more RRs to iterate. * @param iter The iterator to check. * @return True iff the iterator has finished. */ function done(RRIterator memory iter) internal pure returns(bool) { return iter.offset >= iter.data.length; } /** * @dev Moves the iterator to the next resource record. * @param iter The iterator to advance. */ function next(RRIterator memory iter) internal pure { iter.offset = iter.nextOffset; if (iter.offset >= iter.data.length) { return; } // Skip the name uint off = iter.offset + nameLength(iter.data, iter.offset); // Read type, class, and ttl iter.dnstype = iter.data.readUint16(off); off += 2; iter.class = iter.data.readUint16(off); off += 2; iter.ttl = iter.data.readUint32(off); off += 4; // Read the rdata uint rdataLength = iter.data.readUint16(off); off += 2; iter.rdataOffset = off; iter.nextOffset = off + rdataLength; } /** * @dev Returns the name of the current record. * @param iter The iterator. * @return A new bytes object containing the owner name from the RR. */ function name(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.offset, nameLength(iter.data, iter.offset)); } /** * @dev Returns the rdata portion of the current record. * @param iter The iterator. * @return A new bytes object containing the RR's RDATA. */ function rdata(RRIterator memory iter) internal pure returns(bytes memory) { return iter.data.substring(iter.rdataOffset, iter.nextOffset - iter.rdataOffset); } /** * @dev Checks if a given RR type exists in a type bitmap. * @param self The byte string to read the type bitmap from. * @param offset The offset to start reading at. * @param rrtype The RR type to check for. * @return True if the type is found in the bitmap, false otherwise. */ function checkTypeBitmap(bytes memory self, uint offset, uint16 rrtype) internal pure returns (bool) { uint8 typeWindow = uint8(rrtype >> 8); uint8 windowByte = uint8((rrtype & 0xff) / 8); uint8 windowBitmask = uint8(uint8(1) << (uint8(7) - uint8(rrtype & 0x7))); for (uint off = offset; off < self.length;) { uint8 window = self.readUint8(off); uint8 len = self.readUint8(off + 1); if (typeWindow < window) { // We've gone past our window; it's not here. return false; } else if (typeWindow == window) { // Check this type bitmap if (len * 8 <= windowByte) { // Our type is past the end of the bitmap return false; } return (self.readUint8(off + windowByte + 2) & windowBitmask) != 0; } else { // Skip this type bitmap off += len + 2; } } return false; } function compareNames(bytes memory self, bytes memory other) internal pure returns (int) { if (self.equals(other)) { return 0; } uint off; uint otheroff; uint prevoff; uint otherprevoff; uint counts = labelCount(self, 0); uint othercounts = labelCount(other, 0); // Keep removing labels from the front of the name until both names are equal length while (counts > othercounts) { prevoff = off; off = progress(self, off); counts--; } while (othercounts > counts) { otherprevoff = otheroff; otheroff = progress(other, otheroff); othercounts--; } // Compare the last nonequal labels to each other while (counts > 0 && !self.equals(off, other, otheroff)) { prevoff = off; off = progress(self, off); otherprevoff = otheroff; otheroff = progress(other, otheroff); counts -= 1; } if (off == 0) { return -1; } if(otheroff == 0) { return 1; } return self.compare(prevoff + 1, self.readUint8(prevoff), other, otherprevoff + 1, other.readUint8(otherprevoff)); } function progress(bytes memory body, uint off) internal pure returns(uint) { return off + 1 + body.readUint8(off); } } // File: contracts/profiles/DNSResolver.sol pragma solidity ^0.5.0; contract DNSResolver is ResolverBase { using RRUtils for *; using BytesUtils for bytes; bytes4 constant private DNS_RECORD_INTERFACE_ID = 0xa8fa5682; // DNSRecordChanged is emitted whenever a given node/name/resource's RRSET is updated. event DNSRecordChanged(bytes32 indexed node, bytes name, uint16 resource, bytes record); // DNSRecordDeleted is emitted whenever a given node/name/resource's RRSET is deleted. event DNSRecordDeleted(bytes32 indexed node, bytes name, uint16 resource); // DNSZoneCleared is emitted whenever a given node's zone information is cleared. event DNSZoneCleared(bytes32 indexed node); // Version the mapping for each zone. This allows users who have lost // track of their entries to effectively delete an entire zone by bumping // the version number. // node => version mapping(bytes32=>uint256) private versions; // The records themselves. Stored as binary RRSETs // node => version => name => resource => data mapping(bytes32=>mapping(uint256=>mapping(bytes32=>mapping(uint16=>bytes)))) private records; // Count of number of entries for a given name. Required for DNS resolvers // when resolving wildcards. // node => version => name => number of records mapping(bytes32=>mapping(uint256=>mapping(bytes32=>uint16))) private nameEntriesCount; /** * Set one or more DNS records. Records are supplied in wire-format. * Records with the same node/name/resource must be supplied one after the * other to ensure the data is updated correctly. For example, if the data * was supplied: * a.example.com IN A 1.2.3.4 * a.example.com IN A 5.6.7.8 * www.example.com IN CNAME a.example.com. * then this would store the two A records for a.example.com correctly as a * single RRSET, however if the data was supplied: * a.example.com IN A 1.2.3.4 * www.example.com IN CNAME a.example.com. * a.example.com IN A 5.6.7.8 * then this would store the first A record, the CNAME, then the second A * record which would overwrite the first. * * @param node the namehash of the node for which to set the records * @param data the DNS wire format records to set */ function setDNSRecords(bytes32 node, bytes calldata data) external authorised(node) { uint16 resource = 0; uint256 offset = 0; bytes memory name; bytes memory value; bytes32 nameHash; // Iterate over the data to add the resource records for (RRUtils.RRIterator memory iter = data.iterateRRs(0); !iter.done(); iter.next()) { if (resource == 0) { resource = iter.dnstype; name = iter.name(); nameHash = keccak256(abi.encodePacked(name)); value = bytes(iter.rdata()); } else { bytes memory newName = iter.name(); if (resource != iter.dnstype || !name.equals(newName)) { setDNSRRSet(node, name, resource, data, offset, iter.offset - offset, value.length == 0); resource = iter.dnstype; offset = iter.offset; name = newName; nameHash = keccak256(name); value = bytes(iter.rdata()); } } } if (name.length > 0) { setDNSRRSet(node, name, resource, data, offset, data.length - offset, value.length == 0); } } /** * Obtain a DNS record. * @param node the namehash of the node for which to fetch the record * @param name the keccak-256 hash of the fully-qualified name for which to fetch the record * @param resource the ID of the resource as per https://en.wikipedia.org/wiki/List_of_DNS_record_types * @return the DNS record in wire format if present, otherwise empty */ function dnsRecord(bytes32 node, bytes32 name, uint16 resource) public view returns (bytes memory) { return records[node][versions[node]][name][resource]; } /** * Check if a given node has records. * @param node the namehash of the node for which to check the records * @param name the namehash of the node for which to check the records */ function hasDNSRecords(bytes32 node, bytes32 name) public view returns (bool) { return (nameEntriesCount[node][versions[node]][name] != 0); } /** * Clear all information for a DNS zone. * @param node the namehash of the node for which to clear the zone */ function clearDNSZone(bytes32 node) public authorised(node) { versions[node]++; emit DNSZoneCleared(node); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == DNS_RECORD_INTERFACE_ID || super.supportsInterface(interfaceID); } function setDNSRRSet( bytes32 node, bytes memory name, uint16 resource, bytes memory data, uint256 offset, uint256 size, bool deleteRecord) private { uint256 version = versions[node]; bytes32 nameHash = keccak256(name); bytes memory rrData = data.substring(offset, size); if (deleteRecord) { if (records[node][version][nameHash][resource].length != 0) { nameEntriesCount[node][version][nameHash]--; } delete(records[node][version][nameHash][resource]); emit DNSRecordDeleted(node, name, resource); } else { if (records[node][version][nameHash][resource].length == 0) { nameEntriesCount[node][version][nameHash]++; } records[node][version][nameHash][resource] = rrData; emit DNSRecordChanged(node, name, resource, rrData); } } } // File: contracts/profiles/InterfaceResolver.sol pragma solidity ^0.5.0; contract InterfaceResolver is ResolverBase, AddrResolver { bytes4 constant private INTERFACE_INTERFACE_ID = bytes4(keccak256("interfaceImplementer(bytes32,bytes4)")); bytes4 private constant INTERFACE_META_ID = 0x01ffc9a7; event InterfaceChanged(bytes32 indexed node, bytes4 indexed interfaceID, address implementer); mapping(bytes32=>mapping(bytes4=>address)) interfaces; /** * Sets an interface associated with a name. * Setting the address to 0 restores the default behaviour of querying the contract at `addr()` for interface support. * @param node The node to update. * @param interfaceID The EIP 168 interface ID. * @param implementer The address of a contract that implements this interface for this node. */ function setInterface(bytes32 node, bytes4 interfaceID, address implementer) external authorised(node) { interfaces[node][interfaceID] = implementer; emit InterfaceChanged(node, interfaceID, implementer); } /** * Returns the address of a contract that implements the specified interface for this name. * If an implementer has not been set for this interfaceID and name, the resolver will query * the contract at `addr()`. If `addr()` is set, a contract exists at that address, and that * contract implements EIP168 and returns `true` for the specified interfaceID, its address * will be returned. * @param node The ENS node to query. * @param interfaceID The EIP 168 interface ID to check for. * @return The address that implements this interface, or 0 if the interface is unsupported. */ function interfaceImplementer(bytes32 node, bytes4 interfaceID) external view returns (address) { address implementer = interfaces[node][interfaceID]; if(implementer != address(0)) { return implementer; } address a = addr(node); if(a == address(0)) { return address(0); } (bool success, bytes memory returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", INTERFACE_META_ID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // EIP 168 not supported by target return address(0); } (success, returnData) = a.staticcall(abi.encodeWithSignature("supportsInterface(bytes4)", interfaceID)); if(!success || returnData.length < 32 || returnData[31] == 0) { // Specified interface not supported by target return address(0); } return a; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == INTERFACE_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/NameResolver.sol pragma solidity ^0.5.0; contract NameResolver is ResolverBase { bytes4 constant private NAME_INTERFACE_ID = 0x691f3431; event NameChanged(bytes32 indexed node, string name); mapping(bytes32=>string) names; /** * Sets the name associated with an ENS node, for reverse records. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param name The name to set. */ function setName(bytes32 node, string calldata name) external authorised(node) { names[node] = name; emit NameChanged(node, name); } /** * Returns the name associated with an ENS node, for reverse records. * Defined in EIP181. * @param node The ENS node to query. * @return The associated name. */ function name(bytes32 node) external view returns (string memory) { return names[node]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == NAME_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/PubkeyResolver.sol pragma solidity ^0.5.0; contract PubkeyResolver is ResolverBase { bytes4 constant private PUBKEY_INTERFACE_ID = 0xc8690233; event PubkeyChanged(bytes32 indexed node, bytes32 x, bytes32 y); struct PublicKey { bytes32 x; bytes32 y; } mapping(bytes32=>PublicKey) pubkeys; /** * Sets the SECP256k1 public key associated with an ENS node. * @param node The ENS node to query * @param x the X coordinate of the curve point for the public key. * @param y the Y coordinate of the curve point for the public key. */ function setPubkey(bytes32 node, bytes32 x, bytes32 y) external authorised(node) { pubkeys[node] = PublicKey(x, y); emit PubkeyChanged(node, x, y); } /** * Returns the SECP256k1 public key associated with an ENS node. * Defined in EIP 619. * @param node The ENS node to query * @return x, y the X and Y coordinates of the curve point for the public key. */ function pubkey(bytes32 node) external view returns (bytes32 x, bytes32 y) { return (pubkeys[node].x, pubkeys[node].y); } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == PUBKEY_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/profiles/TextResolver.sol pragma solidity ^0.5.0; contract TextResolver is ResolverBase { bytes4 constant private TEXT_INTERFACE_ID = 0x59d1d43c; event TextChanged(bytes32 indexed node, string indexed indexedKey, string key); mapping(bytes32=>mapping(string=>string)) texts; /** * Sets the text data associated with an ENS node and key. * May only be called by the owner of that node in the ENS registry. * @param node The node to update. * @param key The key to set. * @param value The text data value to set. */ function setText(bytes32 node, string calldata key, string calldata value) external authorised(node) { texts[node][key] = value; emit TextChanged(node, key, key); } /** * Returns the text data associated with an ENS node and key. * @param node The ENS node to query. * @param key The text data key to query. * @return The associated text data. */ function text(bytes32 node, string calldata key) external view returns (string memory) { return texts[node][key]; } function supportsInterface(bytes4 interfaceID) public pure returns(bool) { return interfaceID == TEXT_INTERFACE_ID || super.supportsInterface(interfaceID); } } // File: contracts/PublicResolver.sol pragma solidity ^0.5.0; pragma experimental ABIEncoderV2; /** * A simple resolver anyone can use; only allows the owner of a node to set its * address. */ contract PublicResolver is ABIResolver, AddrResolver, ContentHashResolver, DNSResolver, InterfaceResolver, NameResolver, PubkeyResolver, TextResolver { ENS ens; /** * A mapping of authorisations. An address that is authorised for a name * may make any changes to the name that the owner could, but may not update * the set of authorisations. * (node, owner, caller) => isAuthorised */ mapping(bytes32=>mapping(address=>mapping(address=>bool))) public authorisations; event AuthorisationChanged(bytes32 indexed node, address indexed owner, address indexed target, bool isAuthorised); constructor(ENS _ens) public { ens = _ens; } /** * @dev Sets or clears an authorisation. * Authorisations are specific to the caller. Any account can set an authorisation * for any name, but the authorisation that is checked will be that of the * current owner of a name. Thus, transferring a name effectively clears any * existing authorisations, and new authorisations can be set in advance of * an ownership transfer if desired. * * @param node The name to change the authorisation on. * @param target The address that is to be authorised or deauthorised. * @param isAuthorised True if the address should be authorised, or false if it should be deauthorised. */ function setAuthorisation(bytes32 node, address target, bool isAuthorised) external { authorisations[node][msg.sender][target] = isAuthorised; emit AuthorisationChanged(node, msg.sender, target, isAuthorised); } function isAuthorised(bytes32 node) internal view returns(bool) { address owner = ens.owner(node); return owner == msg.sender || authorisations[node][owner][msg.sender]; } function multicall(bytes[] calldata data) external returns(bytes[] memory results) { results = new bytes[](data.length); for(uint i = 0; i < data.length; i++) { (bool success, bytes memory result) = address(this).delegatecall(data[i]); require(success); results[i] = result; } return results; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"contract ENS","name":"_ens","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"uint256","name":"contentType","type":"uint256"}],"name":"ABIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"address","name":"a","type":"address"}],"name":"AddrChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"uint256","name":"coinType","type":"uint256"},{"indexed":false,"internalType":"bytes","name":"newAddress","type":"bytes"}],"name":"AddressChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"target","type":"address"},{"indexed":false,"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"AuthorisationChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"hash","type":"bytes"}],"name":"ContenthashChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"},{"indexed":false,"internalType":"bytes","name":"record","type":"bytes"}],"name":"DNSRecordChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes","name":"name","type":"bytes"},{"indexed":false,"internalType":"uint16","name":"resource","type":"uint16"}],"name":"DNSRecordDeleted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"DNSZoneCleared","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"indexed":false,"internalType":"address","name":"implementer","type":"address"}],"name":"InterfaceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"NameChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"x","type":"bytes32"},{"indexed":false,"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"PubkeyChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"node","type":"bytes32"},{"indexed":true,"internalType":"string","name":"indexedKey","type":"string"},{"indexed":false,"internalType":"string","name":"key","type":"string"}],"name":"TextChanged","type":"event"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentTypes","type":"uint256"}],"name":"ABI","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"addr","outputs":[{"internalType":"address payable","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"}],"name":"addr","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"},{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"authorisations","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"clearDNSZone","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"contenthash","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"},{"internalType":"uint16","name":"resource","type":"uint16"}],"name":"dnsRecord","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"name","type":"bytes32"}],"name":"hasDNSRecords","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"interfaceImplementer","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes[]","name":"data","type":"bytes[]"}],"name":"multicall","outputs":[{"internalType":"bytes[]","name":"results","type":"bytes[]"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"}],"name":"pubkey","outputs":[{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"contentType","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setABI","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"uint256","name":"coinType","type":"uint256"},{"internalType":"bytes","name":"a","type":"bytes"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"a","type":"address"}],"name":"setAddr","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"isAuthorised","type":"bool"}],"name":"setAuthorisation","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"hash","type":"bytes"}],"name":"setContenthash","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"setDNSRecords","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes4","name":"interfaceID","type":"bytes4"},{"internalType":"address","name":"implementer","type":"address"}],"name":"setInterface","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"name","type":"string"}],"name":"setName","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"bytes32","name":"x","type":"bytes32"},{"internalType":"bytes32","name":"y","type":"bytes32"}],"name":"setPubkey","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"},{"internalType":"string","name":"value","type":"string"}],"name":"setText","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes4","name":"interfaceID","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"pure","type":"function"},{"constant":true,"inputs":[{"internalType":"bytes32","name":"node","type":"bytes32"},{"internalType":"string","name":"key","type":"string"}],"name":"text","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200387d3803806200387d833981810160405262000037919081019062000096565b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000124565b60008151905062000090816200010a565b92915050565b600060208284031215620000a957600080fd5b6000620000b9848285016200007f565b91505092915050565b6000620000cf82620000ea565b9050919050565b6000620000e382620000c2565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200011581620000d6565b81146200012157600080fd5b50565b61374980620001346000396000f3fe608060405234801561001057600080fd5b50600436106101585760003560e01c8063691f3431116100c3578063bc1c58d11161007c578063bc1c58d11461040a578063c86902331461043a578063d5fa2b001461046b578063e59d895d14610487578063f1cb7e06146104a3578063f86bc879146104d357610158565b8063691f34311461032657806377372213146103565780638b95dd7114610372578063a8fa56821461038e578063ac9650d8146103be578063ad5780af146103ee57610158565b8063304e6ade11610115578063304e6ade146102425780633b3b57de1461025e5780633e9ce7941461028e5780634cbf6ba4146102aa57806359d1d43c146102da578063623195b01461030a57610158565b806301ffc9a71461015d5780630af179d71461018d57806310f13a8c146101a9578063124a319c146101c55780632203ab56146101f557806329cd62ea14610226575b600080fd5b61017760048036036101729190810190612ecd565b610503565b60405161018491906132ae565b60405180910390f35b6101a760048036036101a29190810190612c85565b610564565b005b6101c360048036036101be9190810190612d35565b610792565b005b6101df60048036036101da9190810190612bfa565b610840565b6040516101ec919061323b565b60405180910390f35b61020f600480360361020a9190810190612dbe565b610c2b565b60405161021d929190613429565b60405180910390f35b610240600480360361023b9190810190612b5c565b610d7a565b005b61025c60048036036102579190810190612c85565b610e0c565b005b61027860048036036102739190810190612a1d565b610e82565b6040516102859190613271565b60405180910390f35b6102a860048036036102a39190810190612ad1565b610eb9565b005b6102c460048036036102bf9190810190612b20565b610fc9565b6040516102d191906132ae565b60405180910390f35b6102f460048036036102ef9190810190612cdd565b611031565b6040516103019190613407565b60405180910390f35b610324600480360361031f9190810190612dfa565b611106565b005b610340600480360361033b9190810190612a1d565b611193565b60405161034d9190613407565b60405180910390f35b610370600480360361036b9190810190612cdd565b611248565b005b61038c60048036036103879190810190612e66565b6112be565b005b6103a860048036036103a39190810190612bab565b611394565b6040516103b5919061334c565b60405180910390f35b6103d860048036036103d391908101906129d8565b611499565b6040516103e5919061328c565b60405180910390f35b61040860048036036104039190810190612a1d565b6115ef565b005b610424600480360361041f9190810190612a1d565b611656565b604051610431919061334c565b60405180910390f35b610454600480360361044f9190810190612a1d565b61170b565b6040516104629291906132e4565b60405180910390f35b61048560048036036104809190810190612a46565b611745565b005b6104a1600480360361049c9190810190612c36565b611771565b005b6104bd60048036036104b89190810190612dbe565b611883565b6040516104ca919061334c565b60405180910390f35b6104ed60048036036104e89190810190612a82565b61194a565b6040516104fa91906132ae565b60405180910390f35b60006359d1d43c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055d575061055c82611986565b5b9050919050565b8261056e816119e7565b61057757600080fd5b60008090506000809050606080600061058e6125b2565b6105e660008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b7090919063ffffffff16565b90505b6105f281611b9a565b61071f5760008661ffff16141561064e578060400151955061061381611bb0565b93508360405160200161062691906131f6565b60405160208183030381529060405280519060200120915061064781611be7565b9250610711565b606061065982611bb0565b9050816040015161ffff168761ffff1614158061068657506106848186611c1790919063ffffffff16565b155b1561070f576106e88b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b88602001510360008b5114611c3e565b81604001519650816020015195508094508480519060200120925061070c82611be7565b93505b505b61071a81611f6e565b6105e9565b50600083511115610787576107868984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e9050036000895114611c3e565b5b505050505050505050565b8461079c816119e7565b6107a557600080fd5b82826009600089815260200190815260200160002087876040516107ca92919061320d565b908152602001604051809103902091906107e59291906125fd565b5084846040516107f692919061320d565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a755087876040516108309291906133e3565b60405180910390a3505050505050565b600080600660008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109055780915050610c25565b600061091085610e82565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561095257600092505050610c25565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b604051602401610985919061330d565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a0f91906131f6565b600060405180830381855afa9150503d8060008114610a4a576040519150601f19603f3d011682016040523d82523d6000602084013e610a4f565b606091505b5091509150811580610a62575060208151105b80610aa95750600060f81b81601f81518110610a7a57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610abb576000945050505050610c25565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610ae3919061330d565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b6d91906131f6565b600060405180830381855afa9150503d8060008114610ba8576040519150601f19603f3d011682016040523d82523d6000602084013e610bad565b606091505b508092508193505050811580610bc4575060208151105b80610c0b5750600060f81b81601f81518110610bdc57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610c1d576000945050505050610c25565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111610d5757600085821614158015610c8c57506000826000838152602001908152602001600020805460018160011615610100020316600290049050115b15610d4b5780826000838152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d395780601f10610d0e57610100808354040283529160200191610d39565b820191906000526020600020905b815481529060010190602001808311610d1c57829003601f168201915b50505050509050935093505050610d73565b600181901b9050610c4c565b5060006040518060200160405280600081525081915092509250505b9250929050565b82610d84816119e7565b610d8d57600080fd5b604051806040016040528084815260200183815250600860008681526020019081526020016000206000820151816000015560208201518160010155905050837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484604051610dfe9291906132e4565b60405180910390a250505050565b82610e16816119e7565b610e1f57600080fd5b8282600260008781526020019081526020016000209190610e4192919061267d565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610e74929190613328565b60405180910390a250505050565b60006060610e9183603c611883565b9050600081511415610ea7576000915050610eb4565b610eb081612082565b9150505b919050565b80600b600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df84604051610fbc91906132ae565b60405180910390a4505050565b60008060056000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b606060096000858152602001908152602001600020838360405161105692919061320d565b90815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110f85780601f106110cd576101008083540402835291602001916110f8565b820191906000526020600020905b8154815290600101906020018083116110db57829003601f168201915b505050505090509392505050565b83611110816119e7565b61111957600080fd5b60008460018603161461112b57600080fd5b82826000808881526020019081526020016000206000878152602001908152602001600020919061115d92919061267d565b5083857faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a35050505050565b6060600760008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561123c5780601f106112115761010080835404028352916020019161123c565b820191906000526020600020905b81548152906001019060200180831161121f57829003601f168201915b50505050509050919050565b82611252816119e7565b61125b57600080fd5b828260076000878152602001908152602001600020919061127d9291906125fd565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784846040516112b09291906133e3565b60405180910390a250505050565b826112c8816119e7565b6112d157600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051611303929190613429565b60405180910390a2603c83141561135557837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd261133f84612082565b60405161134c9190613256565b60405180910390a25b81600160008681526020019081526020016000206000858152602001908152602001600020908051906020019061138d9291906126fd565b5050505050565b606060046000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561148b5780601f106114605761010080835404028352916020019161148b565b820191906000526020600020905b81548152906001019060200180831161146e57829003601f168201915b505050505090509392505050565b6060828290506040519080825280602002602001820160405280156114d257816020015b60608152602001906001900390816114bd5790505b50905060008090505b838390508110156115e557600060603073ffffffffffffffffffffffffffffffffffffffff1686868581811061150d57fe5b905060200281018035600160200383360303811261152a57600080fd5b8083019250508135905060208201915067ffffffffffffffff81111561154f57600080fd5b60018102360382131561156157600080fd5b60405161156f9291906131dd565b600060405180830381855af49150503d80600081146115aa576040519150601f19603f3d011682016040523d82523d6000602084013e6115af565b606091505b5091509150816115be57600080fd5b808484815181106115cb57fe5b6020026020010181905250505080806001019150506114db565b5080905092915050565b806115f9816119e7565b61160257600080fd5b6003600083815260200190815260200160002060008154809291906001019190505550817fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198360405160405180910390a25050565b6060600260008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ff5780601f106116d4576101008083540402835291602001916116ff565b820191906000526020600020905b8154815290600101906020018083116116e257829003601f168201915b50505050509050919050565b6000806008600084815260200190815260200160002060000154600860008581526020019081526020016000206001015491509150915091565b8161174f816119e7565b61175857600080fd5b61176c83603c611767856120a5565b6112be565b505050565b8261177b816119e7565b61178457600080fd5b81600660008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa84604051611875919061323b565b60405180910390a350505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561193d5780601f106119125761010080835404028352916020019161193d565b820191906000526020600020905b81548152906001019060200180831161192057829003601f168201915b5050505050905092915050565b600b602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600063c869023360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e057506119df826120f0565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b8152600401611a4591906132c9565b60206040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a9591908101906129af565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b685750600b600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611b786125b2565b828160000181905250818160c0018181525050611b9481611f6e565b92915050565b6000816000015151826020015110159050919050565b6060611be08260200151611bcc84600001518560200151612151565b84600001516121ac9092919063ffffffff16565b9050919050565b6060611c108260a001518360a001518460c001510384600001516121ac9092919063ffffffff16565b9050919050565b600081518351148015611c365750611c35836000846000875161221f565b5b905092915050565b6000600360008981526020019081526020016000205490506000878051906020012090506060611c798686896121ac9092919063ffffffff16565b90508315611dee576000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff16815260200190815260200160002080546001816001161561010002031660029004905014611d5557600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906001900391906101000a81548161ffff021916908361ffff160217905550505b600460008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611daf919061277d565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a604051611de192919061336e565b60405180910390a2611f62565b6000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490501415611ec257600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b80600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000209080519060200190611f249291906126fd565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a84604051611f599392919061339e565b60405180910390a25b50505050505050505050565b8060c00151816020018181525050806000015151816020015110611f915761207f565b6000611fa582600001518360200151612151565b8260200151019050611fc481836000015161224390919063ffffffff16565b826040019061ffff16908161ffff1681525050600281019050611ff481836000015161224390919063ffffffff16565b826060019061ffff16908161ffff168152505060028101905061202481836000015161226990919063ffffffff16565b826080019063ffffffff16908163ffffffff1681525050600481019050600061205a82846000015161224390919063ffffffff16565b61ffff169050600282019150818360a00181815250508082018360c001818152505050505b50565b6000601482511461209257600080fd5b600c6101000a6020830151049050919050565b606060146040519080825280601f01601f1916602001820160405280156120db5781602001600182028038833980820191505090505b509050600c6101000a82026020820152919050565b600063691f343160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214a575061214982612291565b5b9050919050565b6000808290505b6001156121a0578351811061216957fe5b600061217e82866122fe90919063ffffffff16565b60ff1690506001810182019150600081141561219a57506121a0565b50612158565b82810391505092915050565b6060835182840111156121be57600080fd5b6060826040519080825280601f01601f1916602001820160405280156121f35781602001600182028038833980820191505090505b5090506000806020830191508560208801019050612212828287612322565b8293505050509392505050565b600061222c84848461236b565b61223787878561236b565b14905095945050505050565b6000825160028301111561225657600080fd5b61ffff8260028501015116905092915050565b6000825160048301111561227c57600080fd5b63ffffffff8260048501015116905092915050565b600060405161229f90613226565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f757506122f68261238e565b5b9050919050565b600082828151811061230c57fe5b602001015160f81c60f81b60f81c905092915050565b5b602081106123465781518352602083019250602082019150602081039050612323565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828401111561237d57600080fd5b818360208601012090509392505050565b600063a8fa568260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123e857506123e7826123ef565b5b9050919050565b600063bc1c58d160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612449575061244882612450565b5b9050919050565b6000633b3b57de60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124e9575063f1cb7e0660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124f957506124f882612500565b5b9050919050565b6000632203ab5660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061255a575061255982612561565b5b9050919050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061263e57803560ff191683800117855561266c565b8280016001018555821561266c579182015b8281111561266b578235825591602001919060010190612650565b5b50905061267991906127c5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126be57803560ff19168380011785556126ec565b828001600101855582156126ec579182015b828111156126eb5782358255916020019190600101906126d0565b5b5090506126f991906127c5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061273e57805160ff191683800117855561276c565b8280016001018555821561276c579182015b8281111561276b578251825591602001919060010190612750565b5b50905061277991906127c5565b5090565b50805460018160011615610100020316600290046000825580601f106127a357506127c2565b601f0160209004906000526020600020908101906127c191906127c5565b5b50565b6127e791905b808211156127e35760008160009055506001016127cb565b5090565b90565b6000813590506127f98161367c565b92915050565b60008151905061280e8161367c565b92915050565b60008083601f84011261282657600080fd5b8235905067ffffffffffffffff81111561283f57600080fd5b60208301915083602082028301111561285757600080fd5b9250929050565b60008135905061286d81613693565b92915050565b600081359050612882816136aa565b92915050565b600081359050612897816136c1565b92915050565b60008083601f8401126128af57600080fd5b8235905067ffffffffffffffff8111156128c857600080fd5b6020830191508360018202830111156128e057600080fd5b9250929050565b600082601f8301126128f857600080fd5b813561290b61290682613486565b613459565b9150808252602083016020830185838301111561292757600080fd5b612932838284613629565b50505092915050565b60008083601f84011261294d57600080fd5b8235905067ffffffffffffffff81111561296657600080fd5b60208301915083600182028301111561297e57600080fd5b9250929050565b600081359050612994816136d8565b92915050565b6000813590506129a9816136ef565b92915050565b6000602082840312156129c157600080fd5b60006129cf848285016127ff565b91505092915050565b600080602083850312156129eb57600080fd5b600083013567ffffffffffffffff811115612a0557600080fd5b612a1185828601612814565b92509250509250929050565b600060208284031215612a2f57600080fd5b6000612a3d84828501612873565b91505092915050565b60008060408385031215612a5957600080fd5b6000612a6785828601612873565b9250506020612a78858286016127ea565b9150509250929050565b600080600060608486031215612a9757600080fd5b6000612aa586828701612873565b9350506020612ab6868287016127ea565b9250506040612ac7868287016127ea565b9150509250925092565b600080600060608486031215612ae657600080fd5b6000612af486828701612873565b9350506020612b05868287016127ea565b9250506040612b168682870161285e565b9150509250925092565b60008060408385031215612b3357600080fd5b6000612b4185828601612873565b9250506020612b5285828601612873565b9150509250929050565b600080600060608486031215612b7157600080fd5b6000612b7f86828701612873565b9350506020612b9086828701612873565b9250506040612ba186828701612873565b9150509250925092565b600080600060608486031215612bc057600080fd5b6000612bce86828701612873565b9350506020612bdf86828701612873565b9250506040612bf086828701612985565b9150509250925092565b60008060408385031215612c0d57600080fd5b6000612c1b85828601612873565b9250506020612c2c85828601612888565b9150509250929050565b600080600060608486031215612c4b57600080fd5b6000612c5986828701612873565b9350506020612c6a86828701612888565b9250506040612c7b868287016127ea565b9150509250925092565b600080600060408486031215612c9a57600080fd5b6000612ca886828701612873565b935050602084013567ffffffffffffffff811115612cc557600080fd5b612cd18682870161289d565b92509250509250925092565b600080600060408486031215612cf257600080fd5b6000612d0086828701612873565b935050602084013567ffffffffffffffff811115612d1d57600080fd5b612d298682870161293b565b92509250509250925092565b600080600080600060608688031215612d4d57600080fd5b6000612d5b88828901612873565b955050602086013567ffffffffffffffff811115612d7857600080fd5b612d848882890161293b565b9450945050604086013567ffffffffffffffff811115612da357600080fd5b612daf8882890161293b565b92509250509295509295909350565b60008060408385031215612dd157600080fd5b6000612ddf85828601612873565b9250506020612df08582860161299a565b9150509250929050565b60008060008060608587031215612e1057600080fd5b6000612e1e87828801612873565b9450506020612e2f8782880161299a565b935050604085013567ffffffffffffffff811115612e4c57600080fd5b612e588782880161289d565b925092505092959194509250565b600080600060608486031215612e7b57600080fd5b6000612e8986828701612873565b9350506020612e9a8682870161299a565b925050604084013567ffffffffffffffff811115612eb757600080fd5b612ec3868287016128e7565b9150509250925092565b600060208284031215612edf57600080fd5b6000612eed84828501612888565b91505092915050565b6000612f028383613095565b905092915050565b612f13816135f3565b82525050565b612f2281613567565b82525050565b612f3181613555565b82525050565b6000612f42826134c2565b612f4c81856134fb565b935083602082028501612f5e856134b2565b8060005b85811015612f9a5784840389528151612f7b8582612ef6565b9450612f86836134ee565b925060208a01995050600181019050612f62565b50829750879550505050505092915050565b612fb581613579565b82525050565b612fc481613585565b82525050565b612fd38161358f565b82525050565b6000612fe5838561351d565b9350612ff2838584613629565b612ffb8361366b565b840190509392505050565b6000613012838561352e565b935061301f838584613629565b82840190509392505050565b6000613036826134d8565b613040818561351d565b9350613050818560208601613638565b6130598161366b565b840191505092915050565b600061306f826134d8565b613079818561352e565b9350613089818560208601613638565b80840191505092915050565b60006130a0826134cd565b6130aa818561350c565b93506130ba818560208601613638565b6130c38161366b565b840191505092915050565b60006130da8385613539565b93506130e7838584613629565b6130f08361366b565b840190509392505050565b6000613107838561354a565b9350613114838584613629565b82840190509392505050565b600061312b826134e3565b6131358185613539565b9350613145818560208601613638565b61314e8161366b565b840191505092915050565b600061316660248361354a565b91507f696e74657266616365496d706c656d656e74657228627974657333322c62797460008301527f65733429000000000000000000000000000000000000000000000000000000006020830152602482019050919050565b6131c8816135bb565b82525050565b6131d7816135e9565b82525050565b60006131ea828486613006565b91508190509392505050565b60006132028284613064565b915081905092915050565b600061321a8284866130fb565b91508190509392505050565b600061323182613159565b9150819050919050565b60006020820190506132506000830184612f28565b92915050565b600060208201905061326b6000830184612f0a565b92915050565b60006020820190506132866000830184612f19565b92915050565b600060208201905081810360008301526132a68184612f37565b905092915050565b60006020820190506132c36000830184612fac565b92915050565b60006020820190506132de6000830184612fbb565b92915050565b60006040820190506132f96000830185612fbb565b6133066020830184612fbb565b9392505050565b60006020820190506133226000830184612fca565b92915050565b60006020820190508181036000830152613343818486612fd9565b90509392505050565b60006020820190508181036000830152613366818461302b565b905092915050565b60006040820190508181036000830152613388818561302b565b905061339760208301846131bf565b9392505050565b600060608201905081810360008301526133b8818661302b565b90506133c760208301856131bf565b81810360408301526133d9818461302b565b9050949350505050565b600060208201905081810360008301526133fe8184866130ce565b90509392505050565b600060208201905081810360008301526134218184613120565b905092915050565b600060408201905061343e60008301856131ce565b8181036020830152613450818461302b565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561347c57600080fd5b8060405250919050565b600067ffffffffffffffff82111561349d57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613560826135c9565b9050919050565b6000613572826135c9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135fe82613605565b9050919050565b600061361082613617565b9050919050565b6000613622826135c9565b9050919050565b82818337600083830152505050565b60005b8381101561365657808201518184015260208101905061363b565b83811115613665576000848401525b50505050565b6000601f19601f8301169050919050565b61368581613555565b811461369057600080fd5b50565b61369c81613579565b81146136a757600080fd5b50565b6136b381613585565b81146136be57600080fd5b50565b6136ca8161358f565b81146136d557600080fd5b50565b6136e1816135bb565b81146136ec57600080fd5b50565b6136f8816135e9565b811461370357600080fd5b5056fea365627a7a7231582087f3e3c017932ceb01fcdc5a3900c19b41d676b9e0813504bedb22dfb4995a2e6c6578706572696d656e74616cf564736f6c6343000510004000000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101585760003560e01c8063691f3431116100c3578063bc1c58d11161007c578063bc1c58d11461040a578063c86902331461043a578063d5fa2b001461046b578063e59d895d14610487578063f1cb7e06146104a3578063f86bc879146104d357610158565b8063691f34311461032657806377372213146103565780638b95dd7114610372578063a8fa56821461038e578063ac9650d8146103be578063ad5780af146103ee57610158565b8063304e6ade11610115578063304e6ade146102425780633b3b57de1461025e5780633e9ce7941461028e5780634cbf6ba4146102aa57806359d1d43c146102da578063623195b01461030a57610158565b806301ffc9a71461015d5780630af179d71461018d57806310f13a8c146101a9578063124a319c146101c55780632203ab56146101f557806329cd62ea14610226575b600080fd5b61017760048036036101729190810190612ecd565b610503565b60405161018491906132ae565b60405180910390f35b6101a760048036036101a29190810190612c85565b610564565b005b6101c360048036036101be9190810190612d35565b610792565b005b6101df60048036036101da9190810190612bfa565b610840565b6040516101ec919061323b565b60405180910390f35b61020f600480360361020a9190810190612dbe565b610c2b565b60405161021d929190613429565b60405180910390f35b610240600480360361023b9190810190612b5c565b610d7a565b005b61025c60048036036102579190810190612c85565b610e0c565b005b61027860048036036102739190810190612a1d565b610e82565b6040516102859190613271565b60405180910390f35b6102a860048036036102a39190810190612ad1565b610eb9565b005b6102c460048036036102bf9190810190612b20565b610fc9565b6040516102d191906132ae565b60405180910390f35b6102f460048036036102ef9190810190612cdd565b611031565b6040516103019190613407565b60405180910390f35b610324600480360361031f9190810190612dfa565b611106565b005b610340600480360361033b9190810190612a1d565b611193565b60405161034d9190613407565b60405180910390f35b610370600480360361036b9190810190612cdd565b611248565b005b61038c60048036036103879190810190612e66565b6112be565b005b6103a860048036036103a39190810190612bab565b611394565b6040516103b5919061334c565b60405180910390f35b6103d860048036036103d391908101906129d8565b611499565b6040516103e5919061328c565b60405180910390f35b61040860048036036104039190810190612a1d565b6115ef565b005b610424600480360361041f9190810190612a1d565b611656565b604051610431919061334c565b60405180910390f35b610454600480360361044f9190810190612a1d565b61170b565b6040516104629291906132e4565b60405180910390f35b61048560048036036104809190810190612a46565b611745565b005b6104a1600480360361049c9190810190612c36565b611771565b005b6104bd60048036036104b89190810190612dbe565b611883565b6040516104ca919061334c565b60405180910390f35b6104ed60048036036104e89190810190612a82565b61194a565b6040516104fa91906132ae565b60405180910390f35b60006359d1d43c60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061055d575061055c82611986565b5b9050919050565b8261056e816119e7565b61057757600080fd5b60008090506000809050606080600061058e6125b2565b6105e660008a8a8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611b7090919063ffffffff16565b90505b6105f281611b9a565b61071f5760008661ffff16141561064e578060400151955061061381611bb0565b93508360405160200161062691906131f6565b60405160208183030381529060405280519060200120915061064781611be7565b9250610711565b606061065982611bb0565b9050816040015161ffff168761ffff1614158061068657506106848186611c1790919063ffffffff16565b155b1561070f576106e88b86898d8d8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f820116905080830192505050505050508a8b88602001510360008b5114611c3e565b81604001519650816020015195508094508480519060200120925061070c82611be7565b93505b505b61071a81611f6e565b6105e9565b50600083511115610787576107868984878b8b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505088898e8e9050036000895114611c3e565b5b505050505050505050565b8461079c816119e7565b6107a557600080fd5b82826009600089815260200190815260200160002087876040516107ca92919061320d565b908152602001604051809103902091906107e59291906125fd565b5084846040516107f692919061320d565b6040518091039020867fd8c9334b1a9c2f9da342a0a2b32629c1a229b6445dad78947f674b44444a755087876040516108309291906133e3565b60405180910390a3505050505050565b600080600660008581526020019081526020016000206000847bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146109055780915050610c25565b600061091085610e82565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561095257600092505050610c25565b600060608273ffffffffffffffffffffffffffffffffffffffff166301ffc9a760e01b604051602401610985919061330d565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610a0f91906131f6565b600060405180830381855afa9150503d8060008114610a4a576040519150601f19603f3d011682016040523d82523d6000602084013e610a4f565b606091505b5091509150811580610a62575060208151105b80610aa95750600060f81b81601f81518110610a7a57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610abb576000945050505050610c25565b8273ffffffffffffffffffffffffffffffffffffffff1686604051602401610ae3919061330d565b6040516020818303038152906040527f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050604051610b6d91906131f6565b600060405180830381855afa9150503d8060008114610ba8576040519150601f19603f3d011682016040523d82523d6000602084013e610bad565b606091505b508092508193505050811580610bc4575060208151105b80610c0b5750600060f81b81601f81518110610bdc57fe5b602001015160f81c60f81b7effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610c1d576000945050505050610c25565b829450505050505b92915050565b60006060600080600086815260200190815260200160002090506000600190505b848111610d5757600085821614158015610c8c57506000826000838152602001908152602001600020805460018160011615610100020316600290049050115b15610d4b5780826000838152602001908152602001600020808054600181600116156101000203166002900480601f016020809104026020016040519081016040528092919081815260200182805460018160011615610100020316600290048015610d395780601f10610d0e57610100808354040283529160200191610d39565b820191906000526020600020905b815481529060010190602001808311610d1c57829003601f168201915b50505050509050935093505050610d73565b600181901b9050610c4c565b5060006040518060200160405280600081525081915092509250505b9250929050565b82610d84816119e7565b610d8d57600080fd5b604051806040016040528084815260200183815250600860008681526020019081526020016000206000820151816000015560208201518160010155905050837f1d6f5e03d3f63eb58751986629a5439baee5079ff04f345becb66e23eb154e468484604051610dfe9291906132e4565b60405180910390a250505050565b82610e16816119e7565b610e1f57600080fd5b8282600260008781526020019081526020016000209190610e4192919061267d565b50837fe379c1624ed7e714cc0937528a32359d69d5281337765313dba4e081b72d75788484604051610e74929190613328565b60405180910390a250505050565b60006060610e9183603c611883565b9050600081511415610ea7576000915050610eb4565b610eb081612082565b9150505b919050565b80600b600085815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16847fe1c5610a6e0cbe10764ecd182adcef1ec338dc4e199c99c32ce98f38e12791df84604051610fbc91906132ae565b60405180910390a4505050565b60008060056000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060009054906101000a900461ffff1661ffff161415905092915050565b606060096000858152602001908152602001600020838360405161105692919061320d565b90815260200160405180910390208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156110f85780601f106110cd576101008083540402835291602001916110f8565b820191906000526020600020905b8154815290600101906020018083116110db57829003601f168201915b505050505090509392505050565b83611110816119e7565b61111957600080fd5b60008460018603161461112b57600080fd5b82826000808881526020019081526020016000206000878152602001908152602001600020919061115d92919061267d565b5083857faa121bbeef5f32f5961a2a28966e769023910fc9479059ee3495d4c1a696efe360405160405180910390a35050505050565b6060600760008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561123c5780601f106112115761010080835404028352916020019161123c565b820191906000526020600020905b81548152906001019060200180831161121f57829003601f168201915b50505050509050919050565b82611252816119e7565b61125b57600080fd5b828260076000878152602001908152602001600020919061127d9291906125fd565b50837fb7d29e911041e8d9b843369e890bcb72c9388692ba48b65ac54e7214c4c348f784846040516112b09291906133e3565b60405180910390a250505050565b826112c8816119e7565b6112d157600080fd5b837f65412581168e88a1e60c6459d7f44ae83ad0832e670826c05a4e2476b57af7528484604051611303929190613429565b60405180910390a2603c83141561135557837f52d7d861f09ab3d26239d492e8968629f95e9e318cf0b73bfddc441522a15fd261133f84612082565b60405161134c9190613256565b60405180910390a25b81600160008681526020019081526020016000206000858152602001908152602001600020908051906020019061138d9291906126fd565b5050505050565b606060046000858152602001908152602001600020600060036000878152602001908152602001600020548152602001908152602001600020600084815260200190815260200160002060008361ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561148b5780601f106114605761010080835404028352916020019161148b565b820191906000526020600020905b81548152906001019060200180831161146e57829003601f168201915b505050505090509392505050565b6060828290506040519080825280602002602001820160405280156114d257816020015b60608152602001906001900390816114bd5790505b50905060008090505b838390508110156115e557600060603073ffffffffffffffffffffffffffffffffffffffff1686868581811061150d57fe5b905060200281018035600160200383360303811261152a57600080fd5b8083019250508135905060208201915067ffffffffffffffff81111561154f57600080fd5b60018102360382131561156157600080fd5b60405161156f9291906131dd565b600060405180830381855af49150503d80600081146115aa576040519150601f19603f3d011682016040523d82523d6000602084013e6115af565b606091505b5091509150816115be57600080fd5b808484815181106115cb57fe5b6020026020010181905250505080806001019150506114db565b5080905092915050565b806115f9816119e7565b61160257600080fd5b6003600083815260200190815260200160002060008154809291906001019190505550817fb757169b8492ca2f1c6619d9d76ce22803035c3b1d5f6930dffe7b127c1a198360405160405180910390a25050565b6060600260008381526020019081526020016000208054600181600116156101000203166002900480601f0160208091040260200160405190810160405280929190818152602001828054600181600116156101000203166002900480156116ff5780601f106116d4576101008083540402835291602001916116ff565b820191906000526020600020905b8154815290600101906020018083116116e257829003601f168201915b50505050509050919050565b6000806008600084815260200190815260200160002060000154600860008581526020019081526020016000206001015491509150915091565b8161174f816119e7565b61175857600080fd5b61176c83603c611767856120a5565b6112be565b505050565b8261177b816119e7565b61178457600080fd5b81600660008681526020019081526020016000206000857bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916847f7c69f06bea0bdef565b709e93a147836b0063ba2dd89f02d0b7e8d931e6a6daa84604051611875919061323b565b60405180910390a350505050565b60606001600084815260200190815260200160002060008381526020019081526020016000208054600181600116156101000203166002900480601f01602080910402602001604051908101604052809291908181526020018280546001816001161561010002031660029004801561193d5780601f106119125761010080835404028352916020019161193d565b820191906000526020600020905b81548152906001019060200180831161192057829003601f168201915b5050505050905092915050565b600b602052826000526040600020602052816000526040600020602052806000526040600020600092509250509054906101000a900460ff1681565b600063c869023360e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119e057506119df826120f0565b5b9050919050565b600080600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166302571be3846040518263ffffffff1660e01b8152600401611a4591906132c9565b60206040518083038186803b158015611a5d57600080fd5b505afa158015611a71573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611a9591908101906129af565b90503373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161480611b685750600b600084815260200190815260200160002060008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b915050919050565b611b786125b2565b828160000181905250818160c0018181525050611b9481611f6e565b92915050565b6000816000015151826020015110159050919050565b6060611be08260200151611bcc84600001518560200151612151565b84600001516121ac9092919063ffffffff16565b9050919050565b6060611c108260a001518360a001518460c001510384600001516121ac9092919063ffffffff16565b9050919050565b600081518351148015611c365750611c35836000846000875161221f565b5b905092915050565b6000600360008981526020019081526020016000205490506000878051906020012090506060611c798686896121ac9092919063ffffffff16565b90508315611dee576000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff16815260200190815260200160002080546001816001161561010002031660029004905014611d5557600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff16809291906001900391906101000a81548161ffff021916908361ffff160217905550505b600460008b81526020019081526020016000206000848152602001908152602001600020600083815260200190815260200160002060008961ffff1661ffff1681526020019081526020016000206000611daf919061277d565b897f03528ed0c2a3ebc993b12ce3c16bb382f9c7d88ef7d8a1bf290eaf35955a12078a8a604051611de192919061336e565b60405180910390a2611f62565b6000600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000208054600181600116156101000203166002900490501415611ec257600560008b815260200190815260200160002060008481526020019081526020016000206000838152602001908152602001600020600081819054906101000a900461ffff168092919060010191906101000a81548161ffff021916908361ffff160217905550505b80600460008c81526020019081526020016000206000858152602001908152602001600020600084815260200190815260200160002060008a61ffff1661ffff1681526020019081526020016000209080519060200190611f249291906126fd565b50897f52a608b3303a48862d07a73d82fa221318c0027fbbcfb1b2329bface3f19ff2b8a8a84604051611f599392919061339e565b60405180910390a25b50505050505050505050565b8060c00151816020018181525050806000015151816020015110611f915761207f565b6000611fa582600001518360200151612151565b8260200151019050611fc481836000015161224390919063ffffffff16565b826040019061ffff16908161ffff1681525050600281019050611ff481836000015161224390919063ffffffff16565b826060019061ffff16908161ffff168152505060028101905061202481836000015161226990919063ffffffff16565b826080019063ffffffff16908163ffffffff1681525050600481019050600061205a82846000015161224390919063ffffffff16565b61ffff169050600282019150818360a00181815250508082018360c001818152505050505b50565b6000601482511461209257600080fd5b600c6101000a6020830151049050919050565b606060146040519080825280601f01601f1916602001820160405280156120db5781602001600182028038833980820191505090505b509050600c6101000a82026020820152919050565b600063691f343160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061214a575061214982612291565b5b9050919050565b6000808290505b6001156121a0578351811061216957fe5b600061217e82866122fe90919063ffffffff16565b60ff1690506001810182019150600081141561219a57506121a0565b50612158565b82810391505092915050565b6060835182840111156121be57600080fd5b6060826040519080825280601f01601f1916602001820160405280156121f35781602001600182028038833980820191505090505b5090506000806020830191508560208801019050612212828287612322565b8293505050509392505050565b600061222c84848461236b565b61223787878561236b565b14905095945050505050565b6000825160028301111561225657600080fd5b61ffff8260028501015116905092915050565b6000825160048301111561227c57600080fd5b63ffffffff8260048501015116905092915050565b600060405161229f90613226565b60405180910390207bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806122f757506122f68261238e565b5b9050919050565b600082828151811061230c57fe5b602001015160f81c60f81b60f81c905092915050565b5b602081106123465781518352602083019250602082019150602081039050612323565b60006001826020036101000a0390508019835116818551168181178652505050505050565b60008351828401111561237d57600080fd5b818360208601012090509392505050565b600063a8fa568260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123e857506123e7826123ef565b5b9050919050565b600063bc1c58d160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612449575061244882612450565b5b9050919050565b6000633b3b57de60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124e9575063f1cb7e0660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124f957506124f882612500565b5b9050919050565b6000632203ab5660e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061255a575061255982612561565b5b9050919050565b60006301ffc9a760e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6040518060e001604052806060815260200160008152602001600061ffff168152602001600061ffff168152602001600063ffffffff16815260200160008152602001600081525090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061263e57803560ff191683800117855561266c565b8280016001018555821561266c579182015b8281111561266b578235825591602001919060010190612650565b5b50905061267991906127c5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f106126be57803560ff19168380011785556126ec565b828001600101855582156126ec579182015b828111156126eb5782358255916020019190600101906126d0565b5b5090506126f991906127c5565b5090565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282601f1061273e57805160ff191683800117855561276c565b8280016001018555821561276c579182015b8281111561276b578251825591602001919060010190612750565b5b50905061277991906127c5565b5090565b50805460018160011615610100020316600290046000825580601f106127a357506127c2565b601f0160209004906000526020600020908101906127c191906127c5565b5b50565b6127e791905b808211156127e35760008160009055506001016127cb565b5090565b90565b6000813590506127f98161367c565b92915050565b60008151905061280e8161367c565b92915050565b60008083601f84011261282657600080fd5b8235905067ffffffffffffffff81111561283f57600080fd5b60208301915083602082028301111561285757600080fd5b9250929050565b60008135905061286d81613693565b92915050565b600081359050612882816136aa565b92915050565b600081359050612897816136c1565b92915050565b60008083601f8401126128af57600080fd5b8235905067ffffffffffffffff8111156128c857600080fd5b6020830191508360018202830111156128e057600080fd5b9250929050565b600082601f8301126128f857600080fd5b813561290b61290682613486565b613459565b9150808252602083016020830185838301111561292757600080fd5b612932838284613629565b50505092915050565b60008083601f84011261294d57600080fd5b8235905067ffffffffffffffff81111561296657600080fd5b60208301915083600182028301111561297e57600080fd5b9250929050565b600081359050612994816136d8565b92915050565b6000813590506129a9816136ef565b92915050565b6000602082840312156129c157600080fd5b60006129cf848285016127ff565b91505092915050565b600080602083850312156129eb57600080fd5b600083013567ffffffffffffffff811115612a0557600080fd5b612a1185828601612814565b92509250509250929050565b600060208284031215612a2f57600080fd5b6000612a3d84828501612873565b91505092915050565b60008060408385031215612a5957600080fd5b6000612a6785828601612873565b9250506020612a78858286016127ea565b9150509250929050565b600080600060608486031215612a9757600080fd5b6000612aa586828701612873565b9350506020612ab6868287016127ea565b9250506040612ac7868287016127ea565b9150509250925092565b600080600060608486031215612ae657600080fd5b6000612af486828701612873565b9350506020612b05868287016127ea565b9250506040612b168682870161285e565b9150509250925092565b60008060408385031215612b3357600080fd5b6000612b4185828601612873565b9250506020612b5285828601612873565b9150509250929050565b600080600060608486031215612b7157600080fd5b6000612b7f86828701612873565b9350506020612b9086828701612873565b9250506040612ba186828701612873565b9150509250925092565b600080600060608486031215612bc057600080fd5b6000612bce86828701612873565b9350506020612bdf86828701612873565b9250506040612bf086828701612985565b9150509250925092565b60008060408385031215612c0d57600080fd5b6000612c1b85828601612873565b9250506020612c2c85828601612888565b9150509250929050565b600080600060608486031215612c4b57600080fd5b6000612c5986828701612873565b9350506020612c6a86828701612888565b9250506040612c7b868287016127ea565b9150509250925092565b600080600060408486031215612c9a57600080fd5b6000612ca886828701612873565b935050602084013567ffffffffffffffff811115612cc557600080fd5b612cd18682870161289d565b92509250509250925092565b600080600060408486031215612cf257600080fd5b6000612d0086828701612873565b935050602084013567ffffffffffffffff811115612d1d57600080fd5b612d298682870161293b565b92509250509250925092565b600080600080600060608688031215612d4d57600080fd5b6000612d5b88828901612873565b955050602086013567ffffffffffffffff811115612d7857600080fd5b612d848882890161293b565b9450945050604086013567ffffffffffffffff811115612da357600080fd5b612daf8882890161293b565b92509250509295509295909350565b60008060408385031215612dd157600080fd5b6000612ddf85828601612873565b9250506020612df08582860161299a565b9150509250929050565b60008060008060608587031215612e1057600080fd5b6000612e1e87828801612873565b9450506020612e2f8782880161299a565b935050604085013567ffffffffffffffff811115612e4c57600080fd5b612e588782880161289d565b925092505092959194509250565b600080600060608486031215612e7b57600080fd5b6000612e8986828701612873565b9350506020612e9a8682870161299a565b925050604084013567ffffffffffffffff811115612eb757600080fd5b612ec3868287016128e7565b9150509250925092565b600060208284031215612edf57600080fd5b6000612eed84828501612888565b91505092915050565b6000612f028383613095565b905092915050565b612f13816135f3565b82525050565b612f2281613567565b82525050565b612f3181613555565b82525050565b6000612f42826134c2565b612f4c81856134fb565b935083602082028501612f5e856134b2565b8060005b85811015612f9a5784840389528151612f7b8582612ef6565b9450612f86836134ee565b925060208a01995050600181019050612f62565b50829750879550505050505092915050565b612fb581613579565b82525050565b612fc481613585565b82525050565b612fd38161358f565b82525050565b6000612fe5838561351d565b9350612ff2838584613629565b612ffb8361366b565b840190509392505050565b6000613012838561352e565b935061301f838584613629565b82840190509392505050565b6000613036826134d8565b613040818561351d565b9350613050818560208601613638565b6130598161366b565b840191505092915050565b600061306f826134d8565b613079818561352e565b9350613089818560208601613638565b80840191505092915050565b60006130a0826134cd565b6130aa818561350c565b93506130ba818560208601613638565b6130c38161366b565b840191505092915050565b60006130da8385613539565b93506130e7838584613629565b6130f08361366b565b840190509392505050565b6000613107838561354a565b9350613114838584613629565b82840190509392505050565b600061312b826134e3565b6131358185613539565b9350613145818560208601613638565b61314e8161366b565b840191505092915050565b600061316660248361354a565b91507f696e74657266616365496d706c656d656e74657228627974657333322c62797460008301527f65733429000000000000000000000000000000000000000000000000000000006020830152602482019050919050565b6131c8816135bb565b82525050565b6131d7816135e9565b82525050565b60006131ea828486613006565b91508190509392505050565b60006132028284613064565b915081905092915050565b600061321a8284866130fb565b91508190509392505050565b600061323182613159565b9150819050919050565b60006020820190506132506000830184612f28565b92915050565b600060208201905061326b6000830184612f0a565b92915050565b60006020820190506132866000830184612f19565b92915050565b600060208201905081810360008301526132a68184612f37565b905092915050565b60006020820190506132c36000830184612fac565b92915050565b60006020820190506132de6000830184612fbb565b92915050565b60006040820190506132f96000830185612fbb565b6133066020830184612fbb565b9392505050565b60006020820190506133226000830184612fca565b92915050565b60006020820190508181036000830152613343818486612fd9565b90509392505050565b60006020820190508181036000830152613366818461302b565b905092915050565b60006040820190508181036000830152613388818561302b565b905061339760208301846131bf565b9392505050565b600060608201905081810360008301526133b8818661302b565b90506133c760208301856131bf565b81810360408301526133d9818461302b565b9050949350505050565b600060208201905081810360008301526133fe8184866130ce565b90509392505050565b600060208201905081810360008301526134218184613120565b905092915050565b600060408201905061343e60008301856131ce565b8181036020830152613450818461302b565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561347c57600080fd5b8060405250919050565b600067ffffffffffffffff82111561349d57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613560826135c9565b9050919050565b6000613572826135c9565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135fe82613605565b9050919050565b600061361082613617565b9050919050565b6000613622826135c9565b9050919050565b82818337600083830152505050565b60005b8381101561365657808201518184015260208101905061363b565b83811115613665576000848401525b50505050565b6000601f19601f8301169050919050565b61368581613555565b811461369057600080fd5b50565b61369c81613579565b81146136a757600080fd5b50565b6136b381613585565b81146136be57600080fd5b50565b6136ca8161358f565b81146136d557600080fd5b50565b6136e1816135bb565b81146136ec57600080fd5b50565b6136f8816135e9565b811461370357600080fd5b5056fea365627a7a7231582087f3e3c017932ceb01fcdc5a3900c19b41d676b9e0813504bedb22dfb4995a2e6c6578706572696d656e74616cf564736f6c63430005100040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
-----Decoded View---------------
Arg [0] : _ens (address): 0x00000000000C2E074eC69A0dFb2997BA6C7d2e1e
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000c2e074ec69a0dfb2997ba6c7d2e1e
Deployed Bytecode Sourcemap
49922:2222:0:-;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;49922:2222:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49519:171;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;39154:1291;;;;;;;;;;;;;;;;:::i;:::-;;48970:187;;;;;;;;;;;;;;;;:::i;:::-;;44618:977;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;3223:464;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;47617:172;;;;;;;;;;;;;;;;:::i;:::-;;6332:169;;;;;;;;;;;;;;;;:::i;:::-;;4890:234;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51323;;;;;;;;;;;;;;;;:::i;:::-;;41247:155;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49382:129;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;2594:298;;;;;;;;;;;;;;;;:::i;:::-;;46675:103;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;46312:155;;;;;;;;;;;;;;;;:::i;:::-;;5132:292;;;;;;;;;;;;;;;;:::i;:::-;;40856:170;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;51767:374;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;41547:131;;;;;;;;;;;;;;;;:::i;:::-;;6675:110;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;48039:135;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;4590:134;;;;;;;;;;;;;;;;:::i;:::-;;43740:229;;;;;;;;;;;;;;;;:::i;:::-;;5432:129;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;50354:80;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;49519:171;49586:4;48528:10;49625:17;;49610:32;;;:11;:32;;;;:72;;;;49646:36;49670:11;49646:23;:36::i;:::-;49610:72;49603:79;;49519:171;;;:::o;39154:1291::-;39232:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;39249:15;39267:1;39249:19;;39279:14;39296:1;39279:18;;39308:17;39336:18;39365:16;39459:30;;:::i;:::-;39492:18;39508:1;39492:4;;:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39492:15:0;;;;;;;;:18;;;;:::i;:::-;39459:51;;39454:838;39513:11;:4;:9;:11::i;:::-;39454:838;;39570:1;39558:8;:13;;;39554:727;;;39603:4;:12;;;39592:23;;39641:11;:4;:9;:11::i;:::-;39634:18;;39709:4;39692:22;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;39692:22:0;;;39682:33;;;;;;39671:44;;39748:12;:4;:10;:12::i;:::-;39734:27;;39554:727;;;39802:20;39825:11;:4;:9;:11::i;:::-;39802:34;;39871:4;:12;;;39859:24;;:8;:24;;;;:49;;;;39888:20;39900:7;39888:4;:11;;:20;;;;:::i;:::-;39887:21;39859:49;39855:411;;;39933:88;39945:4;39951;39957:8;39967:4;;39933:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;39933:88:0;;;;;;39973:6;39995;39981:4;:11;;;:20;40019:1;40003:5;:12;:17;39933:11;:88::i;:::-;40055:4;:12;;;40044:23;;40099:4;:11;;;40090:20;;40140:7;40133:14;;40191:4;40181:15;;;;;;40170:26;;40233:12;:4;:10;:12::i;:::-;40219:27;;39855:411;39554:727;;39526:11;:4;:9;:11::i;:::-;39454:838;;;;40320:1;40306:4;:11;:15;40302:136;;;40338:88;40350:4;40356;40362:8;40372:4;;40338:88;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30:3:-1;22:6;14;1:33;99:1;93:3;85:6;81:16;74:27;137:4;133:9;126:4;121:3;117:14;113:30;106:37;;169:3;161:6;157:16;147:26;;40338:88:0;;;;;;40378:6;40400;40386:4;;:11;;:20;40424:1;40408:5;:12;:17;40338:11;:88::i;:::-;40302:136;1542:1;;;;;39154:1291;;;;:::o;48970:187::-;49065:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;49101:5;;49082;:11;49088:4;49082:11;;;;;;;;;;;49094:3;;49082:16;;;;;;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;49140:3;;49122:27;;;;;;;;;;;;;;;;49134:4;49122:27;49145:3;;49122:27;;;;;;;;;;;;;;;;48970:187;;;;;;:::o;44618:977::-;44705:7;44725:19;44747:10;:16;44758:4;44747:16;;;;;;;;;;;:29;44764:11;44747:29;;;;;;;;;;;;;;;;;;;;;;;;;;;44725:51;;44813:1;44790:25;;:11;:25;;;44787:75;;44839:11;44832:18;;;;;44787:75;44874:9;44886:10;44891:4;44886;:10::i;:::-;44874:22;;44923:1;44910:15;;:1;:15;;;44907:64;;;44957:1;44942:17;;;;;;44907:64;44984:12;44998:23;45025:1;:12;;43173:10;45091:17;;45038:71;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45038:71:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;45038:71:0;45025:85;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;44983:127:0;;;;45125:7;45124:8;:34;;;;45156:2;45136:10;:17;:22;45124:34;:57;;;;45180:1;45162:19;;:10;45173:2;45162:14;;;;;;;;;;;;;;;;:19;;;;45124:57;45121:154;;;45261:1;45246:17;;;;;;;;45121:154;45311:1;:12;;45377:11;45324:65;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;45324:65:0;;;;;;;38:4:-1;29:7;25:18;67:10;61:17;96:58;199:8;192:4;186;182:15;179:29;167:10;160:49;0:215;;;45324:65:0;45311:79;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;45287:103:0;;;;;;;;45405:7;45404:8;:34;;;;45436:2;45416:10;:17;:22;45404:34;:57;;;;45460:1;45442:19;;:10;45453:2;45442:14;;;;;;;;;;;;;;;;:19;;;;45404:57;45401:166;;;45553:1;45538:17;;;;;;;;45401:166;45586:1;45579:8;;;;;;44618:977;;;;;:::o;3223:464::-;3295:7;3304:12;3329:38;3370:4;:10;3375:4;3370:10;;;;;;;;;;;3329:51;;3398:19;3420:1;3398:23;;3393:253;3438:12;3423:11;:27;3393:253;;3522:1;3505:12;3491:11;:26;3490:33;;:67;;;;;3556:1;3527:6;:19;3534:11;3527:19;;;;;;;;;;;:26;;;;;;;;;;;;;;;;:30;3490:67;3486:149;;;3586:11;3599:6;:19;3606:11;3599:19;;;;;;;;;;;3578:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3486:149;3468:1;3452:17;;;;;3393:253;;;;3666:1;3669:9;;;;;;;;;;;;3658:21;;;;;;;;3223:464;;;;;;:::o;47617:172::-;47692:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;47725:15;;;;;;;;47735:1;47725:15;;;;47738:1;47725:15;;;47709:7;:13;47717:4;47709:13;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;;47770:4;47756:25;47776:1;47779;47756:25;;;;;;;;;;;;;;;;47617:172;;;;:::o;6332:169::-;6411:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;6443:4;;6428:6;:12;6435:4;6428:12;;;;;;;;;;;:19;;;;;;;:::i;:::-;;6482:4;6463:30;6488:4;;6463:30;;;;;;;;;;;;;;;;6332:169;;;;:::o;4890:234::-;4939:15;4967:14;4984:25;4989:4;4157:2;4984:4;:25::i;:::-;4967:42;;5035:1;5023;:8;:13;5020:62;;;5068:1;5053:17;;;;;5020:62;5099:17;5114:1;5099:14;:17::i;:::-;5092:24;;;4890:234;;;;:::o;51323:::-;51461:12;51418:14;:20;51433:4;51418:20;;;;;;;;;;;:32;51439:10;51418:32;;;;;;;;;;;;;;;:40;51451:6;51418:40;;;;;;;;;;;;;;;;:55;;;;;;;;;;;;;;;;;;51528:6;51489:60;;51516:10;51489:60;;51510:4;51489:60;51536:12;51489:60;;;;;;;;;;;;;;;51323:234;;;:::o;41247:155::-;41319:4;41392:1;41344:16;:22;41361:4;41344:22;;;;;;;;;;;:38;41367:8;:14;41376:4;41367:14;;;;;;;;;;;;41344:38;;;;;;;;;;;:44;41383:4;41344:44;;;;;;;;;;;;;;;;;;;;;:49;;;;41336:58;;41247:155;;;;:::o;49382:129::-;49454:13;49487:5;:11;49493:4;49487:11;;;;;;;;;;;49499:3;;49487:16;;;;;;;;;;;;;;;;;;;;;49480:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49382:129;;;;;:::o;2594:298::-;2686:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;2794:1;2778:11;2773:1;2759:11;:15;2758:31;2757:38;2749:47;;;;;;2835:4;;2809;:10;2814:4;2809:10;;;;;;;;;;;:23;2820:11;2809:23;;;;;;;;;;;:30;;;;;;;:::i;:::-;;2872:11;2866:4;2855:29;;;;;;;;;;2594:298;;;;;:::o;46675:103::-;46726:13;46759:5;:11;46765:4;46759:11;;;;;;;;;;;46752:18;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46675:103;;;:::o;46312:155::-;46385:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;46416:4;;46402:5;:11;46408:4;46402:11;;;;;;;;;;;:18;;;;;;;:::i;:::-;;46448:4;46436:23;46454:4;;46436:23;;;;;;;;;;;;;;;;46312:155;;;;:::o;5132:292::-;5212:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;5249:4;5234:33;5255:8;5265:1;5234:33;;;;;;;;;;;;;;;;4157:2;5281:8;:25;5278:98;;;5340:4;5328:36;5346:17;5361:1;5346:14;:17::i;:::-;5328:36;;;;;;;;;;;;;;;5278:98;5415:1;5386:10;:16;5397:4;5386:16;;;;;;;;;;;:26;5403:8;5386:26;;;;;;;;;;;:30;;;;;;;;;;;;:::i;:::-;;5132:292;;;;:::o;40856:170::-;40941:12;40973:7;:13;40981:4;40973:13;;;;;;;;;;;:29;40987:8;:14;40996:4;40987:14;;;;;;;;;;;;40973:29;;;;;;;;;;;:35;41003:4;40973:35;;;;;;;;;;;:45;41009:8;40973:45;;;;;;;;;;;;;;;40966:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40856:170;;;;;:::o;51767:374::-;51826:22;51883:4;;:11;;51871:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51861:34;;51910:6;51919:1;51910:10;;51906:203;51926:4;;:11;;51922:1;:15;51906:203;;;51960:12;51974:19;52005:4;51997:26;;52024:4;;52029:1;52024:7;;;;;;;;;;;;;43:11:-1;30:25;137:1;131:4;127:12;116:8;100:14;96:29;92:48;72:18;68:73;58:2;;155:1;152;145:12;58:2;188:18;178:8;174:33;162:45;;0:210;29:8;16:22;6:32;;69:4;59:8;55:19;43:31;;93:18;85:6;82:30;79:2;;;125:1;122;115:12;79:2;183:4;175:6;171:17;155:14;151:38;141:8;137:53;134:2;;;203:1;200;193:12;134:2;51997:35:0;;;;;;;;;;;;;;;;;;;;;;;14:1:-1;21;16:31;;;;75:4;69:11;64:16;;144:4;140:9;133:4;115:16;111:27;107:43;104:1;100:51;94:4;87:65;169:16;166:1;159:27;225:16;222:1;215:4;212:1;208:12;193:49;7:242;;16:31;36:4;31:9;;7:242;;51959:73:0;;;;52055:7;52047:16;;;;;;52091:6;52078:7;52086:1;52078:10;;;;;;;;;;;;;:19;;;;51906:203;;51939:3;;;;;;;51906:203;;;;52126:7;52119:14;;51767:374;;;;:::o;41547:131::-;41601:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;41618:8;:14;41627:4;41618:14;;;;;;;;;;;;:16;;;;;;;;;;;;;41665:4;41650:20;;;;;;;;;;41547:131;;:::o;6675:110::-;6733:12;6765:6;:12;6772:4;6765:12;;;;;;;;;;;6758:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6675:110;;;:::o;48039:135::-;48092:9;48103;48133:7;:13;48141:4;48133:13;;;;;;;;;;;:15;;;48150:7;:13;48158:4;48150:13;;;;;;;;;;;:15;;;48125:41;;;;48039:135;;;:::o;4590:134::-;4652:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;4669:47;4677:4;4157:2;4698:17;4713:1;4698:14;:17::i;:::-;4669:7;:47::i;:::-;4590:134;;;:::o;43740:229::-;43837:4;1512:18;1525:4;1512:12;:18::i;:::-;1504:27;;;;;;43886:11;43854:10;:16;43865:4;43854:16;;;;;;;;;;;:29;43871:11;43854:29;;;;;;;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;43936:11;43913:48;;;43930:4;43913:48;43949:11;43913:48;;;;;;;;;;;;;;;43740:229;;;;:::o;5432:129::-;5495:12;5527:10;:16;5538:4;5527:16;;;;;;;;;;;:26;5544:8;5527:26;;;;;;;;;;;5520:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5432:129;;;;:::o;50354:80::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48182:173::-;48249:4;47136:10;48288:19;;48273:34;;;:11;:34;;;;:74;;;;48311:36;48335:11;48311:23;:36::i;:::-;48273:74;48266:81;;48182:173;;;:::o;51565:194::-;51623:4;51640:13;51656:3;;;;;;;;;;;:9;;;51666:4;51656:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;51656:15:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;51656:15:0;;;;;;;101:4:-1;97:9;90:4;84;80:15;76:31;69:5;65:43;126:6;120:4;113:20;0:138;51656:15:0;;;;;;;;;51640:31;;51698:10;51689:19;;:5;:19;;;:62;;;;51712:14;:20;51727:4;51712:20;;;;;;;;;;;:27;51733:5;51712:27;;;;;;;;;;;;;;;:39;51740:10;51712:39;;;;;;;;;;;;;;;;;;;;;;;;;51689:62;51682:69;;;51565:194;;;:::o;31826:186::-;31901:21;;:::i;:::-;31946:4;31935:3;:8;;:15;;;;31978:6;31961:3;:14;;:23;;;;;31995:9;32000:3;31995:4;:9::i;:::-;31826:186;;;;:::o;32190:123::-;32250:4;32289;:9;;;:16;32274:4;:11;;;:31;;32267:38;;32190:123;;;:::o;33329:168::-;33389:12;33421:68;33441:4;:11;;;33454:34;33465:4;:9;;;33476:4;:11;;;33454:10;:34::i;:::-;33421:4;:9;;;:19;;:68;;;;;:::i;:::-;33414:75;;33329:168;;;:::o;33677:174::-;33738:12;33770:73;33790:4;:16;;;33826:4;:16;;;33808:4;:15;;;:34;33770:4;:9;;;:19;;:73;;;;;:::i;:::-;33763:80;;33677:174;;;:::o;12079:178::-;12156:4;12195:5;:12;12180:4;:11;:27;:69;;;;;12211:38;12218:4;12224:1;12227:5;12234:1;12237:4;:11;12211:6;:38::i;:::-;12180:69;12173:76;;12079:178;;;;:::o;41871:990::-;42098:15;42116:8;:14;42125:4;42116:14;;;;;;;;;;;;42098:32;;42141:16;42170:4;42160:15;;;;;;42141:34;;42186:19;42208:28;42223:6;42231:4;42208;:14;;:28;;;;;:::i;:::-;42186:50;;42251:12;42247:607;;;42337:1;42284:7;:13;42292:4;42284:13;;;;;;;;;;;:22;42298:7;42284:22;;;;;;;;;;;:32;42307:8;42284:32;;;;;;;;;;;:42;42317:8;42284:42;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;:54;42280:138;;42359:16;:22;42376:4;42359:22;;;;;;;;;;;:31;42382:7;42359:31;;;;;;;;;;;:41;42391:8;42359:41;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42280:138;42439:7;:13;42447:4;42439:13;;;;;;;;;;;:22;42453:7;42439:22;;;;;;;;;;;:32;42462:8;42439:32;;;;;;;;;;;:42;42472:8;42439:42;;;;;;;;;;;;;;;;42432:50;;;;:::i;:::-;42519:4;42502:38;42525:4;42531:8;42502:38;;;;;;;;;;;;;;;;42247:607;;;42630:1;42577:7;:13;42585:4;42577:13;;;;;;;;;;;:22;42591:7;42577:22;;;;;;;;;;;:32;42600:8;42577:32;;;;;;;;;;;:42;42610:8;42577:42;;;;;;;;;;;;;;;:49;;;;;;;;;;;;;;;;:54;42573:138;;;42652:16;:22;42669:4;42652:22;;;;;;;;;;;:31;42675:7;42652:31;;;;;;;;;;;:41;42684:8;42652:41;;;;;;;;;;;;:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42573:138;42770:6;42725:7;:13;42733:4;42725:13;;;;;;;;;;;:22;42739:7;42725:22;;;;;;;;;;;:32;42748:8;42725:32;;;;;;;;;;;:42;42758:8;42725:42;;;;;;;;;;;;;;;:51;;;;;;;;;;;;:::i;:::-;;42813:4;42796:46;42819:4;42825:8;42835:6;42796:46;;;;;;;;;;;;;;;;;42247:607;41871:990;;;;;;;;;;:::o;32442:704::-;32519:4;:15;;;32505:4;:11;;:29;;;;;32564:4;:9;;;:16;32549:4;:11;;;:31;32545:70;;32597:7;;32545:70;32653:8;32678:34;32689:4;:9;;;32700:4;:11;;;32678:10;:34::i;:::-;32664:4;:11;;;:48;32653:59;;32778:25;32799:3;32778:4;:9;;;:20;;:25;;;;:::i;:::-;32763:4;:12;;:40;;;;;;;;;;;32821:1;32814:8;;;;32846:25;32867:3;32846:4;:9;;;:20;;:25;;;;:::i;:::-;32833:4;:10;;:38;;;;;;;;;;;32889:1;32882:8;;;;32912:25;32933:3;32912:4;:9;;;:20;;:25;;;;:::i;:::-;32901:4;:8;;:36;;;;;;;;;;;32955:1;32948:8;;;;32996:16;33015:25;33036:3;33015:4;:9;;;:20;;:25;;;;:::i;:::-;32996:44;;;;33058:1;33051:8;;;;33089:3;33070:4;:16;;:22;;;;;33127:11;33121:3;:17;33103:4;:15;;:35;;;;;32442:704;;;;:::o;1559:209::-;1621:17;1671:2;1659:1;:8;:14;1651:23;;;;;;1746:2;1741:3;1737:12;1731:2;1728:1;1724:10;1718:17;1714:36;1709:41;;1694:67;;;:::o;1776:194::-;1833:14;1874:2;1864:13;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;1864:13:0;;;;1860:17;;1947:2;1942:3;1938:12;1935:1;1931:20;1926:2;1923:1;1919:10;1912:40;1897:66;;;:::o;46786:171::-;46853:4;45952:10;46892:17;;46877:32;;;:11;:32;;;;:72;;;;46913:36;46937:11;46913:23;:36::i;:::-;46877:72;46870:79;;46786:171;;;:::o;29863:378::-;29937:4;29954:8;29965:6;29954:17;;29982:222;29989:4;29982:222;;;30023:4;:11;30017:3;:17;30010:25;;;;30050:13;30066:19;30081:3;30066:4;:14;;:19;;;;:::i;:::-;30050:35;;;;30118:1;30107:8;:12;30100:19;;;;30150:1;30138:8;:13;30134:59;;;30172:5;;;30134:59;29982:222;;;;30227:6;30221:3;:12;30214:19;;;29863:378;;;;:::o;15956:407::-;16039:12;16088:4;:11;16081:3;16072:6;:12;:27;;16064:36;;;;;;16113:16;16142:3;16132:14;;;;;;;;;;;;;;;;;;;;;;;;;29:1:-1;21:6;17:14;116:4;104:10;96:6;87:34;147:4;139:6;135:17;125:27;;0:156;16132:14:0;;;;16113:33;;16157:9;16177:8;16239:2;16234:3;16230:12;16222:20;;16282:6;16277:2;16271:4;16267:13;16263:26;16256:33;;16310:22;16317:4;16323:3;16328;16310:6;:22::i;:::-;16352:3;16345:10;;;;;15956:407;;;;;:::o;10409:211::-;10528:4;10581:31;10588:5;10595:11;10608:3;10581:6;:31::i;:::-;10552:25;10559:4;10565:6;10573:3;10552:6;:25::i;:::-;:60;10545:67;;10409:211;;;;;;;:::o;12883:228::-;12955:10;12997:4;:11;12992:1;12986:3;:7;:22;;12978:31;;;;;;13086:6;13079:3;13075:1;13069:4;13065:12;13061:22;13055:29;13051:42;13044:49;;13029:75;;;;:::o;13363:232::-;13435:10;13477:4;:11;13472:1;13466:3;:7;:22;;13458:31;;;;;;13566:10;13559:3;13555:1;13549:4;13545:12;13541:22;13535:29;13531:46;13524:53;;13509:79;;;;:::o;45603:176::-;45670:4;43072:49;;;;;;;;;;;;;;45694:37;;;:11;:37;;;;:77;;;;45735:36;45759:11;45735:23;:36::i;:::-;45694:77;45687:84;;45603:176;;;:::o;12507:124::-;12578:9;12613:4;12618:3;12613:9;;;;;;;;;;;;;;;;12607:16;;12600:23;;12507:124;;;;:::o;15162:566::-;15284:171;15298:2;15291:3;:9;15284:171;;15375:3;15369:10;15363:4;15356:24;15417:2;15409:10;;;;15441:2;15434:9;;;;15309:2;15302:9;;;;15284:171;;;15500:9;15532:1;15525:3;15520:2;:8;15512:3;:17;:21;15500:33;;15603:4;15599:9;15593:3;15587:10;15583:26;15656:4;15649;15643:11;15639:22;15701:7;15691:8;15688:21;15682:4;15675:35;15553:168;;;;;;:::o;7358:243::-;7439:11;7487:4;:11;7480:3;7471:6;:12;:27;;7463:36;;;;;;7579:3;7570:6;7565:2;7559:4;7555:13;7551:26;7541:42;7534:49;;7519:75;;;;;:::o;41686:177::-;41753:4;36973:10;41792:23;;41777:38;;;:11;:38;;;;:78;;;;41819:36;41843:11;41819:23;:36::i;:::-;41777:78;41770:85;;41686:177;;;:::o;6793:179::-;6860:4;5974:10;6899:25;;6884:40;;;:11;:40;;;;:80;;;;6928:36;6952:11;6928:23;:36::i;:::-;6884:80;6877:87;;6793:179;;;:::o;5569:210::-;5636:4;4038:10;5675:17;;5660:32;;;:11;:32;;;;:71;;;;4102:10;5711:20;;5696:35;;;:11;:35;;;;5660:71;:111;;;;5735:36;5759:11;5735:23;:36::i;:::-;5660:111;5653:118;;5569:210;;;:::o;3695:170::-;3762:4;2140:10;3801:16;;3786:31;;;:11;:31;;;;:71;;;;3821:36;3845:11;3821:23;:36::i;:::-;3786:71;3779:78;;3695:170;;;:::o;1248:131::-;1315:4;1229:10;1354:17;;1339:32;;;:11;:32;;;;1332:39;;1248:131;;;:::o;49922:2222::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:134;;226:6;220:13;211:22;;238:33;265:5;238:33;;;205:71;;;;;299:359;;;436:3;429:4;421:6;417:17;413:27;403:2;;454:1;451;444:12;403:2;487:6;474:20;464:30;;514:18;506:6;503:30;500:2;;;546:1;543;536:12;500:2;580:4;572:6;568:17;556:29;;631:3;623:4;615:6;611:17;601:8;597:32;594:41;591:2;;;648:1;645;638:12;591:2;396:262;;;;;;666:124;;743:6;730:20;721:29;;755:30;779:5;755:30;;;715:75;;;;;797:130;;877:6;864:20;855:29;;889:33;916:5;889:33;;;849:78;;;;;934:128;;1013:6;1000:20;991:29;;1025:32;1051:5;1025:32;;;985:77;;;;;1083:336;;;1197:3;1190:4;1182:6;1178:17;1174:27;1164:2;;1215:1;1212;1205:12;1164:2;1248:6;1235:20;1225:30;;1275:18;1267:6;1264:30;1261:2;;;1307:1;1304;1297:12;1261:2;1341:4;1333:6;1329:17;1317:29;;1392:3;1384:4;1376:6;1372:17;1362:8;1358:32;1355:41;1352:2;;;1409:1;1406;1399:12;1352:2;1157:262;;;;;;1428:440;;1529:3;1522:4;1514:6;1510:17;1506:27;1496:2;;1547:1;1544;1537:12;1496:2;1584:6;1571:20;1606:64;1621:48;1662:6;1621:48;;;1606:64;;;1597:73;;1690:6;1683:5;1676:21;1726:4;1718:6;1714:17;1759:4;1752:5;1748:16;1794:3;1785:6;1780:3;1776:16;1773:25;1770:2;;;1811:1;1808;1801:12;1770:2;1821:41;1855:6;1850:3;1845;1821:41;;;1489:379;;;;;;;;1891:337;;;2006:3;1999:4;1991:6;1987:17;1983:27;1973:2;;2024:1;2021;2014:12;1973:2;2057:6;2044:20;2034:30;;2084:18;2076:6;2073:30;2070:2;;;2116:1;2113;2106:12;2070:2;2150:4;2142:6;2138:17;2126:29;;2201:3;2193:4;2185:6;2181:17;2171:8;2167:32;2164:41;2161:2;;;2218:1;2215;2208:12;2161:2;1966:262;;;;;;2236:128;;2315:6;2302:20;2293:29;;2327:32;2353:5;2327:32;;;2287:77;;;;;2371:130;;2451:6;2438:20;2429:29;;2463:33;2490:5;2463:33;;;2423:78;;;;;2508:263;;2623:2;2611:9;2602:7;2598:23;2594:32;2591:2;;;2639:1;2636;2629:12;2591:2;2674:1;2691:64;2747:7;2738:6;2727:9;2723:22;2691:64;;;2681:74;;2653:108;2585:186;;;;;2778:411;;;2924:2;2912:9;2903:7;2899:23;2895:32;2892:2;;;2940:1;2937;2930:12;2892:2;3003:1;2992:9;2988:17;2975:31;3026:18;3018:6;3015:30;3012:2;;;3058:1;3055;3048:12;3012:2;3086:87;3165:7;3156:6;3145:9;3141:22;3086:87;;;3076:97;;;;2954:225;2886:303;;;;;;3196:241;;3300:2;3288:9;3279:7;3275:23;3271:32;3268:2;;;3316:1;3313;3306:12;3268:2;3351:1;3368:53;3413:7;3404:6;3393:9;3389:22;3368:53;;;3358:63;;3330:97;3262:175;;;;;3444:366;;;3565:2;3553:9;3544:7;3540:23;3536:32;3533:2;;;3581:1;3578;3571:12;3533:2;3616:1;3633:53;3678:7;3669:6;3658:9;3654:22;3633:53;;;3623:63;;3595:97;3723:2;3741:53;3786:7;3777:6;3766:9;3762:22;3741:53;;;3731:63;;3702:98;3527:283;;;;;;3817:491;;;;3955:2;3943:9;3934:7;3930:23;3926:32;3923:2;;;3971:1;3968;3961:12;3923:2;4006:1;4023:53;4068:7;4059:6;4048:9;4044:22;4023:53;;;4013:63;;3985:97;4113:2;4131:53;4176:7;4167:6;4156:9;4152:22;4131:53;;;4121:63;;4092:98;4221:2;4239:53;4284:7;4275:6;4264:9;4260:22;4239:53;;;4229:63;;4200:98;3917:391;;;;;;4315:485;;;;4450:2;4438:9;4429:7;4425:23;4421:32;4418:2;;;4466:1;4463;4456:12;4418:2;4501:1;4518:53;4563:7;4554:6;4543:9;4539:22;4518:53;;;4508:63;;4480:97;4608:2;4626:53;4671:7;4662:6;4651:9;4647:22;4626:53;;;4616:63;;4587:98;4716:2;4734:50;4776:7;4767:6;4756:9;4752:22;4734:50;;;4724:60;;4695:95;4412:388;;;;;;4807:366;;;4928:2;4916:9;4907:7;4903:23;4899:32;4896:2;;;4944:1;4941;4934:12;4896:2;4979:1;4996:53;5041:7;5032:6;5021:9;5017:22;4996:53;;;4986:63;;4958:97;5086:2;5104:53;5149:7;5140:6;5129:9;5125:22;5104:53;;;5094:63;;5065:98;4890:283;;;;;;5180:491;;;;5318:2;5306:9;5297:7;5293:23;5289:32;5286:2;;;5334:1;5331;5324:12;5286:2;5369:1;5386:53;5431:7;5422:6;5411:9;5407:22;5386:53;;;5376:63;;5348:97;5476:2;5494:53;5539:7;5530:6;5519:9;5515:22;5494:53;;;5484:63;;5455:98;5584:2;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;;;5592:63;;5563:98;5280:391;;;;;;5678:489;;;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5866:1;5883:53;5928:7;5919:6;5908:9;5904:22;5883:53;;;5873:63;;5845:97;5973:2;5991:53;6036:7;6027:6;6016:9;6012:22;5991:53;;;5981:63;;5952:98;6081:2;6099:52;6143:7;6134:6;6123:9;6119:22;6099:52;;;6089:62;;6060:97;5777:390;;;;;;6174:364;;;6294:2;6282:9;6273:7;6269:23;6265:32;6262:2;;;6310:1;6307;6300:12;6262:2;6345:1;6362:53;6407:7;6398:6;6387:9;6383:22;6362:53;;;6352:63;;6324:97;6452:2;6470:52;6514:7;6505:6;6494:9;6490:22;6470:52;;;6460:62;;6431:97;6256:282;;;;;;6545:489;;;;6682:2;6670:9;6661:7;6657:23;6653:32;6650:2;;;6698:1;6695;6688:12;6650:2;6733:1;6750:53;6795:7;6786:6;6775:9;6771:22;6750:53;;;6740:63;;6712:97;6840:2;6858:52;6902:7;6893:6;6882:9;6878:22;6858:52;;;6848:62;;6819:97;6947:2;6965:53;7010:7;7001:6;6990:9;6986:22;6965:53;;;6955:63;;6926:98;6644:390;;;;;;7041:490;;;;7181:2;7169:9;7160:7;7156:23;7152:32;7149:2;;;7197:1;7194;7187:12;7149:2;7232:1;7249:53;7294:7;7285:6;7274:9;7270:22;7249:53;;;7239:63;;7211:97;7367:2;7356:9;7352:18;7339:32;7391:18;7383:6;7380:30;7377:2;;;7423:1;7420;7413:12;7377:2;7451:64;7507:7;7498:6;7487:9;7483:22;7451:64;;;7441:74;;;;7318:203;7143:388;;;;;;7538:492;;;;7679:2;7667:9;7658:7;7654:23;7650:32;7647:2;;;7695:1;7692;7685:12;7647:2;7730:1;7747:53;7792:7;7783:6;7772:9;7768:22;7747:53;;;7737:63;;7709:97;7865:2;7854:9;7850:18;7837:32;7889:18;7881:6;7878:30;7875:2;;;7921:1;7918;7911:12;7875:2;7949:65;8006:7;7997:6;7986:9;7982:22;7949:65;;;7939:75;;;;7816:204;7641:389;;;;;;8037:743;;;;;;8215:2;8203:9;8194:7;8190:23;8186:32;8183:2;;;8231:1;8228;8221:12;8183:2;8266:1;8283:53;8328:7;8319:6;8308:9;8304:22;8283:53;;;8273:63;;8245:97;8401:2;8390:9;8386:18;8373:32;8425:18;8417:6;8414:30;8411:2;;;8457:1;8454;8447:12;8411:2;8485:65;8542:7;8533:6;8522:9;8518:22;8485:65;;;8475:75;;;;8352:204;8615:2;8604:9;8600:18;8587:32;8639:18;8631:6;8628:30;8625:2;;;8671:1;8668;8661:12;8625:2;8699:65;8756:7;8747:6;8736:9;8732:22;8699:65;;;8689:75;;;;8566:204;8177:603;;;;;;;;;8787:366;;;8908:2;8896:9;8887:7;8883:23;8879:32;8876:2;;;8924:1;8921;8914:12;8876:2;8959:1;8976:53;9021:7;9012:6;9001:9;8997:22;8976:53;;;8966:63;;8938:97;9066:2;9084:53;9129:7;9120:6;9109:9;9105:22;9084:53;;;9074:63;;9045:98;8870:283;;;;;;9160:615;;;;;9317:2;9305:9;9296:7;9292:23;9288:32;9285:2;;;9333:1;9330;9323:12;9285:2;9368:1;9385:53;9430:7;9421:6;9410:9;9406:22;9385:53;;;9375:63;;9347:97;9475:2;9493:53;9538:7;9529:6;9518:9;9514:22;9493:53;;;9483:63;;9454:98;9611:2;9600:9;9596:18;9583:32;9635:18;9627:6;9624:30;9621:2;;;9667:1;9664;9657:12;9621:2;9695:64;9751:7;9742:6;9731:9;9727:22;9695:64;;;9685:74;;;;9562:203;9279:496;;;;;;;;9782:595;;;;9929:2;9917:9;9908:7;9904:23;9900:32;9897:2;;;9945:1;9942;9935:12;9897:2;9980:1;9997:53;10042:7;10033:6;10022:9;10018:22;9997:53;;;9987:63;;9959:97;10087:2;10105:53;10150:7;10141:6;10130:9;10126:22;10105:53;;;10095:63;;10066:98;10223:2;10212:9;10208:18;10195:32;10247:18;10239:6;10236:30;10233:2;;;10279:1;10276;10269:12;10233:2;10299:62;10353:7;10344:6;10333:9;10329:22;10299:62;;;10289:72;;10174:193;9891:486;;;;;;10384:239;;10487:2;10475:9;10466:7;10462:23;10458:32;10455:2;;;10503:1;10500;10493:12;10455:2;10538:1;10555:52;10599:7;10590:6;10579:9;10575:22;10555:52;;;10545:62;;10517:96;10449:174;;;;;10631:177;;10742:60;10798:3;10790:6;10742:60;;;10728:74;;10721:87;;;;;10816:142;10907:45;10946:5;10907:45;;;10902:3;10895:58;10889:69;;;10965:137;11064:32;11090:5;11064:32;;;11059:3;11052:45;11046:56;;;11109:113;11192:24;11210:5;11192:24;;;11187:3;11180:37;11174:48;;;11256:888;;11411:59;11464:5;11411:59;;;11483:91;11567:6;11562:3;11483:91;;;11476:98;;11597:3;11639:4;11631:6;11627:17;11622:3;11618:27;11666:61;11721:5;11666:61;;;11747:7;11775:1;11760:345;11785:6;11782:1;11779:13;11760:345;;;11847:9;11841:4;11837:20;11832:3;11825:33;11892:6;11886:13;11914:74;11983:4;11968:13;11914:74;;;11906:82;;12005:65;12063:6;12005:65;;;11995:75;;12093:4;12088:3;12084:14;12077:21;;11817:288;11807:1;11804;11800:9;11795:14;;11760:345;;;11764:14;12118:4;12111:11;;12135:3;12128:10;;11390:754;;;;;;;;;;12152:104;12229:21;12244:5;12229:21;;;12224:3;12217:34;12211:45;;;12263:113;12346:24;12364:5;12346:24;;;12341:3;12334:37;12328:48;;;12383:110;12464:23;12481:5;12464:23;;;12459:3;12452:36;12446:47;;;12523:297;;12637:70;12700:6;12695:3;12637:70;;;12630:77;;12719:43;12755:6;12750:3;12743:5;12719:43;;;12784:29;12806:6;12784:29;;;12779:3;12775:39;12768:46;;12623:197;;;;;;12851:306;;12979:88;13060:6;13055:3;12979:88;;;12972:95;;13079:43;13115:6;13110:3;13103:5;13079:43;;;13144:6;13139:3;13135:16;13128:23;;12965:192;;;;;;13165:343;;13275:38;13307:5;13275:38;;;13325:70;13388:6;13383:3;13325:70;;;13318:77;;13400:52;13445:6;13440:3;13433:4;13426:5;13422:16;13400:52;;;13473:29;13495:6;13473:29;;;13468:3;13464:39;13457:46;;13255:253;;;;;;13515:356;;13643:38;13675:5;13643:38;;;13693:88;13774:6;13769:3;13693:88;;;13686:95;;13786:52;13831:6;13826:3;13819:4;13812:5;13808:16;13786:52;;;13859:6;13854:3;13850:16;13843:23;;13623:248;;;;;;13878:315;;13974:34;14002:5;13974:34;;;14020:60;14073:6;14068:3;14020:60;;;14013:67;;14085:52;14130:6;14125:3;14118:4;14111:5;14107:16;14085:52;;;14158:29;14180:6;14158:29;;;14153:3;14149:39;14142:46;;13954:239;;;;;;14225:300;;14341:71;14405:6;14400:3;14341:71;;;14334:78;;14424:43;14460:6;14455:3;14448:5;14424:43;;;14489:29;14511:6;14489:29;;;14484:3;14480:39;14473:46;;14327:198;;;;;;14558:313;;14692:89;14774:6;14769:3;14692:89;;;14685:96;;14793:43;14829:6;14824:3;14817:5;14793:43;;;14858:6;14853:3;14849:16;14842:23;;14678:193;;;;;;14879:347;;14991:39;15024:5;14991:39;;;15042:71;15106:6;15101:3;15042:71;;;15035:78;;15118:52;15163:6;15158:3;15151:4;15144:5;15140:16;15118:52;;;15191:29;15213:6;15191:29;;;15186:3;15182:39;15175:46;;14971:255;;;;;;15234:409;;15412:85;15494:2;15489:3;15412:85;;;15405:92;;15530:34;15526:1;15521:3;15517:11;15510:55;15599:6;15594:2;15589:3;15585:12;15578:28;15634:2;15629:3;15625:12;15618:19;;15398:245;;;;15651:110;15732:23;15749:5;15732:23;;;15727:3;15720:36;15714:47;;;15768:113;15851:24;15869:5;15851:24;;;15846:3;15839:37;15833:48;;;15888:274;;16038:99;16133:3;16124:6;16116;16038:99;;;16031:106;;16154:3;16147:10;;16019:143;;;;;;16169:262;;16313:93;16402:3;16393:6;16313:93;;;16306:100;;16423:3;16416:10;;16294:137;;;;;16438:286;;16594:105;16695:3;16686:6;16678;16594:105;;;16587:112;;16716:3;16709:10;;16575:149;;;;;;16731:372;;16930:148;17074:3;16930:148;;;16923:155;;17095:3;17088:10;;16911:192;;;;17110:213;;17228:2;17217:9;17213:18;17205:26;;17242:71;17310:1;17299:9;17295:17;17286:6;17242:71;;;17199:124;;;;;17330:229;;17456:2;17445:9;17441:18;17433:26;;17470:79;17546:1;17535:9;17531:17;17522:6;17470:79;;;17427:132;;;;;17566:245;;17700:2;17689:9;17685:18;17677:26;;17714:87;17798:1;17787:9;17783:17;17774:6;17714:87;;;17671:140;;;;;17818:381;;17996:2;17985:9;17981:18;17973:26;;18046:9;18040:4;18036:20;18032:1;18021:9;18017:17;18010:47;18071:118;18184:4;18175:6;18071:118;;;18063:126;;17967:232;;;;;18206:201;;18318:2;18307:9;18303:18;18295:26;;18332:65;18394:1;18383:9;18379:17;18370:6;18332:65;;;18289:118;;;;;18414:213;;18532:2;18521:9;18517:18;18509:26;;18546:71;18614:1;18603:9;18599:17;18590:6;18546:71;;;18503:124;;;;;18634:324;;18780:2;18769:9;18765:18;18757:26;;18794:71;18862:1;18851:9;18847:17;18838:6;18794:71;;;18876:72;18944:2;18933:9;18929:18;18920:6;18876:72;;;18751:207;;;;;;18965:209;;19081:2;19070:9;19066:18;19058:26;;19095:69;19161:1;19150:9;19146:17;19137:6;19095:69;;;19052:122;;;;;19181:317;;19327:2;19316:9;19312:18;19304:26;;19377:9;19371:4;19367:20;19363:1;19352:9;19348:17;19341:47;19402:86;19483:4;19474:6;19466;19402:86;;;19394:94;;19298:200;;;;;;19505:297;;19641:2;19630:9;19626:18;19618:26;;19691:9;19685:4;19681:20;19677:1;19666:9;19662:17;19655:47;19716:76;19787:4;19778:6;19716:76;;;19708:84;;19612:190;;;;;19809:404;;19971:2;19960:9;19956:18;19948:26;;20021:9;20015:4;20011:20;20007:1;19996:9;19992:17;19985:47;20046:76;20117:4;20108:6;20046:76;;;20038:84;;20133:70;20199:2;20188:9;20184:18;20175:6;20133:70;;;19942:271;;;;;;20220:599;;20428:2;20417:9;20413:18;20405:26;;20478:9;20472:4;20468:20;20464:1;20453:9;20449:17;20442:47;20503:76;20574:4;20565:6;20503:76;;;20495:84;;20590:70;20656:2;20645:9;20641:18;20632:6;20590:70;;;20708:9;20702:4;20698:20;20693:2;20682:9;20678:18;20671:48;20733:76;20804:4;20795:6;20733:76;;;20725:84;;20399:420;;;;;;;20826:321;;20974:2;20963:9;20959:18;20951:26;;21024:9;21018:4;21014:20;21010:1;20999:9;20995:17;20988:47;21049:88;21132:4;21123:6;21115;21049:88;;;21041:96;;20945:202;;;;;;21154:301;;21292:2;21281:9;21277:18;21269:26;;21342:9;21336:4;21332:20;21328:1;21317:9;21313:17;21306:47;21367:78;21440:4;21431:6;21367:78;;;21359:86;;21263:192;;;;;21462:408;;21626:2;21615:9;21611:18;21603:26;;21640:71;21708:1;21697:9;21693:17;21684:6;21640:71;;;21759:9;21753:4;21749:20;21744:2;21733:9;21729:18;21722:48;21784:76;21855:4;21846:6;21784:76;;;21776:84;;21597:273;;;;;;21877:256;;21939:2;21933:9;21923:19;;21977:4;21969:6;21965:17;22076:6;22064:10;22061:22;22040:18;22028:10;22025:34;22022:62;22019:2;;;22097:1;22094;22087:12;22019:2;22117:10;22113:2;22106:22;21917:216;;;;;22140:321;;22283:18;22275:6;22272:30;22269:2;;;22315:1;22312;22305:12;22269:2;22382:4;22378:9;22371:4;22363:6;22359:17;22355:33;22347:41;;22446:4;22440;22436:15;22428:23;;22206:255;;;;22468:156;;22559:3;22551:11;;22597:4;22592:3;22588:14;22580:22;;22545:79;;;;22631:142;;22745:5;22739:12;22729:22;;22710:63;;;;22780:117;;22869:5;22863:12;22853:22;;22834:63;;;;22904:121;;22997:5;22991:12;22981:22;;22962:63;;;;23032:122;;23126:5;23120:12;23110:22;;23091:63;;;;23161:113;;23264:4;23259:3;23255:14;23247:22;;23241:33;;;;23282:183;;23417:6;23412:3;23405:19;23454:4;23449:3;23445:14;23430:29;;23398:67;;;;;23474:152;;23578:6;23573:3;23566:19;23615:4;23610:3;23606:14;23591:29;;23559:67;;;;;23635:162;;23749:6;23744:3;23737:19;23786:4;23781:3;23777:14;23762:29;;23730:67;;;;;23806:144;;23941:3;23926:18;;23919:31;;;;;23959:163;;24074:6;24069:3;24062:19;24111:4;24106:3;24102:14;24087:29;;24055:67;;;;;24131:145;;24267:3;24252:18;;24245:31;;;;;24284:91;;24346:24;24364:5;24346:24;;;24335:35;;24329:46;;;;24382:99;;24452:24;24470:5;24452:24;;;24441:35;;24435:46;;;;24488:85;;24561:5;24554:13;24547:21;24536:32;;24530:43;;;;24580:72;;24642:5;24631:16;;24625:27;;;;24659:144;;24731:66;24724:5;24720:78;24709:89;;24703:100;;;;24810:84;;24882:6;24875:5;24871:18;24860:29;;24854:40;;;;24901:121;;24974:42;24967:5;24963:54;24952:65;;24946:76;;;;25029:72;;25091:5;25080:16;;25074:27;;;;25108:129;;25195:37;25226:5;25195:37;;;25182:50;;25176:61;;;;25244:121;;25323:37;25354:5;25323:37;;;25310:50;;25304:61;;;;25372:108;;25451:24;25469:5;25451:24;;;25438:37;;25432:48;;;;25488:145;25569:6;25564:3;25559;25546:30;25625:1;25616:6;25611:3;25607:16;25600:27;25539:94;;;;25642:268;25707:1;25714:101;25728:6;25725:1;25722:13;25714:101;;;25804:1;25799:3;25795:11;25789:18;25785:1;25780:3;25776:11;25769:39;25750:2;25747:1;25743:10;25738:15;;25714:101;;;25830:6;25827:1;25824:13;25821:2;;;25895:1;25886:6;25881:3;25877:16;25870:27;25821:2;25691:219;;;;;25918:97;;26006:2;26002:7;25997:2;25990:5;25986:14;25982:28;25972:38;;25966:49;;;;26023:117;26092:24;26110:5;26092:24;;;26085:5;26082:35;26072:2;;26131:1;26128;26121:12;26072:2;26066:74;;26147:111;26213:21;26228:5;26213:21;;;26206:5;26203:32;26193:2;;26249:1;26246;26239:12;26193:2;26187:71;;26265:117;26334:24;26352:5;26334:24;;;26327:5;26324:35;26314:2;;26373:1;26370;26363:12;26314:2;26308:74;;26389:115;26457:23;26474:5;26457:23;;;26450:5;26447:34;26437:2;;26495:1;26492;26485:12;26437:2;26431:73;;26511:115;26579:23;26596:5;26579:23;;;26572:5;26569:34;26559:2;;26617:1;26614;26607:12;26559:2;26553:73;;26633:117;26702:24;26720:5;26702:24;;;26695:5;26692:35;26682:2;;26741:1;26738;26731:12;26682:2;26676:74;
Swarm Source
bzzr://87f3e3c017932ceb01fcdc5a3900c19b41d676b9e0813504bedb22dfb4995a2e
Loading...
Loading
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A contract address hosts a smart contract, which is a set of code stored on the blockchain that runs when predetermined conditions are met. Learn more about addresses in our Knowledge Base.