Feature Tip: Add private address tag to any address under My Name Tag !
More Info
Private Name Tags
ContractCreator
Transaction Hash |
Method
|
Block
|
From
|
To
|
|||||
---|---|---|---|---|---|---|---|---|---|
0xb0f9d6758856183686efd5b2ef2887fea0428ec11e37fc5a71bd6139be9122ee | Relay | (pending) | 27 hrs ago | IN | 0 ETH | (Pending) | |||
0x83b80b2cebea0a39d86fd77ff1988851db3798d1c120c51f6670c16b8f43f2e5 | Relay | (pending) | 42 hrs ago | IN | 0 ETH | (Pending) | |||
Relay | 20453048 | 253 days ago | IN | 0 ETH | 0.00005021 | ||||
Relay | 20453037 | 253 days ago | IN | 0 ETH | 0.00005026 | ||||
Relay | 20409110 | 259 days ago | IN | 0 ETH | 0.00005021 | ||||
Relay | 20408456 | 259 days ago | IN | 0 ETH | 0.00005023 | ||||
Relay | 20402514 | 260 days ago | IN | 0 ETH | 0.00025125 | ||||
Relay | 20402514 | 260 days ago | IN | 0 ETH | 0.00005023 | ||||
Relay | 20402514 | 260 days ago | IN | 0 ETH | 0.00005028 | ||||
Relay | 20402514 | 260 days ago | IN | 0 ETH | 0.00005025 | ||||
Relay | 19329934 | 410 days ago | IN | 0 ETH | 0.00331887 | ||||
Relay | 15430169 | 959 days ago | IN | 0 ETH | 0.00181188 | ||||
Relay | 15430169 | 959 days ago | IN | 0 ETH | 0.00377475 | ||||
Relay | 15430169 | 959 days ago | IN | 0 ETH | 0.00216419 | ||||
Relay | 15291925 | 981 days ago | IN | 0 ETH | 0.00040171 | ||||
Relay | 15291924 | 981 days ago | IN | 0 ETH | 0.00040171 | ||||
Relay | 15291924 | 981 days ago | IN | 0 ETH | 0.00030128 | ||||
Relay | 15291924 | 981 days ago | IN | 0 ETH | 0.00040171 | ||||
Relay | 15291924 | 981 days ago | IN | 0 ETH | 0.00015064 | ||||
Relay | 15247410 | 988 days ago | IN | 0 ETH | 0.00015102 | ||||
Relay | 15247274 | 988 days ago | IN | 0 ETH | 0.00025161 | ||||
Relay | 15247274 | 988 days ago | IN | 0 ETH | 0.00015096 | ||||
Relay | 15243642 | 989 days ago | IN | 0 ETH | 0.00015095 | ||||
Relay | 14865635 | 1051 days ago | IN | 0 ETH | 0.00715026 | ||||
Relay | 14865635 | 1051 days ago | IN | 0 ETH | 0.00708525 |
Latest 25 internal transactions (View All)
Advanced mode:
Parent Transaction Hash | Method | Block |
From
|
To
|
|||
---|---|---|---|---|---|---|---|
- | 12770514 | 1378 days ago | 0.00892343 ETH | ||||
- | 12681834 | 1392 days ago | 0.011 ETH | ||||
- | 12018924 | 1495 days ago | 0.03 ETH | ||||
- | 11550393 | 1567 days ago | 0.27497829 ETH | ||||
- | 11550393 | 1567 days ago | 0.12768134 ETH | ||||
- | 11550393 | 1567 days ago | 0.19477384 ETH | ||||
- | 11550393 | 1567 days ago | 0.2848663 ETH | ||||
- | 11550393 | 1567 days ago | 0.17375184 ETH | ||||
- | 11549021 | 1567 days ago | 0.20916157 ETH | ||||
- | 11549021 | 1567 days ago | 0.17739252 ETH | ||||
- | 11549021 | 1567 days ago | 0.22937063 ETH | ||||
- | 11549021 | 1567 days ago | 0.19149555 ETH | ||||
- | 11549021 | 1567 days ago | 0.14239799 ETH | ||||
- | 11549021 | 1567 days ago | 0.20797732 ETH | ||||
- | 11549021 | 1567 days ago | 0.14272681 ETH | ||||
- | 11549021 | 1567 days ago | 0.14388924 ETH | ||||
- | 11549021 | 1567 days ago | 0.27078444 ETH | ||||
- | 11549021 | 1567 days ago | 0.26216711 ETH | ||||
- | 11549021 | 1567 days ago | 0.2454537 ETH | ||||
- | 11549021 | 1567 days ago | 0.23864561 ETH | ||||
- | 11549021 | 1567 days ago | 0.2434721 ETH | ||||
- | 11549021 | 1567 days ago | 0.2269162 ETH | ||||
- | 11549021 | 1567 days ago | 0.2328762 ETH | ||||
- | 11549021 | 1567 days ago | 0.18386875 ETH | ||||
- | 11549021 | 1567 days ago | 0.19732331 ETH |
Loading...
Loading
Contract Name:
WhitelistedMinter
Compiler Version
v0.5.12+commit.7709ece9
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2020-10-06 */ pragma solidity 0.5.12; pragma experimental ABIEncoderV2; /** * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations. * * These functions can be used to verify that a message was signed by the holder * of the private keys of a given address. */ library ECDSA { /** * @dev Returns the address that signed a hashed message (`hash`) with * `signature`. This address can then be used for verification purposes. * * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures: * this function rejects them by requiring the `s` value to be in the lower * half order, and the `v` value to be either 27 or 28. * * (.note) This call _does not revert_ if the signature is invalid, or * if the signer is otherwise unable to be retrieved. In those scenarios, * the zero address is returned. * * (.warning) `hash` _must_ be the result of a hash operation for the * verification to be secure: it is possible to craft signatures that * recover to arbitrary addresses for non-hashed data. A safe way to ensure * this is by receiving a hash of the original message (which may otherwise) * be too long), and then calling `toEthSignedMessageHash` on it. */ function recover(bytes32 hash, bytes memory signature) internal pure returns (address) { // Check the signature length if (signature.length != 65) { return (address(0)); } // Divide the signature in r, s and v variables bytes32 r; bytes32 s; uint8 v; // ecrecover takes the signature parameters, and the only way to get them // currently is to use assembly. // solhint-disable-next-line no-inline-assembly assembly { r := mload(add(signature, 0x20)) s := mload(add(signature, 0x40)) v := byte(0, mload(add(signature, 0x60))) } // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most // signatures from current libraries generate a unique signature with an s-value in the lower half order. // // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept // these malleable signatures as well. if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) { return address(0); } if (v != 27 && v != 28) { return address(0); } // If the signature is valid (and not malleable), return the signer address return ecrecover(hash, v, r, s); } /** * @dev Returns an Ethereum Signed Message, created from a `hash`. This * replicates the behavior of the * [`eth_sign`](https://github.com/ethereum/wiki/wiki/JSON-RPC#eth_sign) * JSON-RPC method. * * See `recover`. */ function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) { // 32 is the length in bytes of hash, // enforced by the type signature above return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash)); } } /** * @title Roles * @dev Library for managing addresses assigned to a Role. */ library Roles { struct Role { mapping (address => bool) bearer; } /** * @dev Give an account access to this role. */ function add(Role storage role, address account) internal { require(!has(role, account), "Roles: account already has role"); role.bearer[account] = true; } /** * @dev Remove an account's access to this role. */ function remove(Role storage role, address account) internal { require(has(role, account), "Roles: account does not have role"); role.bearer[account] = false; } /** * @dev Check if an account has this role. * @return bool */ function has(Role storage role, address account) internal view returns (bool) { require(account != address(0), "Roles: account is the zero address"); return role.bearer[account]; } } /** * @title WhitelistAdminRole * @dev WhitelistAdmins are responsible for assigning and removing Whitelisted accounts. */ contract WhitelistAdminRole { using Roles for Roles.Role; event WhitelistAdminAdded(address indexed account); event WhitelistAdminRemoved(address indexed account); Roles.Role private _whitelistAdmins; constructor () internal { _addWhitelistAdmin(msg.sender); } modifier onlyWhitelistAdmin() { require(isWhitelistAdmin(msg.sender), "WhitelistAdminRole: caller does not have the WhitelistAdmin role"); _; } function isWhitelistAdmin(address account) public view returns (bool) { return _whitelistAdmins.has(account); } function addWhitelistAdmin(address account) public onlyWhitelistAdmin { _addWhitelistAdmin(account); } function renounceWhitelistAdmin() public { _removeWhitelistAdmin(msg.sender); } function _addWhitelistAdmin(address account) internal { _whitelistAdmins.add(account); emit WhitelistAdminAdded(account); } function _removeWhitelistAdmin(address account) internal { _whitelistAdmins.remove(account); emit WhitelistAdminRemoved(account); } } /** * @title WhitelistedRole * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove * it), and not Whitelisteds themselves. */ contract WhitelistedRole is WhitelistAdminRole { using Roles for Roles.Role; event WhitelistedAdded(address indexed account); event WhitelistedRemoved(address indexed account); Roles.Role private _whitelisteds; modifier onlyWhitelisted() { require(isWhitelisted(msg.sender), "WhitelistedRole: caller does not have the Whitelisted role"); _; } function isWhitelisted(address account) public view returns (bool) { return _whitelisteds.has(account); } function addWhitelisted(address account) public onlyWhitelistAdmin { _addWhitelisted(account); } function removeWhitelisted(address account) public onlyWhitelistAdmin { _removeWhitelisted(account); } function renounceWhitelisted() public { _removeWhitelisted(msg.sender); } function _addWhitelisted(address account) internal { _whitelisteds.add(account); emit WhitelistedAdded(account); } function _removeWhitelisted(address account) internal { _whitelisteds.remove(account); emit WhitelistedRemoved(account); } } /** * @title BulkWhitelistedRole * @dev a Whitelist role defined using the Open Zeppelin Role system with the addition of bulkAddWhitelisted and * bulkRemoveWhitelisted. * @dev Whitelisted accounts have been approved by a WhitelistAdmin to perform certain actions (e.g. participate in a * crowdsale). This role is special in that the only accounts that can add it are WhitelistAdmins (who can also remove * it), and not Whitelisteds themselves. */ contract BulkWhitelistedRole is WhitelistedRole { function bulkAddWhitelisted(address[] memory accounts) public onlyWhitelistAdmin { for (uint256 index = 0; index < accounts.length; index++) { _addWhitelisted(accounts[index]); } } function bulkRemoveWhitelisted(address[] memory accounts) public onlyWhitelistAdmin { for (uint256 index = 0; index < accounts.length; index++) { _removeWhitelisted(accounts[index]); } } } interface IMintingController { /** * @dev Minter function that mints a Second Level Domain (SLD). * @param to address to mint the new SLD to. * @param label SLD label to mint. */ function mintSLD(address to, string calldata label) external; /** * @dev Minter function that safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param label SLD label to mint. */ function safeMintSLD(address to, string calldata label) external; /** * @dev Minter function that safely mints a Second Level Domain (SLD). * Implements a ERC721Reciever check unlike mintSLD. * @param to address to mint the new SLD to. * @param label SLD label to mint. * @param _data bytes data to send along with a safe transfer check */ function safeMintSLD(address to, string calldata label, bytes calldata _data) external; } contract MinterRole { using Roles for Roles.Role; event MinterAdded(address indexed account); event MinterRemoved(address indexed account); Roles.Role private _minters; constructor () internal { _addMinter(msg.sender); } modifier onlyMinter() { require(isMinter(msg.sender), "MinterRole: caller does not have the Minter role"); _; } function isMinter(address account) public view returns (bool) { return _minters.has(account); } function addMinter(address account) public onlyMinter { _addMinter(account); } function renounceMinter() public { _removeMinter(msg.sender); } function _addMinter(address account) internal { _minters.add(account); emit MinterAdded(account); } function _removeMinter(address account) internal { _minters.remove(account); emit MinterRemoved(account); } } /** * @dev Interface of the ERC165 standard, as defined in the * [EIP](https://eips.ethereum.org/EIPS/eip-165). * * Implementers can declare support of contract interfaces, which can then be * queried by others (`ERC165Checker`). * * For an implementation, see `ERC165`. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified) * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ contract IERC721 is IERC165 { event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of NFTs in `owner`'s account. */ function balanceOf(address owner) public view returns (uint256 balance); /** * @dev Returns the owner of the NFT specified by `tokenId`. */ function ownerOf(uint256 tokenId) public view returns (address owner); /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * * * Requirements: * - `from`, `to` cannot be zero. * - `tokenId` must be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this * NFT by either `approve` or `setApproveForAll`. */ function safeTransferFrom(address from, address to, uint256 tokenId) public; /** * @dev Transfers a specific NFT (`tokenId`) from one account (`from`) to * another (`to`). * * Requirements: * - If the caller is not `from`, it must be approved to move this NFT by * either `approve` or `setApproveForAll`. */ function transferFrom(address from, address to, uint256 tokenId) public; function approve(address to, uint256 tokenId) public; function getApproved(uint256 tokenId) public view returns (address operator); function setApprovalForAll(address operator, bool _approved) public; function isApprovedForAll(address owner, address operator) public view returns (bool); function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data) public; } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ contract IERC721Metadata is IERC721 { function name() external view returns (string memory); function symbol() external view returns (string memory); function tokenURI(uint256 tokenId) external view returns (string memory); } contract IRegistry is IERC721Metadata { event NewURI(uint256 indexed tokenId, string uri); event NewURIPrefix(string prefix); event Resolve(uint256 indexed tokenId, address indexed to); event Sync(address indexed resolver, uint256 indexed updateId, uint256 indexed tokenId); /** * @dev Controlled function to set the token URI Prefix for all tokens. * @param prefix string URI to assign */ function controlledSetTokenURIPrefix(string calldata prefix) external; /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool); /** * @dev Mints a new a child token. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token not exist. * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the parent token * @param label subdomain label of the child token ID */ function mintChild(address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled function to mint a given token ID. * Requires the msg.sender to be controller. * Requires the token ID to not exist. * @param to address the given token ID will be minted to * @param label string that is a subdomain * @param tokenId uint256 ID of the parent token */ function controlledMintChild(address to, uint256 tokenId, string calldata label) external; /** * @dev Transfers the ownership of a child token ID to another address. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param label subdomain label of the child token ID */ function transferFromChild(address from, address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled function to transfers the ownership of a token ID to * another address. * Requires the msg.sender to be controller. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function controlledTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Safely transfers the ownership of a child token ID to another address. * Calculates child token ID using a namehash function. * Implements a ERC721Reciever check unlike transferFromChild. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 parent ID of the token to be transferred * @param label subdomain label of the child token ID * @param _data bytes data to send along with a safe transfer check */ function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label, bytes calldata _data) external; /// Shorthand for calling the above ^^^ safeTransferFromChild function with an empty _data parameter. Similar to ERC721.safeTransferFrom. function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label) external; /** * @dev Controlled frunction to safely transfers the ownership of a token ID * to another address. * Implements a ERC721Reciever check unlike controlledSafeTransferFrom. * Requires the msg.sender to be controller. * Requires the token already exist. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 parent ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function controlledSafeTransferFrom(address from, address to, uint256 tokenId, bytes calldata _data) external; /** * @dev Burns a child token ID. * Calculates child token ID using a namehash function. * Requires the msg.sender to be the owner, approved, or operator of tokenId. * Requires the token already exist. * @param tokenId uint256 ID of the token to be transferred * @param label subdomain label of the child token ID */ function burnChild(uint256 tokenId, string calldata label) external; /** * @dev Controlled function to burn a given token ID. * Requires the msg.sender to be controller. * Requires the token already exist. * @param tokenId uint256 ID of the token to be burned */ function controlledBurn(uint256 tokenId) external; /** * @dev Sets the resolver of a given token ID to another address. * Requires the msg.sender to be the owner, approved, or operator. * @param to address the given token ID will resolve to * @param tokenId uint256 ID of the token to be transferred */ function resolveTo(address to, uint256 tokenId) external; /** * @dev Gets the resolver of the specified token ID. * @param tokenId uint256 ID of the token to query the resolver of * @return address currently marked as the resolver of the given token ID */ function resolverOf(uint256 tokenId) external view returns (address); /** * @dev Controlled function to sets the resolver of a given token ID. * Requires the msg.sender to be controller. * @param to address the given token ID will resolve to * @param tokenId uint256 ID of the token to be transferred */ function controlledResolveTo(address to, uint256 tokenId) external; /** * @dev Provides child token (subdomain) of provided tokenId. * @param tokenId uint256 ID of the token * @param label label of subdomain (for `aaa.bbb.crypto` it will be `aaa`) */ function childIdOf(uint256 tokenId, string calldata label) external pure returns (uint256); /** * @dev Transfer domain ownership without resetting domain records. * @param to address of new domain owner * @param tokenId uint256 ID of the token to be transferred */ function setOwner(address to, uint256 tokenId) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ contract IERC721Receiver { /** * @notice Handle the receipt of an NFT * @dev The ERC721 smart contract calls this function on the recipient * after a `safeTransfer`. This function MUST return the function selector, * otherwise the caller will revert the transaction. The selector to be * returned can be obtained as `this.onERC721Received.selector`. This * function MAY throw to revert and reject the transfer. * Note: the ERC721 contract address is always the message sender. * @param operator The address which called `safeTransferFrom` function * @param from The address which previously owned the token * @param tokenId The NFT identifier which is being transferred * @param data Additional data with no specified format * @return bytes4 `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` */ function onERC721Received(address operator, address from, uint256 tokenId, bytes memory data) public returns (bytes4); } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on * overflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot overflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { require(b <= a, "SafeMath: subtraction overflow"); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on * overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the integer division of two unsigned integers. Reverts on * division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, "SafeMath: division by zero"); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { require(b != 0, "SafeMath: modulo by zero"); return a % b; } } /** * @dev Collection of functions related to the address type, */ library Address { /** * @dev Returns true if `account` is a contract. * * This test is non-exhaustive, and there may be false-negatives: during the * execution of a contract's constructor, its address will be reported as * not containing a contract. * * > It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. */ function isContract(address account) internal view returns (bool) { // This method relies in extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented or decremented by one. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` * Since it is not possible to overflow a 256 bit integer with increments of one, `increment` can skip the SafeMath * overflow check, thereby saving gas. This does assume however correct usage, in that the underlying `_value` is never * directly accessed. */ library Counters { using SafeMath for uint256; struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { counter._value += 1; } function decrement(Counter storage counter) internal { counter._value = counter._value.sub(1); } } /** * @dev Implementation of the `IERC165` interface. * * Contracts may inherit from this and call `_registerInterface` to declare * their support of an interface. */ contract ERC165 is IERC165 { /* * bytes4(keccak256('supportsInterface(bytes4)')) == 0x01ffc9a7 */ bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7; /** * @dev Mapping of interface ids to whether or not it's supported. */ mapping(bytes4 => bool) private _supportedInterfaces; constructor () internal { // Derived contracts need only register support for their own interfaces, // we register support for ERC165 itself here _registerInterface(_INTERFACE_ID_ERC165); } /** * @dev See `IERC165.supportsInterface`. * * Time complexity O(1), guaranteed to always use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool) { return _supportedInterfaces[interfaceId]; } /** * @dev Registers the contract as an implementer of the interface defined by * `interfaceId`. Support of the actual ERC165 interface is automatic and * registering its interface id is not required. * * See `IERC165.supportsInterface`. * * Requirements: * * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`). */ function _registerInterface(bytes4 interfaceId) internal { require(interfaceId != 0xffffffff, "ERC165: invalid interface id"); _supportedInterfaces[interfaceId] = true; } } /** * @title ERC721 Non-Fungible Token Standard basic implementation * @dev see https://eips.ethereum.org/EIPS/eip-721 */ contract ERC721 is ERC165, IERC721 { using SafeMath for uint256; using Address for address; using Counters for Counters.Counter; // Equals to `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))` // which can be also obtained as `IERC721Receiver(0).onERC721Received.selector` bytes4 private constant _ERC721_RECEIVED = 0x150b7a02; // Mapping from token ID to owner mapping (uint256 => address) private _tokenOwner; // Mapping from token ID to approved address mapping (uint256 => address) private _tokenApprovals; // Mapping from owner to number of owned token mapping (address => Counters.Counter) private _ownedTokensCount; // Mapping from owner to operator approvals mapping (address => mapping (address => bool)) private _operatorApprovals; /* * bytes4(keccak256('balanceOf(address)')) == 0x70a08231 * bytes4(keccak256('ownerOf(uint256)')) == 0x6352211e * bytes4(keccak256('approve(address,uint256)')) == 0x095ea7b3 * bytes4(keccak256('getApproved(uint256)')) == 0x081812fc * bytes4(keccak256('setApprovalForAll(address,bool)')) == 0xa22cb465 * bytes4(keccak256('isApprovedForAll(address,address)')) == 0xe985e9c * bytes4(keccak256('transferFrom(address,address,uint256)')) == 0x23b872dd * bytes4(keccak256('safeTransferFrom(address,address,uint256)')) == 0x42842e0e * bytes4(keccak256('safeTransferFrom(address,address,uint256,bytes)')) == 0xb88d4fde * * => 0x70a08231 ^ 0x6352211e ^ 0x095ea7b3 ^ 0x081812fc ^ * 0xa22cb465 ^ 0xe985e9c ^ 0x23b872dd ^ 0x42842e0e ^ 0xb88d4fde == 0x80ac58cd */ bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd; constructor () public { // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(_INTERFACE_ID_ERC721); } /** * @dev Gets the balance of the specified address. * @param owner address to query the balance of * @return uint256 representing the amount owned by the passed address */ function balanceOf(address owner) public view returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _ownedTokensCount[owner].current(); } /** * @dev Gets the owner of the specified token ID. * @param tokenId uint256 ID of the token to query the owner of * @return address currently marked as the owner of the given token ID */ function ownerOf(uint256 tokenId) public view returns (address) { address owner = _tokenOwner[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev Approves another address to transfer the given token ID * The zero address indicates there is no approved address. * There can only be one approved address per token at a given time. * Can only be called by the token owner or an approved operator. * @param to address to be approved for the given token ID * @param tokenId uint256 ID of the token to be approved */ function approve(address to, uint256 tokenId) public { address owner = ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require(msg.sender == owner || isApprovedForAll(owner, msg.sender), "ERC721: approve caller is not owner nor approved for all" ); _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Gets the approved address for a token ID, or zero if no address set * Reverts if the token ID does not exist. * @param tokenId uint256 ID of the token to query the approval of * @return address currently approved for the given token ID */ function getApproved(uint256 tokenId) public view returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev Sets or unsets the approval of a given operator * An operator is allowed to transfer all tokens of the sender on their behalf. * @param to operator address to set the approval * @param approved representing the status of the approval to be set */ function setApprovalForAll(address to, bool approved) public { require(to != msg.sender, "ERC721: approve to caller"); _operatorApprovals[msg.sender][to] = approved; emit ApprovalForAll(msg.sender, to, approved); } /** * @dev Tells whether an operator is approved by a given owner. * @param owner owner address which you want to query the approval of * @param operator operator address which you want to query the approval of * @return bool whether the given operator is approved by the given owner */ function isApprovedForAll(address owner, address operator) public view returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev Transfers the ownership of a given token ID to another address. * Usage of this method is discouraged, use `safeTransferFrom` whenever possible. * Requires the msg.sender to be the owner, approved, or operator. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function transferFrom(address from, address to, uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721: transfer caller is not owner nor approved"); _transferFrom(from, to, tokenId); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function safeTransferFrom(address from, address to, uint256 tokenId) public { safeTransferFrom(from, to, tokenId, ""); } /** * @dev Safely transfers the ownership of a given token ID to another address * If the target address is a contract, it must implement `onERC721Received`, * which is called upon a safe transfer, and return the magic value * `bytes4(keccak256("onERC721Received(address,address,uint256,bytes)"))`; otherwise, * the transfer is reverted. * Requires the msg.sender to be the owner, approved, or operator * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred * @param _data bytes data to send along with a safe transfer check */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory _data) public { transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether the specified token exists. * @param tokenId uint256 ID of the token to query the existence of * @return bool whether the token exists */ function _exists(uint256 tokenId) internal view returns (bool) { address owner = _tokenOwner[tokenId]; return owner != address(0); } /** * @dev Returns whether the given spender can transfer a given token ID. * @param spender address of the spender to query * @param tokenId uint256 ID of the token to be transferred * @return bool whether the msg.sender is approved for the given token ID, * is an operator of the owner, or is the owner of the token */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Internal function to mint a new token. * Reverts if the given token ID already exists. * @param to The address that will own the minted token * @param tokenId uint256 ID of the token to be minted */ function _mint(address to, uint256 tokenId) internal { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _tokenOwner[tokenId] = to; _ownedTokensCount[to].increment(); emit Transfer(address(0), to, tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * Deprecated, use _burn(uint256) instead. * @param owner owner of the token to burn * @param tokenId uint256 ID of the token being burned */ function _burn(address owner, uint256 tokenId) internal { require(ownerOf(tokenId) == owner, "ERC721: burn of token that is not own"); _clearApproval(tokenId); _ownedTokensCount[owner].decrement(); _tokenOwner[tokenId] = address(0); emit Transfer(owner, address(0), tokenId); } /** * @dev Internal function to burn a specific token. * Reverts if the token does not exist. * @param tokenId uint256 ID of the token being burned */ function _burn(uint256 tokenId) internal { _burn(ownerOf(tokenId), tokenId); } /** * @dev Internal function to transfer ownership of a given token ID to another address. * As opposed to transferFrom, this imposes no restrictions on msg.sender. * @param from current owner of the token * @param to address to receive the ownership of the given token ID * @param tokenId uint256 ID of the token to be transferred */ function _transferFrom(address from, address to, uint256 tokenId) internal { require(ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _clearApproval(tokenId); _ownedTokensCount[from].decrement(); _ownedTokensCount[to].increment(); _tokenOwner[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Internal function to invoke `onERC721Received` on a target address. * The call is not executed if the target address is not a contract. * * This function is deprecated. * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data) internal returns (bool) { if (!to.isContract()) { return true; } bytes4 retval = IERC721Receiver(to).onERC721Received(msg.sender, from, tokenId, _data); return (retval == _ERC721_RECEIVED); } /** * @dev Private function to clear current approval of a given token ID. * @param tokenId uint256 ID of the token to be transferred */ function _clearApproval(uint256 tokenId) private { if (_tokenApprovals[tokenId] != address(0)) { _tokenApprovals[tokenId] = address(0); } } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ contract ERC721Burnable is ERC721 { /** * @dev Burns a specific ERC721 token. * @param tokenId uint256 id of the ERC721 token to be burned. */ function burn(uint256 tokenId) public { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(msg.sender, tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } // solium-disable error-reason /** * @title ControllerRole * @dev An Controller role defined using the Open Zeppelin Role system. */ contract ControllerRole { using Roles for Roles.Role; // NOTE: Commented out standard Role events to save gas. // event ControllerAdded(address indexed account); // event ControllerRemoved(address indexed account); Roles.Role private _controllers; constructor () public { _addController(msg.sender); } modifier onlyController() { require(isController(msg.sender)); _; } function isController(address account) public view returns (bool) { return _controllers.has(account); } function addController(address account) public onlyController { _addController(account); } function renounceController() public { _removeController(msg.sender); } function _addController(address account) internal { _controllers.add(account); // emit ControllerAdded(account); } function _removeController(address account) internal { _controllers.remove(account); // emit ControllerRemoved(account); } } // solium-disable no-empty-blocks,error-reason /** * @title Registry * @dev An ERC721 Token see https://eips.ethereum.org/EIPS/eip-721. With * additional functions so other trusted contracts to interact with the tokens. */ contract Registry is IRegistry, ControllerRole, ERC721Burnable { // Optional mapping for token URIs mapping(uint256 => string) internal _tokenURIs; string internal _prefix; // Mapping from token ID to resolver address mapping (uint256 => address) internal _tokenResolvers; // uint256(keccak256(abi.encodePacked(uint256(0x0), keccak256(abi.encodePacked("crypto"))))) uint256 private constant _CRYPTO_HASH = 0x0f4a10a4f46c288cea365fcf45cccf0e9d901b945b9829ccdb54c10dc3cb7a6f; modifier onlyApprovedOrOwner(uint256 tokenId) { require(_isApprovedOrOwner(msg.sender, tokenId)); _; } constructor () public { _mint(address(0xdead), _CRYPTO_HASH); // register the supported interfaces to conform to ERC721 via ERC165 _registerInterface(0x5b5e139f); // ERC721 Metadata Interface _tokenURIs[root()] = "crypto"; emit NewURI(root(), "crypto"); } /// ERC721 Metadata extension function name() external view returns (string memory) { return ".crypto"; } function symbol() external view returns (string memory) { return "UD"; } function tokenURI(uint256 tokenId) external view returns (string memory) { require(_exists(tokenId)); return string(abi.encodePacked(_prefix, _tokenURIs[tokenId])); } function controlledSetTokenURIPrefix(string calldata prefix) external onlyController { _prefix = prefix; emit NewURIPrefix(prefix); } /// Ownership function isApprovedOrOwner(address spender, uint256 tokenId) external view returns (bool) { return _isApprovedOrOwner(spender, tokenId); } /// Registry Constants function root() public pure returns (uint256) { return _CRYPTO_HASH; } function childIdOf(uint256 tokenId, string calldata label) external pure returns (uint256) { return _childId(tokenId, label); } /// Minting function mintChild(address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _mintChild(to, tokenId, label); } function controlledMintChild(address to, uint256 tokenId, string calldata label) external onlyController { _mintChild(to, tokenId, label); } function safeMintChild(address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _safeMintChild(to, tokenId, label, ""); } function safeMintChild(address to, uint256 tokenId, string calldata label, bytes calldata _data) external onlyApprovedOrOwner(tokenId) { _safeMintChild(to, tokenId, label, _data); } function controlledSafeMintChild(address to, uint256 tokenId, string calldata label, bytes calldata _data) external onlyController { _safeMintChild(to, tokenId, label, _data); } /// Transfering function setOwner(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) { super._transferFrom(ownerOf(tokenId), to, tokenId); } function transferFromChild(address from, address to, uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _transferFrom(from, to, _childId(tokenId, label)); } function controlledTransferFrom(address from, address to, uint256 tokenId) external onlyController { _transferFrom(from, to, tokenId); } function safeTransferFromChild( address from, address to, uint256 tokenId, string memory label, bytes memory _data ) public onlyApprovedOrOwner(tokenId) { uint256 childId = _childId(tokenId, label); _transferFrom(from, to, childId); require(_checkOnERC721Received(from, to, childId, _data)); } function safeTransferFromChild(address from, address to, uint256 tokenId, string calldata label) external { safeTransferFromChild(from, to, tokenId, label, ""); } function controlledSafeTransferFrom(address from, address to, uint256 tokenId, bytes calldata _data) external onlyController { _transferFrom(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data)); } /// Burning function burnChild(uint256 tokenId, string calldata label) external onlyApprovedOrOwner(tokenId) { _burn(_childId(tokenId, label)); } function controlledBurn(uint256 tokenId) external onlyController { _burn(tokenId); } /// Resolution function resolverOf(uint256 tokenId) external view returns (address) { address resolver = _tokenResolvers[tokenId]; require(resolver != address(0)); return resolver; } function resolveTo(address to, uint256 tokenId) external onlyApprovedOrOwner(tokenId) { _resolveTo(to, tokenId); } function controlledResolveTo(address to, uint256 tokenId) external onlyController { _resolveTo(to, tokenId); } function sync(uint256 tokenId, uint256 updateId) external { require(_tokenResolvers[tokenId] == msg.sender); emit Sync(msg.sender, updateId, tokenId); } /// Internal function _childId(uint256 tokenId, string memory label) internal pure returns (uint256) { require(bytes(label).length != 0); return uint256(keccak256(abi.encodePacked(tokenId, keccak256(abi.encodePacked(label))))); } function _mintChild(address to, uint256 tokenId, string memory label) internal { uint256 childId = _childId(tokenId, label); _mint(to, childId); require(bytes(label).length != 0); require(_exists(childId)); bytes memory domain = abi.encodePacked(label, ".", _tokenURIs[tokenId]); _tokenURIs[childId] = string(domain); emit NewURI(childId, string(domain)); } function _safeMintChild(address to, uint256 tokenId, string memory label, bytes memory _data) internal { _mintChild(to, tokenId, label); require(_checkOnERC721Received(address(0), to, _childId(tokenId, label), _data)); } function _transferFrom(address from, address to, uint256 tokenId) internal { super._transferFrom(from, to, tokenId); // Clear resolver (if any) if (_tokenResolvers[tokenId] != address(0x0)) { delete _tokenResolvers[tokenId]; } } function _burn(uint256 tokenId) internal { super._burn(tokenId); // Clear resolver (if any) if (_tokenResolvers[tokenId] != address(0x0)) { delete _tokenResolvers[tokenId]; } // Clear metadata (if any) if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } function _resolveTo(address to, uint256 tokenId) internal { require(_exists(tokenId)); emit Resolve(tokenId, to); _tokenResolvers[tokenId] = to; } } /** * @title MintingController * @dev Defines the functions for distribution of Second Level Domains (SLD)s. */ contract MintingController is IMintingController, MinterRole { Registry internal _registry; constructor (Registry registry) public { _registry = registry; } function registry() external view returns (address) { return address(_registry); } function mintSLD(address to, string memory label) public onlyMinter { _registry.controlledMintChild(to, _registry.root(), label); } function safeMintSLD(address to, string calldata label) external { safeMintSLD(to, label, ""); } function safeMintSLD(address to, string memory label, bytes memory _data) public onlyMinter { _registry.controlledSafeMintChild(to, _registry.root(), label, _data); } function mintSLDWithResolver(address to, string memory label, address resolver) public onlyMinter { _registry.controlledMintChild(to, _registry.root(), label); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDWithResolver(address to, string calldata label, address resolver) external { safeMintSLD(to, label, ""); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } function safeMintSLDWithResolver(address to, string calldata label, address resolver, bytes calldata _data) external { safeMintSLD(to, label, _data); _registry.controlledResolveTo(resolver, _registry.childIdOf(_registry.root(), label)); } } // solium-disable error-reason contract SignatureUtil { using ECDSA for bytes32; // Mapping from owner to a nonce mapping (uint256 => uint256) internal _nonces; Registry internal _registry; constructor(Registry registry) public { _registry = registry; } function registry() external view returns (address) { return address(_registry); } /** * @dev Gets the nonce of the specified address. * @param tokenId token ID for nonce query * @return nonce of the given address */ function nonceOf(uint256 tokenId) external view returns (uint256) { return _nonces[tokenId]; } function _validate(bytes32 hash, uint256 tokenId, bytes memory signature) internal { uint256 nonce = _nonces[tokenId]; address signer = keccak256(abi.encodePacked(hash, address(this), nonce)).toEthSignedMessageHash().recover(signature); require( signer != address(0) && _registry.isApprovedOrOwner( signer, tokenId ), "INVALID_SIGNATURE" ); _nonces[tokenId] += 1; } } contract IResolver { /** * @dev Reset all domain records and set new ones * @param keys New record keys * @param values New record values * @param tokenId ERC-721 token id of the domain */ function reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) public; /** * @dev Set or update domain records * @param keys New record keys * @param values New record values * @param tokenId ERC-721 token id of the domain */ function setMany(string[] memory keys, string[] memory values, uint256 tokenId) public; /** * @dev Function to set record. * @param key The key set the value of. * @param value The value to set key to. * @param tokenId ERC-721 token id to set. */ function set(string calldata key, string calldata value, uint256 tokenId) external; /** * @dev Function to reset all existing records on a domain. * @param tokenId ERC-721 token id to set. */ function reset(uint256 tokenId) external; } interface IResolverReader { /** * @dev Gets the nonce of the specified address. * @param tokenId token ID for nonce query * @return nonce of the given address */ function nonceOf(uint256 tokenId) external view returns (uint256); /** * @return registry address */ function registry() external view returns (address); /** * @dev Function to get record. * @param key The key to query the value of. * @param tokenId The token id to fetch. * @return The value string. */ function get(string calldata key, uint256 tokenId) external view returns (string memory); /** * @dev Function to get multiple record. * @param keys The keys to query the value of. * @param tokenId The token id to fetch. * @return The values. */ function getMany(string[] calldata keys, uint256 tokenId) external view returns (string[] memory); /** * @dev Function get value by provied key hash. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHash The key to query the value of. * @param tokenId The token id to set. * @return Key and value. */ function getByHash(uint256 keyHash, uint256 tokenId) external view returns (string memory key, string memory value); /** * @dev Function get values by provied key hashes. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHashes The key to query the value of. * @param tokenId The token id to set. * @return Keys and values. */ function getManyByHash(uint256[] calldata keyHashes, uint256 tokenId) external view returns (string[] memory keys, string[] memory values); } // solium-disable error-reason contract Resolver is IResolverReader, SignatureUtil, IResolver { event Set(uint256 indexed tokenId, string indexed keyIndex, string indexed valueIndex, string key, string value); event NewKey(uint256 indexed tokenId, string indexed keyIndex, string key); event ResetRecords(uint256 indexed tokenId); // Mapping from token ID to preset id to key to value mapping (uint256 => mapping (uint256 => mapping (string => string))) internal _records; // Mapping from token ID to current preset id mapping (uint256 => uint256) _tokenPresets; // All keys that were set mapping (uint256 => string) _hashedKeys; MintingController internal _mintingController; constructor(Registry registry, MintingController mintingController) public SignatureUtil(registry) { require(address(registry) == mintingController.registry()); _mintingController = mintingController; } /** * @dev Throws if called when not the resolver. */ modifier whenResolver(uint256 tokenId) { require(address(this) == _registry.resolverOf(tokenId), "RESOLVER_DETACHED_FROM_DOMAIN"); _; } modifier whenApprovedOrOwner(uint256 tokenId) { require(_registry.isApprovedOrOwner(msg.sender, tokenId), "SENDER_IS_NOT_APPROVED_OR_OWNER"); _; } function reset(uint256 tokenId) external whenApprovedOrOwner(tokenId) { _setPreset(now, tokenId); } function resetFor(uint256 tokenId, bytes calldata signature) external { _validate(keccak256(abi.encodeWithSelector(this.reset.selector, tokenId)), tokenId, signature); _setPreset(now, tokenId); } /** * @dev Function to get record. * @param key The key to query the value of. * @param tokenId The token id to fetch. * @return The value string. */ function get(string memory key, uint256 tokenId) public view whenResolver(tokenId) returns (string memory) { return _records[tokenId][_tokenPresets[tokenId]][key]; } /** * @dev Function to get key by provided hash. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHash The key to query the value of. * @return The key string. */ function hashToKey(uint256 keyHash) public view returns (string memory) { return _hashedKeys[keyHash]; } /** * @dev Function to get keys by provided key hashes. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param hashes The key to query the value of. * @return Keys */ function hashesToKeys(uint256[] memory hashes) public view returns (string[] memory) { uint256 keyCount = hashes.length; string[] memory values = new string[](keyCount); for (uint256 i = 0; i < keyCount; i++) { values[i] = hashToKey(hashes[i]); } return values; } /** * @dev Function get value by provied key hash. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHash The key to query the value of. * @param tokenId The token id to set. * @return Key and value. */ function getByHash(uint256 keyHash, uint256 tokenId) public view whenResolver(tokenId) returns (string memory key, string memory value) { key = hashToKey(keyHash); value = get(key, tokenId); } /** * @dev Function get values by provied key hashes. Keys hashes can be found in Sync event emitted by Registry.sol contract. * @param keyHashes The key to query the value of. * @param tokenId The token id to set. * @return Keys and values. */ function getManyByHash( uint256[] memory keyHashes, uint256 tokenId ) public view whenResolver(tokenId) returns (string[] memory keys, string[] memory values) { uint256 keyCount = keyHashes.length; keys = new string[](keyCount); values = new string[](keyCount); for (uint256 i = 0; i < keyCount; i++) { (keys[i], values[i]) = getByHash(keyHashes[i], tokenId); } } function preconfigure( string[] memory keys, string[] memory values, uint256 tokenId ) public { require(_mintingController.isMinter(msg.sender), "SENDER_IS_NOT_MINTER"); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to set record. * @param key The key set the value of. * @param value The value to set key to. * @param tokenId The token id to set. */ function set(string calldata key, string calldata value, uint256 tokenId) external whenApprovedOrOwner(tokenId) { _set(_tokenPresets[tokenId], key, value, tokenId); } /** * @dev Function to set record on behalf of an address. * @param key The key set the value of. * @param value The value to set key to. * @param tokenId The token id to set. * @param signature The signature to verify the transaction with. */ function setFor( string calldata key, string calldata value, uint256 tokenId, bytes calldata signature ) external { _validate(keccak256(abi.encodeWithSelector(this.set.selector, key, value, tokenId)), tokenId, signature); _set(_tokenPresets[tokenId], key, value, tokenId); } /** * @dev Function to get multiple record. * @param keys The keys to query the value of. * @param tokenId The token id to fetch. * @return The values. */ function getMany(string[] calldata keys, uint256 tokenId) external view whenResolver(tokenId) returns (string[] memory) { uint256 keyCount = keys.length; string[] memory values = new string[](keyCount); uint256 preset = _tokenPresets[tokenId]; for (uint256 i = 0; i < keyCount; i++) { values[i] = _records[tokenId][preset][keys[i]]; } return values; } function setMany( string[] memory keys, string[] memory values, uint256 tokenId ) public whenApprovedOrOwner(tokenId) { _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to set record on behalf of an address. * @param keys The keys set the values of. * @param values The values to set keys to. * @param tokenId The token id to set. * @param signature The signature to verify the transaction with. */ function setManyFor( string[] memory keys, string[] memory values, uint256 tokenId, bytes memory signature ) public { _validate(keccak256(abi.encodeWithSelector(this.setMany.selector, keys, values, tokenId)), tokenId, signature); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } /** * @dev Function to reset all domain records and set new ones. * @param keys records keys. * @param values records values. * @param tokenId domain token id. */ function reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) public whenApprovedOrOwner(tokenId) { _reconfigure(keys, values, tokenId); } /** * @dev Delegated version of reconfigure() function. * @param keys records keys. * @param values records values. * @param tokenId domain token id. * @param signature user signature. */ function reconfigureFor( string[] memory keys, string[] memory values, uint256 tokenId, bytes memory signature ) public { _validate(keccak256(abi.encodeWithSelector(this.reconfigure.selector, keys, values, tokenId)), tokenId, signature); _reconfigure(keys, values, tokenId); } // reset records function _setPreset(uint256 presetId, uint256 tokenId) internal { _tokenPresets[tokenId] = presetId; _registry.sync(tokenId, 0); // notify registry that domain records were reset emit ResetRecords(tokenId); } /** * @dev Internal function to to set record. As opposed to set, this imposes no restrictions on msg.sender. * @param preset preset to set key/values on * @param key key of record to be set * @param value value of record to be set * @param tokenId uint256 ID of the token */ function _set(uint256 preset, string memory key, string memory value, uint256 tokenId) internal { uint256 keyHash = uint256(keccak256(bytes(key))); bool isNewKey = bytes(_records[tokenId][preset][key]).length == 0; _registry.sync(tokenId, keyHash); _records[tokenId][preset][key] = value; if (bytes(_hashedKeys[keyHash]).length == 0) { _hashedKeys[keyHash] = key; } if (isNewKey) { emit NewKey(tokenId, key, key); } emit Set(tokenId, key, value, key, value); } /** * @dev Internal function to to set multiple records. As opposed to setMany, this imposes * no restrictions on msg.sender. * @param preset preset to set key/values on * @param keys keys of record to be set * @param values values of record to be set * @param tokenId uint256 ID of the token */ function _setMany(uint256 preset, string[] memory keys, string[] memory values, uint256 tokenId) internal { uint256 keyCount = keys.length; for (uint256 i = 0; i < keyCount; i++) { _set(preset, keys[i], values[i], tokenId); } } /** * @dev Internal function to reset all domain records and set new ones. * @param keys records keys. * @param values records values. * @param tokenId domain token id. */ function _reconfigure(string[] memory keys, string[] memory values, uint256 tokenId) internal { _setPreset(now, tokenId); _setMany(_tokenPresets[tokenId], keys, values, tokenId); } } /** * @title WhitelistedMinter * @dev Defines the functions for distribution of Second Level Domains (SLD)s. */ contract WhitelistedMinter is IMintingController, BulkWhitelistedRole { using ECDSA for bytes32; event Relayed(address indexed sender, address indexed signer, bytes4 indexed funcSig, bytes32 dataHash); string public constant NAME = 'Unstoppable Whitelisted Minter'; string public constant VERSION = '0.3.0'; MintingController internal _mintingController; Resolver internal _resolver; Registry internal _registry; /* * bytes4(keccak256('mintSLD(address,string)')) == 0x4c0b0ed2 */ bytes4 private constant _SIG_MINT = 0x4c0b0ed2; /* * bytes4(keccak256('mintSLDToDefaultResolver(address,string,string[],string[])')) == 0x3d7989fe */ bytes4 private constant _SIG_MINT_DEF_RESOLVER = 0x3d7989fe; /* * bytes4(keccak256('mintSLDToResolver(address,string,string[],string[],address)')) == 0xaceb4764 */ bytes4 private constant _SIG_MINT_RESOLVER = 0xaceb4764; /* * bytes4(keccak256('safeMintSLD(address,string)')) == 0xb2da2979 */ bytes4 private constant _SIG_SAFE_MINT = 0xb2da2979; /* * bytes4(keccak256('safeMintSLD(address,string,bytes)')) == 0xbe362e2e */ bytes4 private constant _SIG_SAFE_MINT_DATA = 0xbe362e2e; /* * bytes4(keccak256('safeMintSLDToDefaultResolver(address,string,string[],string[])')) == 0x61050ffd */ bytes4 private constant _SIG_SAFE_MINT_DEF_RESOLVER = 0x61050ffd; /* * bytes4(keccak256('safeMintSLDToDefaultResolver(address,string,string[],string[],bytes)')) == 0x4b18abea */ bytes4 private constant _SIG_SAFE_MINT_DEF_RESOLVER_DATA = 0x4b18abea; /* * bytes4(keccak256('safeMintSLDToResolver(address,string,string[],string[],address)')) == 0x4b44c01a */ bytes4 private constant _SIG_SAFE_MINT_RESOLVER = 0x4b44c01a; /* * bytes4(keccak256('safeMintSLDToResolver(address,string,string[],string[],bytes,address)')) == 0x898851f8 */ bytes4 private constant _SIG_SAFE_MINT_RESOLVER_DATA = 0x898851f8; constructor(MintingController mintingController) public { _mintingController = mintingController; _registry = Registry(mintingController.registry()); _addWhitelisted(address(this)); } function renounceMinter() external onlyWhitelistAdmin { _mintingController.renounceMinter(); } /** * Renounce whitelisted account with funds' forwarding */ function closeWhitelisted(address payable receiver) external payable onlyWhitelisted { require(receiver != address(0x0), "WhitelistedMinter: RECEIVER_IS_EMPTY"); renounceWhitelisted(); receiver.transfer(msg.value); } /** * Replace whitelisted account by new account with funds' forwarding */ function rotateWhitelisted(address payable receiver) external payable onlyWhitelisted { require(receiver != address(0x0), "WhitelistedMinter: RECEIVER_IS_EMPTY"); _addWhitelisted(receiver); renounceWhitelisted(); receiver.transfer(msg.value); } function mintSLD(address to, string calldata label) external onlyWhitelisted { _mintingController.mintSLD(to, label); } function safeMintSLD(address to, string calldata label) external onlyWhitelisted { _mintingController.safeMintSLD(to, label); } function safeMintSLD( address to, string calldata label, bytes calldata _data ) external onlyWhitelisted { _mintingController.safeMintSLD(to, label, _data); } function mintSLDToDefaultResolver( address to, string memory label, string[] memory keys, string[] memory values ) public onlyWhitelisted { mintSLDToResolver(to, label, keys, values, address(_resolver)); } function mintSLDToResolver( address to, string memory label, string[] memory keys, string[] memory values, address resolver ) public onlyWhitelisted { _mintingController.mintSLDWithResolver(to, label, resolver); preconfigureResolver(label, keys, values, resolver); } function safeMintSLDToDefaultResolver( address to, string memory label, string[] memory keys, string[] memory values ) public onlyWhitelisted { safeMintSLDToResolver(to, label, keys, values, address(_resolver)); } function safeMintSLDToResolver( address to, string memory label, string[] memory keys, string[] memory values, address resolver ) public onlyWhitelisted { _mintingController.safeMintSLDWithResolver(to, label, resolver); preconfigureResolver(label, keys, values, resolver); } function safeMintSLDToDefaultResolver( address to, string memory label, string[] memory keys, string[] memory values, bytes memory _data ) public onlyWhitelisted { safeMintSLDToResolver(to, label, keys, values, _data, address(_resolver)); } function safeMintSLDToResolver( address to, string memory label, string[] memory keys, string[] memory values, bytes memory _data, address resolver ) public onlyWhitelisted { _mintingController.safeMintSLDWithResolver(to, label, resolver, _data); preconfigureResolver(label, keys, values, resolver); } function setDefaultResolver(address resolver) external onlyWhitelistAdmin { _resolver = Resolver(resolver); } function getDefaultResolver() external view returns (address) { return address(_resolver); } /** * Relay allows execute transaction on behalf of whitelisted minter. * The function verify signature of call data parameter before execution. * It allows anybody send transaction on-chain when minter has provided proper parameters. * The function allows to relaying calls of fixed functions. The restriction defined in function `verifyCall` */ function relay(bytes calldata data, bytes calldata signature) external returns(bytes memory) { bytes32 dataHash = keccak256(data); address signer = verifySigner(dataHash, signature); bytes memory _data = data; bytes4 funcSig = verifyCall(_data); /* solium-disable-next-line security/no-low-level-calls */ (bool success, bytes memory result) = address(this).call(data); if (success == false) { /* solium-disable-next-line security/no-inline-assembly */ assembly { let ptr := mload(0x40) let size := returndatasize returndatacopy(ptr, 0, size) revert(ptr, size) } } emit Relayed(msg.sender, signer, funcSig, dataHash); return result; } function preconfigureResolver( string memory label, string[] memory keys, string[] memory values, address resolver ) private { if(keys.length == 0) { return; } Resolver(resolver).preconfigure(keys, values, _registry.childIdOf(_registry.root(), label)); } function verifySigner(bytes32 data, bytes memory signature) private view returns(address signer) { signer = keccak256(abi.encodePacked(data, address(this))) .toEthSignedMessageHash() .recover(signature); require(signer != address(0), 'WhitelistedMinter: SIGNATURE_IS_INVALID'); require(isWhitelisted(signer), 'WhitelistedMinter: SIGNER_IS_NOT_WHITELISTED'); } function verifyCall(bytes memory data) private pure returns(bytes4 sig) { /* solium-disable-next-line security/no-inline-assembly */ assembly { sig := mload(add(data, add(0x20, 0))) } bool isSupported = sig == _SIG_MINT || sig == _SIG_MINT_DEF_RESOLVER || sig == _SIG_MINT_RESOLVER || sig == _SIG_SAFE_MINT || sig == _SIG_SAFE_MINT_DATA || sig == _SIG_SAFE_MINT_DEF_RESOLVER || sig == _SIG_SAFE_MINT_DEF_RESOLVER_DATA || sig == _SIG_SAFE_MINT_RESOLVER || sig == _SIG_SAFE_MINT_RESOLVER_DATA; require(isSupported, 'WhitelistedMinter: UNSUPPORTED_CALL'); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
Contract ABI
API[{"inputs":[{"internalType":"contract MintingController","name":"mintingController","type":"address"}],"payable":false,"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"sender","type":"address"},{"indexed":true,"internalType":"address","name":"signer","type":"address"},{"indexed":true,"internalType":"bytes4","name":"funcSig","type":"bytes4"},{"indexed":false,"internalType":"bytes32","name":"dataHash","type":"bytes32"}],"name":"Relayed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistAdminRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"WhitelistedRemoved","type":"event"},{"constant":true,"inputs":[],"name":"NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[],"name":"VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"bulkAddWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"}],"name":"bulkRemoveWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"closeWhitelisted","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":true,"inputs":[],"name":"getDefaultResolver","outputs":[{"internalType":"address","name":"","type":"address"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelistAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":true,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"payable":false,"stateMutability":"view","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"}],"name":"mintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"mintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"address","name":"resolver","type":"address"}],"name":"mintSLDToResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"bytes","name":"data","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"relay","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceMinter","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelistAdmin","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[],"name":"renounceWhitelisted","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address payable","name":"receiver","type":"address"}],"name":"rotateWhitelisted","outputs":[],"payable":true,"stateMutability":"payable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"}],"name":"safeMintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMintSLD","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeMintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"}],"name":"safeMintSLDToDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"address","name":"resolver","type":"address"}],"name":"safeMintSLDToResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"string","name":"label","type":"string"},{"internalType":"string[]","name":"keys","type":"string[]"},{"internalType":"string[]","name":"values","type":"string[]"},{"internalType":"bytes","name":"_data","type":"bytes"},{"internalType":"address","name":"resolver","type":"address"}],"name":"safeMintSLDToResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"},{"constant":false,"inputs":[{"internalType":"address","name":"resolver","type":"address"}],"name":"setDefaultResolver","outputs":[],"payable":false,"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162003a3038038062003a308339818101604052620000379190810190620003fd565b62000048336200016360201b60201c565b80600260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16637b1039996040518163ffffffff1660e01b815260040160206040518083038186803b158015620000d057600080fd5b505afa158015620000e5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506200010b9190810190620003d1565b600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200015c30620001c460201b60201c565b50620005a4565b6200017e8160006200022560201b62001ce91790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b620001df8160016200022560201b62001ce91790919060201c565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b620002378282620002d860201b60201c565b156200027a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200027190620004d3565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200034c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034390620004f5565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600081519050620003b48162000570565b92915050565b600081519050620003cb816200058a565b92915050565b600060208284031215620003e457600080fd5b6000620003f484828501620003a3565b91505092915050565b6000602082840312156200041057600080fd5b60006200042084828501620003ba565b91505092915050565b600062000438601f8362000517565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b60006200047a60228362000517565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006020820190508181036000830152620004ee8162000429565b9050919050565b6000602082019050818103600083015262000510816200046b565b9050919050565b600082825260208201905092915050565b6000620005358262000550565b9050919050565b6000620005498262000528565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6200057b8162000528565b81146200058757600080fd5b50565b62000595816200053c565b8114620005a157600080fd5b50565b61347c80620005b46000396000f3fe6080604052600436106101815760003560e01c8063898851f8116100d1578063be362e2e1161008a578063f6e491aa11610064578063f6e491aa14610509578063f8a6c3d614610532578063f8a8d0c91461055b578063ffa1ad741461057757610181565b8063be362e2e146104a0578063c66485b2146104c9578063d6cd9473146104f257610181565b8063898851f8146103a657806398650275146103cf578063a3f4df7e146103e6578063aceb476414610411578063b2da29791461043a578063bb5f747b1461046357610181565b80634b18abea1161013e5780634c5a628c116101185780634c5a628c14610300578063564a51581461031757806361050ffd146103545780637362d9c81461037d57610181565b80634b18abea146102855780634b44c01a146102ae5780634c0b0ed2146102d757610181565b806310154bad14610186578063291d9549146101af578063350959be146101d85780633af32abf146101f45780633d7989fe146102315780633efa047f1461025a575b600080fd5b34801561019257600080fd5b506101ad60048036036101a8919081019061221a565b6105a2565b005b3480156101bb57600080fd5b506101d660048036036101d1919081019061221a565b6105f6565b005b6101f260048036036101ed9190810190612243565b61064a565b005b34801561020057600080fd5b5061021b6004803603610216919081019061221a565b610754565b6040516102289190612f42565b60405180910390f35b34801561023d57600080fd5b506102586004803603610253919081019061234d565b610771565b005b34801561026657600080fd5b5061026f6107ee565b60405161027c9190612dd6565b60405180910390f35b34801561029157600080fd5b506102ac60048036036102a791908101906124b7565b610818565b005b3480156102ba57600080fd5b506102d560048036036102d091908101906123f8565b610897565b005b3480156102e357600080fd5b506102fe60048036036102f9919081019061226c565b610983565b005b34801561030c57600080fd5b50610315610a61565b005b34801561032357600080fd5b5061033e600480360361033991908101906126b8565b610a6c565b60405161034b9190612fbd565b60405180910390f35b34801561036057600080fd5b5061037b6004803603610376919081019061234d565b610c54565b005b34801561038957600080fd5b506103a4600480360361039f919081019061221a565b610cd1565b005b3480156103b257600080fd5b506103cd60048036036103c8919081019061258e565b610d25565b005b3480156103db57600080fd5b506103e4610e14565b005b3480156103f257600080fd5b506103fb610ee0565b6040516104089190612fdf565b60405180910390f35b34801561041d57600080fd5b50610438600480360361043391908101906123f8565b610f19565b005b34801561044657600080fd5b50610461600480360361045c919081019061226c565b611005565b005b34801561046f57600080fd5b5061048a6004803603610485919081019061221a565b6110e3565b6040516104979190612f42565b60405180910390f35b3480156104ac57600080fd5b506104c760048036036104c291908101906122c4565b611100565b005b3480156104d557600080fd5b506104f060048036036104eb919081019061221a565b6111e4565b005b3480156104fe57600080fd5b50610507611270565b005b34801561051557600080fd5b50610530600480360361052b9190810190612677565b61127b565b005b34801561053e57600080fd5b5061055960048036036105549190810190612677565b6112ff565b005b61057560048036036105709190810190612243565b611383565b005b34801561058357600080fd5b5061058c611496565b6040516105999190612fdf565b60405180910390f35b6105ab336110e3565b6105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613081565b60405180910390fd5b6105f3816114cf565b50565b6105ff336110e3565b61063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590613081565b60405180910390fd5b61064781611529565b50565b61065333610754565b610692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610689906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f990613021565b60405180910390fd5b61070a611270565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610750573d6000803e3d6000fd5b5050565b600061076a82600161158390919063ffffffff16565b9050919050565b61077a33610754565b6107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b0906130e1565b60405180910390fd5b6107e884848484600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f19565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61082133610754565b610860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610857906130e1565b60405180910390fd5b6108908585858585600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d25565b5050505050565b6108a033610754565b6108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d6906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ad364f88686846040518463ffffffff1660e01b815260040161093e93929190612e6c565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505061097c8484848461164b565b5050505050565b61098c33610754565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c2906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c0b0ed28484846040518463ffffffff1660e01b8152600401610a2a93929190612df1565b600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b50505050505050565b610a6a3361181b565b565b606060008585604051610a80929190612d97565b604051809103902090506000610ada8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611875565b9050606087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506000610b308261197a565b9050600060603073ffffffffffffffffffffffffffffffffffffffff168b8b604051610b5d929190612d97565b6000604051808303816000865af19150503d8060008114610b9a576040519150601f19603f3d011682016040523d82523d6000602084013e610b9f565b606091505b5091509150600015158215151415610bbe576040513d806000833e8082fd5b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9490f91465d0d2c12728b9ad47d5f1dd2ac3ef39394796e54a48b94db0b3372589604051610c3b9190612f5d565b60405180910390a4809650505050505050949350505050565b610c5d33610754565b610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906130e1565b60405180910390fd5b610ccb84848484600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610897565b50505050565b610cda336110e3565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613081565b60405180910390fd5b610d2281611c8f565b50565b610d2e33610754565b610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d64906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637caf3ad8878784866040518563ffffffff1660e01b8152600401610dce9493929190612eaa565b600060405180830381600087803b158015610de857600080fd5b505af1158015610dfc573d6000803e3d6000fd5b50505050610e0c8585858461164b565b505050505050565b610e1d336110e3565b610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390613081565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663986502756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ec657600080fd5b505af1158015610eda573d6000803e3d6000fd5b50505050565b6040518060400160405280601e81526020017f556e73746f707061626c652057686974656c6973746564204d696e746572000081525081565b610f2233610754565b610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c36c21258686846040518463ffffffff1660e01b8152600401610fc093929190612e6c565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b50505050610ffe8484848461164b565b5050505050565b61100e33610754565b61104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2da29798484846040518463ffffffff1660e01b81526004016110ac93929190612df1565b600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050565b60006110f982600061158390919063ffffffff16565b9050919050565b61110933610754565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be362e2e86868686866040518663ffffffff1660e01b81526004016111ab959493929190612e23565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b505050505050505050565b6111ed336110e3565b61122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613081565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61127933611529565b565b611284336110e3565b6112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613081565b60405180910390fd5b60008090505b81518110156112fb576112ee8282815181106112e157fe5b60200260200101516114cf565b80806001019150506112c9565b5050565b611308336110e3565b611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90613081565b60405180910390fd5b60008090505b815181101561137f5761137282828151811061136557fe5b6020026020010151611529565b808060010191505061134d565b5050565b61138c33610754565b6113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c2906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613021565b60405180910390fd5b611444816114cf565b61144c611270565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611492573d6000803e3d6000fd5b5050565b6040518060400160405280600581526020017f302e332e3000000000000000000000000000000000000000000000000000000081525081565b6114e3816001611ce990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b61153d816001611d9190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90613061565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008351141561165a57611815565b8073ffffffffffffffffffffffffffffffffffffffff1663e837ae748484600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368b62d32600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebf0c7176040518163ffffffff1660e01b815260040160206040518083038186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611756919081019061272d565b8a6040518363ffffffff1660e01b8152600401611774929190613121565b60206040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117c4919081019061272d565b6040518463ffffffff1660e01b81526004016117e293929190612efd565b600060405180830381600087803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b505050505b50505050565b61182f816000611d9190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b60006118ba826118ac8530604051602001611891929190612d6b565b60405160208183030381529060405280519060200120611e38565b611e6890919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561192c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611923906130a1565b60405180910390fd5b61193581610754565b611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90613101565b60405180910390fd5b92915050565b60008060200182015190506000634c0b0ed260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a1e5750633d7989fe60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a6d575063aceb476460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611abc575063b2da297960e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b0b575063be362e2e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b5a57506361050ffd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ba95750634b18abea60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bf85750634b44c01a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c47575063898851f860e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b905080611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c80906130c1565b60405180910390fd5b50919050565b611ca3816000611ce990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b611cf38282611583565b15611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90613001565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611d9b8282611583565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613041565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600081604051602001611e4b9190612db0565b604051602081830303815290604052805190602001209050919050565b60006041825114611e7c5760009050611f4e565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ed05760009350505050611f4e565b601b8160ff1614158015611ee85750601c8160ff1614155b15611ef95760009350505050611f4e565b60018682858560405160008152602001604052604051611f1c9493929190612f78565b6020604051602081039080840390855afa158015611f3e573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600081359050611f63816133f4565b92915050565b600081359050611f788161340b565b92915050565b600082601f830112611f8f57600080fd5b8135611fa2611f9d8261317e565b613151565b91508181835260208401935060208101905083856020840282011115611fc757600080fd5b60005b83811015611ff75781611fdd8882611f54565b845260208401935060208301925050600181019050611fca565b5050505092915050565b600082601f83011261201257600080fd5b8135612025612020826131a6565b613151565b9150818183526020840193506020810190508360005b8381101561206b5781358601612051888261215d565b84526020840193506020830192505060018101905061203b565b5050505092915050565b60008083601f84011261208757600080fd5b8235905067ffffffffffffffff8111156120a057600080fd5b6020830191508360018202830111156120b857600080fd5b9250929050565b600082601f8301126120d057600080fd5b81356120e36120de826131ce565b613151565b915080825260208301602083018583830111156120ff57600080fd5b61210a838284613366565b50505092915050565b60008083601f84011261212557600080fd5b8235905067ffffffffffffffff81111561213e57600080fd5b60208301915083600182028301111561215657600080fd5b9250929050565b600082601f83011261216e57600080fd5b813561218161217c826131fa565b613151565b9150808252602083016020830185838301111561219d57600080fd5b6121a8838284613366565b50505092915050565b600082601f8301126121c257600080fd5b81356121d56121d082613226565b613151565b915080825260208301602083018583830111156121f157600080fd5b6121fc838284613366565b50505092915050565b60008151905061221481613422565b92915050565b60006020828403121561222c57600080fd5b600061223a84828501611f54565b91505092915050565b60006020828403121561225557600080fd5b600061226384828501611f69565b91505092915050565b60008060006040848603121561228157600080fd5b600061228f86828701611f54565b935050602084013567ffffffffffffffff8111156122ac57600080fd5b6122b886828701612113565b92509250509250925092565b6000806000806000606086880312156122dc57600080fd5b60006122ea88828901611f54565b955050602086013567ffffffffffffffff81111561230757600080fd5b61231388828901612113565b9450945050604086013567ffffffffffffffff81111561233257600080fd5b61233e88828901612075565b92509250509295509295909350565b6000806000806080858703121561236357600080fd5b600061237187828801611f54565b945050602085013567ffffffffffffffff81111561238e57600080fd5b61239a878288016121b1565b935050604085013567ffffffffffffffff8111156123b757600080fd5b6123c387828801612001565b925050606085013567ffffffffffffffff8111156123e057600080fd5b6123ec87828801612001565b91505092959194509250565b600080600080600060a0868803121561241057600080fd5b600061241e88828901611f54565b955050602086013567ffffffffffffffff81111561243b57600080fd5b612447888289016121b1565b945050604086013567ffffffffffffffff81111561246457600080fd5b61247088828901612001565b935050606086013567ffffffffffffffff81111561248d57600080fd5b61249988828901612001565b92505060806124aa88828901611f54565b9150509295509295909350565b600080600080600060a086880312156124cf57600080fd5b60006124dd88828901611f54565b955050602086013567ffffffffffffffff8111156124fa57600080fd5b612506888289016121b1565b945050604086013567ffffffffffffffff81111561252357600080fd5b61252f88828901612001565b935050606086013567ffffffffffffffff81111561254c57600080fd5b61255888828901612001565b925050608086013567ffffffffffffffff81111561257557600080fd5b612581888289016120bf565b9150509295509295909350565b60008060008060008060c087890312156125a757600080fd5b60006125b589828a01611f54565b965050602087013567ffffffffffffffff8111156125d257600080fd5b6125de89828a016121b1565b955050604087013567ffffffffffffffff8111156125fb57600080fd5b61260789828a01612001565b945050606087013567ffffffffffffffff81111561262457600080fd5b61263089828a01612001565b935050608087013567ffffffffffffffff81111561264d57600080fd5b61265989828a016120bf565b92505060a061266a89828a01611f54565b9150509295509295509295565b60006020828403121561268957600080fd5b600082013567ffffffffffffffff8111156126a357600080fd5b6126af84828501611f7e565b91505092915050565b600080600080604085870312156126ce57600080fd5b600085013567ffffffffffffffff8111156126e857600080fd5b6126f487828801612075565b9450945050602085013567ffffffffffffffff81111561271357600080fd5b61271f87828801612075565b925092505092959194509250565b60006020828403121561273f57600080fd5b600061274d84828501612205565b91505092915050565b6000612762838361292b565b905092915050565b612773816132f5565b82525050565b61278a612785826132f5565b6133a8565b82525050565b600061279b82613262565b6127a5818561329b565b9350836020820285016127b785613252565b8060005b858110156127f357848403895281516127d48582612756565b94506127df8361328e565b925060208a019950506001810190506127bb565b50829750879550505050505092915050565b61280e81613319565b82525050565b61281d81613325565b82525050565b61283461282f82613325565b6133ba565b82525050565b600061284683856132ac565b9350612853838584613366565b61285c836133d6565b840190509392505050565b600061287383856132bd565b9350612880838584613366565b82840190509392505050565b60006128978261326d565b6128a181856132ac565b93506128b1818560208601613375565b6128ba816133d6565b840191505092915050565b60006128d183856132d9565b93506128de838584613366565b6128e7836133d6565b840190509392505050565b60006128fd82613283565b61290781856132d9565b9350612917818560208601613375565b612920816133d6565b840191505092915050565b600061293682613278565b61294081856132c8565b9350612950818560208601613375565b612959816133d6565b840191505092915050565b600061296f82613278565b61297981856132d9565b9350612989818560208601613375565b612992816133d6565b840191505092915050565b60006129aa601f836132d9565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b60006129ea601c836132ea565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612a2a6024836132d9565b91507f57686974656c69737465644d696e7465723a2052454345495645525f49535f4560008301527f4d505459000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a906021836132d9565b91507f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612af66022836132d9565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b5c6040836132d9565b91507f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008301527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c656020830152604082019050919050565b6000612bc26027836132d9565b91507f57686974656c69737465644d696e7465723a205349474e41545552455f49535f60008301527f494e56414c4944000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c286023836132d9565b91507f57686974656c69737465644d696e7465723a20554e535550504f525445445f4360008301527f414c4c00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c8e603a836132d9565b91507f57686974656c6973746564526f6c653a2063616c6c657220646f6573206e6f7460008301527f2068617665207468652057686974656c697374656420726f6c650000000000006020830152604082019050919050565b6000612cf4602c836132d9565b91507f57686974656c69737465644d696e7465723a205349474e45525f49535f4e4f5460008301527f5f57484954454c495354454400000000000000000000000000000000000000006020830152604082019050919050565b612d568161334f565b82525050565b612d6581613359565b82525050565b6000612d778285612823565b602082019150612d878284612779565b6014820191508190509392505050565b6000612da4828486612867565b91508190509392505050565b6000612dbb826129dd565b9150612dc78284612823565b60208201915081905092915050565b6000602082019050612deb600083018461276a565b92915050565b6000604082019050612e06600083018661276a565b8181036020830152612e198184866128c5565b9050949350505050565b6000606082019050612e38600083018861276a565b8181036020830152612e4b8186886128c5565b90508181036040830152612e6081848661283a565b90509695505050505050565b6000606082019050612e81600083018661276a565b8181036020830152612e9381856128f2565b9050612ea2604083018461276a565b949350505050565b6000608082019050612ebf600083018761276a565b8181036020830152612ed181866128f2565b9050612ee0604083018561276a565b8181036060830152612ef2818461288c565b905095945050505050565b60006060820190508181036000830152612f178186612790565b90508181036020830152612f2b8185612790565b9050612f3a6040830184612d4d565b949350505050565b6000602082019050612f576000830184612805565b92915050565b6000602082019050612f726000830184612814565b92915050565b6000608082019050612f8d6000830187612814565b612f9a6020830186612d5c565b612fa76040830185612814565b612fb46060830184612814565b95945050505050565b60006020820190508181036000830152612fd7818461288c565b905092915050565b60006020820190508181036000830152612ff98184612964565b905092915050565b6000602082019050818103600083015261301a8161299d565b9050919050565b6000602082019050818103600083015261303a81612a1d565b9050919050565b6000602082019050818103600083015261305a81612a83565b9050919050565b6000602082019050818103600083015261307a81612ae9565b9050919050565b6000602082019050818103600083015261309a81612b4f565b9050919050565b600060208201905081810360008301526130ba81612bb5565b9050919050565b600060208201905081810360008301526130da81612c1b565b9050919050565b600060208201905081810360008301526130fa81612c81565b9050919050565b6000602082019050818103600083015261311a81612ce7565b9050919050565b60006040820190506131366000830185612d4d565b818103602083015261314881846128f2565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561317457600080fd5b8060405250919050565b600067ffffffffffffffff82111561319557600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156131bd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156131e557600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561321157600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561323d57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133008261332f565b9050919050565b60006133128261332f565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613393578082015181840152602081019050613378565b838111156133a2576000848401525b50505050565b60006133b3826133c4565b9050919050565b6000819050919050565b60006133cf826133e7565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6133fd816132f5565b811461340857600080fd5b50565b61341481613307565b811461341f57600080fd5b50565b61342b8161334f565b811461343657600080fd5b5056fea365627a7a72315820fba7787a2333da4a0399f4857616b5fb435314fd9dcaf1fcb055eb78c0c3f18a6c6578706572696d656e74616cf564736f6c634300050c0040000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Deployed Bytecode
0x6080604052600436106101815760003560e01c8063898851f8116100d1578063be362e2e1161008a578063f6e491aa11610064578063f6e491aa14610509578063f8a6c3d614610532578063f8a8d0c91461055b578063ffa1ad741461057757610181565b8063be362e2e146104a0578063c66485b2146104c9578063d6cd9473146104f257610181565b8063898851f8146103a657806398650275146103cf578063a3f4df7e146103e6578063aceb476414610411578063b2da29791461043a578063bb5f747b1461046357610181565b80634b18abea1161013e5780634c5a628c116101185780634c5a628c14610300578063564a51581461031757806361050ffd146103545780637362d9c81461037d57610181565b80634b18abea146102855780634b44c01a146102ae5780634c0b0ed2146102d757610181565b806310154bad14610186578063291d9549146101af578063350959be146101d85780633af32abf146101f45780633d7989fe146102315780633efa047f1461025a575b600080fd5b34801561019257600080fd5b506101ad60048036036101a8919081019061221a565b6105a2565b005b3480156101bb57600080fd5b506101d660048036036101d1919081019061221a565b6105f6565b005b6101f260048036036101ed9190810190612243565b61064a565b005b34801561020057600080fd5b5061021b6004803603610216919081019061221a565b610754565b6040516102289190612f42565b60405180910390f35b34801561023d57600080fd5b506102586004803603610253919081019061234d565b610771565b005b34801561026657600080fd5b5061026f6107ee565b60405161027c9190612dd6565b60405180910390f35b34801561029157600080fd5b506102ac60048036036102a791908101906124b7565b610818565b005b3480156102ba57600080fd5b506102d560048036036102d091908101906123f8565b610897565b005b3480156102e357600080fd5b506102fe60048036036102f9919081019061226c565b610983565b005b34801561030c57600080fd5b50610315610a61565b005b34801561032357600080fd5b5061033e600480360361033991908101906126b8565b610a6c565b60405161034b9190612fbd565b60405180910390f35b34801561036057600080fd5b5061037b6004803603610376919081019061234d565b610c54565b005b34801561038957600080fd5b506103a4600480360361039f919081019061221a565b610cd1565b005b3480156103b257600080fd5b506103cd60048036036103c8919081019061258e565b610d25565b005b3480156103db57600080fd5b506103e4610e14565b005b3480156103f257600080fd5b506103fb610ee0565b6040516104089190612fdf565b60405180910390f35b34801561041d57600080fd5b50610438600480360361043391908101906123f8565b610f19565b005b34801561044657600080fd5b50610461600480360361045c919081019061226c565b611005565b005b34801561046f57600080fd5b5061048a6004803603610485919081019061221a565b6110e3565b6040516104979190612f42565b60405180910390f35b3480156104ac57600080fd5b506104c760048036036104c291908101906122c4565b611100565b005b3480156104d557600080fd5b506104f060048036036104eb919081019061221a565b6111e4565b005b3480156104fe57600080fd5b50610507611270565b005b34801561051557600080fd5b50610530600480360361052b9190810190612677565b61127b565b005b34801561053e57600080fd5b5061055960048036036105549190810190612677565b6112ff565b005b61057560048036036105709190810190612243565b611383565b005b34801561058357600080fd5b5061058c611496565b6040516105999190612fdf565b60405180910390f35b6105ab336110e3565b6105ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016105e190613081565b60405180910390fd5b6105f3816114cf565b50565b6105ff336110e3565b61063e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161063590613081565b60405180910390fd5b61064781611529565b50565b61065333610754565b610692576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610689906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610702576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106f990613021565b60405180910390fd5b61070a611270565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015610750573d6000803e3d6000fd5b5050565b600061076a82600161158390919063ffffffff16565b9050919050565b61077a33610754565b6107b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107b0906130e1565b60405180910390fd5b6107e884848484600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610f19565b50505050565b6000600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61082133610754565b610860576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610857906130e1565b60405180910390fd5b6108908585858585600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610d25565b5050505050565b6108a033610754565b6108df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d6906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16638ad364f88686846040518463ffffffff1660e01b815260040161093e93929190612e6c565b600060405180830381600087803b15801561095857600080fd5b505af115801561096c573d6000803e3d6000fd5b5050505061097c8484848461164b565b5050505050565b61098c33610754565b6109cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c2906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16634c0b0ed28484846040518463ffffffff1660e01b8152600401610a2a93929190612df1565b600060405180830381600087803b158015610a4457600080fd5b505af1158015610a58573d6000803e3d6000fd5b50505050505050565b610a6a3361181b565b565b606060008585604051610a80929190612d97565b604051809103902090506000610ada8286868080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611875565b9050606087878080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f8201169050808301925050505050505090506000610b308261197a565b9050600060603073ffffffffffffffffffffffffffffffffffffffff168b8b604051610b5d929190612d97565b6000604051808303816000865af19150503d8060008114610b9a576040519150601f19603f3d011682016040523d82523d6000602084013e610b9f565b606091505b5091509150600015158215151415610bbe576040513d806000833e8082fd5b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19168573ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167f9490f91465d0d2c12728b9ad47d5f1dd2ac3ef39394796e54a48b94db0b3372589604051610c3b9190612f5d565b60405180910390a4809650505050505050949350505050565b610c5d33610754565b610c9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c93906130e1565b60405180910390fd5b610ccb84848484600360009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16610897565b50505050565b610cda336110e3565b610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1090613081565b60405180910390fd5b610d2281611c8f565b50565b610d2e33610754565b610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d64906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16637caf3ad8878784866040518563ffffffff1660e01b8152600401610dce9493929190612eaa565b600060405180830381600087803b158015610de857600080fd5b505af1158015610dfc573d6000803e3d6000fd5b50505050610e0c8585858461164b565b505050505050565b610e1d336110e3565b610e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5390613081565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663986502756040518163ffffffff1660e01b8152600401600060405180830381600087803b158015610ec657600080fd5b505af1158015610eda573d6000803e3d6000fd5b50505050565b6040518060400160405280601e81526020017f556e73746f707061626c652057686974656c6973746564204d696e746572000081525081565b610f2233610754565b610f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f58906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c36c21258686846040518463ffffffff1660e01b8152600401610fc093929190612e6c565b600060405180830381600087803b158015610fda57600080fd5b505af1158015610fee573d6000803e3d6000fd5b50505050610ffe8484848461164b565b5050505050565b61100e33610754565b61104d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611044906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b2da29798484846040518463ffffffff1660e01b81526004016110ac93929190612df1565b600060405180830381600087803b1580156110c657600080fd5b505af11580156110da573d6000803e3d6000fd5b50505050505050565b60006110f982600061158390919063ffffffff16565b9050919050565b61110933610754565b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f906130e1565b60405180910390fd5b600260009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663be362e2e86868686866040518663ffffffff1660e01b81526004016111ab959493929190612e23565b600060405180830381600087803b1580156111c557600080fd5b505af11580156111d9573d6000803e3d6000fd5b505050505050505050565b6111ed336110e3565b61122c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161122390613081565b60405180910390fd5b80600360006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61127933611529565b565b611284336110e3565b6112c3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ba90613081565b60405180910390fd5b60008090505b81518110156112fb576112ee8282815181106112e157fe5b60200260200101516114cf565b80806001019150506112c9565b5050565b611308336110e3565b611347576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133e90613081565b60405180910390fd5b60008090505b815181101561137f5761137282828151811061136557fe5b6020026020010151611529565b808060010191505061134d565b5050565b61138c33610754565b6113cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c2906130e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561143b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161143290613021565b60405180910390fd5b611444816114cf565b61144c611270565b8073ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611492573d6000803e3d6000fd5b5050565b6040518060400160405280600581526020017f302e332e3000000000000000000000000000000000000000000000000000000081525081565b6114e3816001611ce990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167fee1504a83b6d4a361f4c1dc78ab59bfa30d6a3b6612c403e86bb01ef2984295f60405160405180910390a250565b61153d816001611d9190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f270d9b30cf5b0793bbfd54c9d5b94aeb49462b8148399000265144a8722da6b660405160405180910390a250565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115eb90613061565b60405180910390fd5b8260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60008351141561165a57611815565b8073ffffffffffffffffffffffffffffffffffffffff1663e837ae748484600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166368b62d32600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663ebf0c7176040518163ffffffff1660e01b815260040160206040518083038186803b15801561171e57600080fd5b505afa158015611732573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250611756919081019061272d565b8a6040518363ffffffff1660e01b8152600401611774929190613121565b60206040518083038186803b15801561178c57600080fd5b505afa1580156117a0573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052506117c4919081019061272d565b6040518463ffffffff1660e01b81526004016117e293929190612efd565b600060405180830381600087803b1580156117fc57600080fd5b505af1158015611810573d6000803e3d6000fd5b505050505b50505050565b61182f816000611d9190919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f0a8eb35e5ca14b3d6f28e4abf2f128dbab231a58b56e89beb5d636115001e16560405160405180910390a250565b60006118ba826118ac8530604051602001611891929190612d6b565b60405160208183030381529060405280519060200120611e38565b611e6890919063ffffffff16565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561192c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611923906130a1565b60405180910390fd5b61193581610754565b611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196b90613101565b60405180910390fd5b92915050565b60008060200182015190506000634c0b0ed260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a1e5750633d7989fe60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a6d575063aceb476460e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611abc575063b2da297960e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b0b575063be362e2e60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b5a57506361050ffd60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611ba95750634b18abea60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611bf85750634b44c01a60e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c47575063898851f860e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b905080611c89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c80906130c1565b60405180910390fd5b50919050565b611ca3816000611ce990919063ffffffff16565b8073ffffffffffffffffffffffffffffffffffffffff167f22380c05984257a1cb900161c713dd71d39e74820f1aea43bd3f1bdd2096129960405160405180910390a250565b611cf38282611583565b15611d33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2a90613001565b60405180910390fd5b60018260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b611d9b8282611583565b611dda576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd190613041565b60405180910390fd5b60008260000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055505050565b600081604051602001611e4b9190612db0565b604051602081830303815290604052805190602001209050919050565b60006041825114611e7c5760009050611f4e565b60008060006020850151925060408501519150606085015160001a90507f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08260001c1115611ed05760009350505050611f4e565b601b8160ff1614158015611ee85750601c8160ff1614155b15611ef95760009350505050611f4e565b60018682858560405160008152602001604052604051611f1c9493929190612f78565b6020604051602081039080840390855afa158015611f3e573d6000803e3d6000fd5b5050506020604051035193505050505b92915050565b600081359050611f63816133f4565b92915050565b600081359050611f788161340b565b92915050565b600082601f830112611f8f57600080fd5b8135611fa2611f9d8261317e565b613151565b91508181835260208401935060208101905083856020840282011115611fc757600080fd5b60005b83811015611ff75781611fdd8882611f54565b845260208401935060208301925050600181019050611fca565b5050505092915050565b600082601f83011261201257600080fd5b8135612025612020826131a6565b613151565b9150818183526020840193506020810190508360005b8381101561206b5781358601612051888261215d565b84526020840193506020830192505060018101905061203b565b5050505092915050565b60008083601f84011261208757600080fd5b8235905067ffffffffffffffff8111156120a057600080fd5b6020830191508360018202830111156120b857600080fd5b9250929050565b600082601f8301126120d057600080fd5b81356120e36120de826131ce565b613151565b915080825260208301602083018583830111156120ff57600080fd5b61210a838284613366565b50505092915050565b60008083601f84011261212557600080fd5b8235905067ffffffffffffffff81111561213e57600080fd5b60208301915083600182028301111561215657600080fd5b9250929050565b600082601f83011261216e57600080fd5b813561218161217c826131fa565b613151565b9150808252602083016020830185838301111561219d57600080fd5b6121a8838284613366565b50505092915050565b600082601f8301126121c257600080fd5b81356121d56121d082613226565b613151565b915080825260208301602083018583830111156121f157600080fd5b6121fc838284613366565b50505092915050565b60008151905061221481613422565b92915050565b60006020828403121561222c57600080fd5b600061223a84828501611f54565b91505092915050565b60006020828403121561225557600080fd5b600061226384828501611f69565b91505092915050565b60008060006040848603121561228157600080fd5b600061228f86828701611f54565b935050602084013567ffffffffffffffff8111156122ac57600080fd5b6122b886828701612113565b92509250509250925092565b6000806000806000606086880312156122dc57600080fd5b60006122ea88828901611f54565b955050602086013567ffffffffffffffff81111561230757600080fd5b61231388828901612113565b9450945050604086013567ffffffffffffffff81111561233257600080fd5b61233e88828901612075565b92509250509295509295909350565b6000806000806080858703121561236357600080fd5b600061237187828801611f54565b945050602085013567ffffffffffffffff81111561238e57600080fd5b61239a878288016121b1565b935050604085013567ffffffffffffffff8111156123b757600080fd5b6123c387828801612001565b925050606085013567ffffffffffffffff8111156123e057600080fd5b6123ec87828801612001565b91505092959194509250565b600080600080600060a0868803121561241057600080fd5b600061241e88828901611f54565b955050602086013567ffffffffffffffff81111561243b57600080fd5b612447888289016121b1565b945050604086013567ffffffffffffffff81111561246457600080fd5b61247088828901612001565b935050606086013567ffffffffffffffff81111561248d57600080fd5b61249988828901612001565b92505060806124aa88828901611f54565b9150509295509295909350565b600080600080600060a086880312156124cf57600080fd5b60006124dd88828901611f54565b955050602086013567ffffffffffffffff8111156124fa57600080fd5b612506888289016121b1565b945050604086013567ffffffffffffffff81111561252357600080fd5b61252f88828901612001565b935050606086013567ffffffffffffffff81111561254c57600080fd5b61255888828901612001565b925050608086013567ffffffffffffffff81111561257557600080fd5b612581888289016120bf565b9150509295509295909350565b60008060008060008060c087890312156125a757600080fd5b60006125b589828a01611f54565b965050602087013567ffffffffffffffff8111156125d257600080fd5b6125de89828a016121b1565b955050604087013567ffffffffffffffff8111156125fb57600080fd5b61260789828a01612001565b945050606087013567ffffffffffffffff81111561262457600080fd5b61263089828a01612001565b935050608087013567ffffffffffffffff81111561264d57600080fd5b61265989828a016120bf565b92505060a061266a89828a01611f54565b9150509295509295509295565b60006020828403121561268957600080fd5b600082013567ffffffffffffffff8111156126a357600080fd5b6126af84828501611f7e565b91505092915050565b600080600080604085870312156126ce57600080fd5b600085013567ffffffffffffffff8111156126e857600080fd5b6126f487828801612075565b9450945050602085013567ffffffffffffffff81111561271357600080fd5b61271f87828801612075565b925092505092959194509250565b60006020828403121561273f57600080fd5b600061274d84828501612205565b91505092915050565b6000612762838361292b565b905092915050565b612773816132f5565b82525050565b61278a612785826132f5565b6133a8565b82525050565b600061279b82613262565b6127a5818561329b565b9350836020820285016127b785613252565b8060005b858110156127f357848403895281516127d48582612756565b94506127df8361328e565b925060208a019950506001810190506127bb565b50829750879550505050505092915050565b61280e81613319565b82525050565b61281d81613325565b82525050565b61283461282f82613325565b6133ba565b82525050565b600061284683856132ac565b9350612853838584613366565b61285c836133d6565b840190509392505050565b600061287383856132bd565b9350612880838584613366565b82840190509392505050565b60006128978261326d565b6128a181856132ac565b93506128b1818560208601613375565b6128ba816133d6565b840191505092915050565b60006128d183856132d9565b93506128de838584613366565b6128e7836133d6565b840190509392505050565b60006128fd82613283565b61290781856132d9565b9350612917818560208601613375565b612920816133d6565b840191505092915050565b600061293682613278565b61294081856132c8565b9350612950818560208601613375565b612959816133d6565b840191505092915050565b600061296f82613278565b61297981856132d9565b9350612989818560208601613375565b612992816133d6565b840191505092915050565b60006129aa601f836132d9565b91507f526f6c65733a206163636f756e7420616c72656164792068617320726f6c65006000830152602082019050919050565b60006129ea601c836132ea565b91507f19457468657265756d205369676e6564204d6573736167653a0a3332000000006000830152601c82019050919050565b6000612a2a6024836132d9565b91507f57686974656c69737465644d696e7465723a2052454345495645525f49535f4560008301527f4d505459000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612a906021836132d9565b91507f526f6c65733a206163636f756e7420646f6573206e6f74206861766520726f6c60008301527f65000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612af66022836132d9565b91507f526f6c65733a206163636f756e7420697320746865207a65726f20616464726560008301527f73730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612b5c6040836132d9565b91507f57686974656c69737441646d696e526f6c653a2063616c6c657220646f65732060008301527f6e6f742068617665207468652057686974656c69737441646d696e20726f6c656020830152604082019050919050565b6000612bc26027836132d9565b91507f57686974656c69737465644d696e7465723a205349474e41545552455f49535f60008301527f494e56414c4944000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c286023836132d9565b91507f57686974656c69737465644d696e7465723a20554e535550504f525445445f4360008301527f414c4c00000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612c8e603a836132d9565b91507f57686974656c6973746564526f6c653a2063616c6c657220646f6573206e6f7460008301527f2068617665207468652057686974656c697374656420726f6c650000000000006020830152604082019050919050565b6000612cf4602c836132d9565b91507f57686974656c69737465644d696e7465723a205349474e45525f49535f4e4f5460008301527f5f57484954454c495354454400000000000000000000000000000000000000006020830152604082019050919050565b612d568161334f565b82525050565b612d6581613359565b82525050565b6000612d778285612823565b602082019150612d878284612779565b6014820191508190509392505050565b6000612da4828486612867565b91508190509392505050565b6000612dbb826129dd565b9150612dc78284612823565b60208201915081905092915050565b6000602082019050612deb600083018461276a565b92915050565b6000604082019050612e06600083018661276a565b8181036020830152612e198184866128c5565b9050949350505050565b6000606082019050612e38600083018861276a565b8181036020830152612e4b8186886128c5565b90508181036040830152612e6081848661283a565b90509695505050505050565b6000606082019050612e81600083018661276a565b8181036020830152612e9381856128f2565b9050612ea2604083018461276a565b949350505050565b6000608082019050612ebf600083018761276a565b8181036020830152612ed181866128f2565b9050612ee0604083018561276a565b8181036060830152612ef2818461288c565b905095945050505050565b60006060820190508181036000830152612f178186612790565b90508181036020830152612f2b8185612790565b9050612f3a6040830184612d4d565b949350505050565b6000602082019050612f576000830184612805565b92915050565b6000602082019050612f726000830184612814565b92915050565b6000608082019050612f8d6000830187612814565b612f9a6020830186612d5c565b612fa76040830185612814565b612fb46060830184612814565b95945050505050565b60006020820190508181036000830152612fd7818461288c565b905092915050565b60006020820190508181036000830152612ff98184612964565b905092915050565b6000602082019050818103600083015261301a8161299d565b9050919050565b6000602082019050818103600083015261303a81612a1d565b9050919050565b6000602082019050818103600083015261305a81612a83565b9050919050565b6000602082019050818103600083015261307a81612ae9565b9050919050565b6000602082019050818103600083015261309a81612b4f565b9050919050565b600060208201905081810360008301526130ba81612bb5565b9050919050565b600060208201905081810360008301526130da81612c1b565b9050919050565b600060208201905081810360008301526130fa81612c81565b9050919050565b6000602082019050818103600083015261311a81612ce7565b9050919050565b60006040820190506131366000830185612d4d565b818103602083015261314881846128f2565b90509392505050565b6000604051905081810181811067ffffffffffffffff8211171561317457600080fd5b8060405250919050565b600067ffffffffffffffff82111561319557600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156131bd57600080fd5b602082029050602081019050919050565b600067ffffffffffffffff8211156131e557600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561321157600080fd5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561323d57600080fd5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006133008261332f565b9050919050565b60006133128261332f565b9050919050565b60008115159050919050565b6000819050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b83811015613393578082015181840152602081019050613378565b838111156133a2576000848401525b50505050565b60006133b3826133c4565b9050919050565b6000819050919050565b60006133cf826133e7565b9050919050565b6000601f19601f8301169050919050565b60008160601b9050919050565b6133fd816132f5565b811461340857600080fd5b50565b61341481613307565b811461341f57600080fd5b50565b61342b8161334f565b811461343657600080fd5b5056fea365627a7a72315820fba7787a2333da4a0399f4857616b5fb435314fd9dcaf1fcb055eb78c0c3f18a6c6578706572696d656e74616cf564736f6c634300050c0040
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
-----Decoded View---------------
Arg [0] : mintingController (address): 0xb0EE56339C3253361730F50c08d3d7817ecD60Ca
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b0ee56339c3253361730f50c08d3d7817ecd60ca
Deployed Bytecode Sourcemap
67349:8678:0:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6907:110;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6907:110:0;;;;;;;;;;;;;;;;:::i;:::-;;7025:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7025:116:0;;;;;;;;;;;;;;;;:::i;:::-;;69844:282;;;;;;;;;;;;;;;;:::i;:::-;;6780:119;;8:9:-1;5:2;;;30:1;27;20:12;5:2;6780:119:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;71101:260;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71101:260:0;;;;;;;;;;;;;;;;:::i;:::-;;73181:106;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73181:106:0;;;:::i;:::-;;;;;;;;;;;;;;;;72347:304;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72347:304:0;;;;;;;;;;;;;;;;:::i;:::-;;71992:347;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71992:347:0;;;;;;;;;;;;;;;;:::i;:::-;;70553:156;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70553:156:0;;;;;;;;;;;;;;;;:::i;:::-;;5642:93;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5642:93:0;;;:::i;:::-;;73677:839;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73677:839:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;71716:268;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71716:268:0;;;;;;;;;;;;;;;;:::i;:::-;;5518:116;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5518:116:0;;;;;;;;;;;;;;;;:::i;:::-;;72659:383;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72659:383:0;;;;;;;;;;;;;;;;:::i;:::-;;69650:108;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69650:108:0;;;:::i;:::-;;67570:62;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67570:62:0;;;:::i;:::-;;;;;;;;;;;;;;;;71369:339;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71369:339:0;;;;;;;;;;;;;;;;:::i;:::-;;70717:164;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70717:164:0;;;;;;;;;;;;;;;;:::i;:::-;;5385:125;;8:9:-1;5:2;;;30:1;27;20:12;5:2;5385:125:0;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;70889:204;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70889:204:0;;;;;;;;;;;;;;;;:::i;:::-;;73050:123;;8:9:-1;5:2;;;30:1;27;20:12;5:2;73050:123:0;;;;;;;;;;;;;;;;:::i;:::-;;7149:87;;8:9:-1;5:2;;;30:1;27;20:12;5:2;7149:87:0;;;:::i;:::-;;8061:216;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8061:216:0;;;;;;;;;;;;;;;;:::i;:::-;;8285:222;;8:9:-1;5:2;;;30:1;27;20:12;5:2;8285:222:0;;;;;;;;;;;;;;;;:::i;:::-;;70226:319;;;;;;;;;;;;;;;;:::i;:::-;;67639:40;;8:9:-1;5:2;;;30:1;27;20:12;5:2;67639:40:0;;;:::i;:::-;;;;;;;;;;;;;;;;6907:110;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;6985:24;7001:7;6985:15;:24::i;:::-;6907:110;:::o;7025:116::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;7106:27;7125:7;7106:18;:27::i;:::-;7025:116;:::o;69844:282::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;70000:3;69980:24;;:8;:24;;;;69972:73;;;;;;;;;;;;;;;;;;;;;;70058:21;:19;:21::i;:::-;70090:8;:17;;:28;70108:9;70090:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70090:28:0;69844:282;:::o;6780:119::-;6841:4;6865:26;6883:7;6865:13;:17;;:26;;;;:::i;:::-;6858:33;;6780:119;;;:::o;71101:260::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;71291:62;71309:2;71313:5;71320:4;71326:6;71342:9;;;;;;;;;;;71291:17;:62::i;:::-;71101:260;;;;:::o;73181:106::-;73234:7;73269:9;;;;;;;;;;;73254:25;;73181:106;:::o;72347:304::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;72570:73;72592:2;72596:5;72603:4;72609:6;72617:5;72632:9;;;;;;;;;;;72570:21;:73::i;:::-;72347:304;;;;;:::o;71992:347::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;72206:18;;;;;;;;;;;:42;;;72249:2;72253:5;72260:8;72206:63;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72206:63:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72206:63:0;;;;72280:51;72301:5;72308:4;72314:6;72322:8;72280:20;:51::i;:::-;71992:347;;;;;:::o;70553:156::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;70664:18;;;;;;;;;;;:26;;;70691:2;70695:5;;70664:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70664:37:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70664:37:0;;;;70553:156;;;:::o;5642:93::-;5694:33;5716:10;5694:21;:33::i;:::-;5642:93::o;73677:839::-;73756:12;73781:16;73810:4;;73800:15;;;;;;;;;;;;;;;;73781:34;;73826:14;73843:33;73856:8;73866:9;;73843:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;73843:33:0;;;;;;:12;:33::i;:::-;73826:50;;73887:18;73908:4;;73887:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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;;73887:25:0;;;;;;;;73923:14;73940:17;73951:5;73940:10;:17::i;:::-;73923:34;;74039:12;74053:19;74084:4;74076:18;;74095:4;;74076:24;;;;;;;;;;;;;;;;;;;;;;;;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;;74038:62:0;;;;74126:5;74115:16;;:7;:16;;;74111:310;;;74265:4;74259:11;74300:14;74355:4;74352:1;74347:3;74332:28;74390:4;74385:3;74378:17;74229:181;74466:7;74438:46;;;74458:6;74438:46;;74446:10;74438:46;;;74475:8;74438:46;;;;;;;;;;;;;;;74502:6;74495:13;;;;;;;;73677:839;;;;;;:::o;71716:268::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;71910:66;71932:2;71936:5;71943:4;71949:6;71965:9;;;;;;;;;;;71910:21;:66::i;:::-;71716:268;;;;:::o;5518:116::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;5599:27;5618:7;5599:18;:27::i;:::-;5518:116;:::o;72659:383::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;72902:18;;;;;;;;;;;:42;;;72945:2;72949:5;72956:8;72966:5;72902:70;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;72902:70:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;72902:70:0;;;;72983:51;73004:5;73011:4;73017:6;73025:8;72983:20;:51::i;:::-;72659:383;;;;;;:::o;69650:108::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;69715:18;;;;;;;;;;;:33;;;:35;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;69715:35:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;69715:35:0;;;;69650:108::o;67570:62::-;;;;;;;;;;;;;;;;;;;:::o;71369:339::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;71579:18;;;;;;;;;;;:38;;;71618:2;71622:5;71629:8;71579:59;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71579:59:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71579:59:0;;;;71649:51;71670:5;71677:4;71683:6;71691:8;71649:20;:51::i;:::-;71369:339;;;;;:::o;70717:164::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;70832:18;;;;;;;;;;;:30;;;70863:2;70867:5;;70832:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;70832:41:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70832:41:0;;;;70717:164;;;:::o;5385:125::-;5449:4;5473:29;5494:7;5473:16;:20;;:29;;;;:::i;:::-;5466:36;;5385:125;;;:::o;70889:204::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;71037:18;;;;;;;;;;;:30;;;71068:2;71072:5;;71079;;71037:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;71037:48:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;71037:48:0;;;;70889:204;;;;;:::o;73050:123::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;73156:8;73135:9;;:30;;;;;;;;;;;;;;;;;;73050:123;:::o;7149:87::-;7198:30;7217:10;7198:18;:30::i;:::-;7149:87::o;8061:216::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;8158:13;8174:1;8158:17;;8153:117;8185:8;:15;8177:5;:23;8153:117;;;8226:32;8242:8;8251:5;8242:15;;;;;;;;;;;;;;8226;:32::i;:::-;8202:7;;;;;;;8153:117;;;;8061:216;:::o;8285:222::-;5260:28;5277:10;5260:16;:28::i;:::-;5252:105;;;;;;;;;;;;;;;;;;;;;;8385:13;8401:1;8385:17;;8380:120;8412:8;:15;8404:5;:23;8380:120;;;8453:35;8472:8;8481:5;8472:15;;;;;;;;;;;;;;8453:18;:35::i;:::-;8429:7;;;;;;;8380:120;;;;8285:222;:::o;70226:319::-;6664:25;6678:10;6664:13;:25::i;:::-;6656:96;;;;;;;;;;;;;;;;;;;;;;70383:3;70363:24;;:8;:24;;;;70355:73;;;;;;;;;;;;;;;;;;;;;;70441:25;70457:8;70441:15;:25::i;:::-;70477:21;:19;:21::i;:::-;70509:8;:17;;:28;70527:9;70509:28;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;70509:28:0;70226:319;:::o;67639:40::-;;;;;;;;;;;;;;;;;;;:::o;7244:137::-;7306:26;7324:7;7306:13;:17;;:26;;;;:::i;:::-;7365:7;7348:25;;;;;;;;;;;;7244:137;:::o;7389:145::-;7454:29;7475:7;7454:13;:20;;:29;;;;:::i;:::-;7518:7;7499:27;;;;;;;;;;;;7389:145;:::o;4558:203::-;4630:4;4674:1;4655:21;;:7;:21;;;;4647:68;;;;;;;;;;;;;;;;;;;;;;4733:4;:11;;:20;4745:7;4733:20;;;;;;;;;;;;;;;;;;;;;;;;;4726:27;;4558:203;;;;:::o;74524:342::-;74719:1;74704:4;:11;:16;74701:54;;;74737:7;;74701:54;74776:8;74767:31;;;74799:4;74805:6;74813:9;;;;;;;;;;;:19;;;74833:9;;;;;;;;;;;:14;;;:16;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74833:16:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74833:16: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;74833:16:0;;;;;;;;;74851:5;74813:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74813:44:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74813:44: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;74813:44:0;;;;;;;;;74767:91;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;30:1;27;20:12;5:2;74767:91:0;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;74767:91:0;;;;74524:342;;;;;:::o;5897:154::-;5965:32;5989:7;5965:16;:23;;:32;;;;:::i;:::-;6035:7;6013:30;;;;;;;;;;;;5897:154;:::o;74874:417::-;74955:14;74991:120;75101:9;74991:87;75018:4;75032;75001:37;;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;75001:37:0;;;74991:48;;;;;;:85;:87::i;:::-;:109;;:120;;;;:::i;:::-;74982:129;;75148:1;75130:20;;:6;:20;;;;75122:72;;;;;;;;;;;;;;;;;;;;;;75213:21;75227:6;75213:13;:21::i;:::-;75205:78;;;;;;;;;;;;;;;;;;;;;;74874:417;;;;:::o;75299:725::-;75359:10;75507:1;75501:4;75497:12;75491:4;75487:23;75481:30;75474:37;;75534:16;67930:10;75560:9;;75553:16;;;:3;:16;;;;:62;;;;68117:10;75593:22;;75586:29;;;:3;:29;;;;75553:62;:104;;;;68301:10;75639:18;;75632:25;;;:3;:25;;;;75553:104;:142;;;;68449:10;75681:14;;75674:21;;;:3;:21;;;;75553:142;:185;;;;68608:10;75719:19;;75712:26;;;:3;:26;;;;75553:185;:236;;;;68804:10;75762:27;;75755:34;;;:3;:34;;;;75553:236;:292;;;;69011:10;75813:32;;75806:39;;;:3;:39;;;;75553:292;:339;;;;69204:10;75869:23;;75862:30;;;:3;:30;;;;75553:339;:391;;;;69408:10;75916:28;;75909:35;;;:3;:35;;;;75553:391;75534:410;;75965:11;75957:59;;;;;;;;;;;;;;;;;;;;;;75299:725;;;;:::o;5743:146::-;5808:29;5829:7;5808:16;:20;;:29;;;;:::i;:::-;5873:7;5853:28;;;;;;;;;;;;5743:146;:::o;4022:178::-;4100:18;4104:4;4110:7;4100:3;:18::i;:::-;4099:19;4091:63;;;;;;;;;;;;;;;;;;;;;;4188:4;4165;:11;;:20;4177:7;4165:20;;;;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;4022:178;;:::o;4280:183::-;4360:18;4364:4;4370:7;4360:3;:18::i;:::-;4352:64;;;;;;;;;;;;;;;;;;;;;;4450:5;4427:4;:11;;:20;4439:7;4427:20;;;;;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;4280:183;;:::o;3499:269::-;3568:7;3754:4;3701:58;;;;;;;;;;;;49:4:-1;39:7;30;26:21;22:32;13:7;6:49;3701:58:0;;;3691:69;;;;;;3684:76;;3499:269;;;:::o;1293:1930::-;1371:7;1454:2;1434:9;:16;:22;1430:74;;1489:1;1473:19;;;;1430:74;1573:9;1593;1613:7;1865:4;1854:9;1850:20;1844:27;1839:32;;1911:4;1900:9;1896:20;1890:27;1885:32;;1965:4;1954:9;1950:20;1944:27;1941:1;1936:36;1931:41;;2895:66;2890:1;2882:10;;:79;2878:129;;;2993:1;2978:17;;;;;;;2878:129;3028:2;3023:1;:7;;;;:18;;;;;3039:2;3034:1;:7;;;;3023:18;3019:68;;;3073:1;3058:17;;;;;;;3019:68;3191:24;3201:4;3207:1;3210;3213;3191:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8:9:-1;5:2;;;45:16;42:1;39;24:38;77:16;74:1;67:27;5:2;3191:24:0;;;;;;;;3184:31;;;;;1293:1930;;;;;:::o;5:130:-1:-;;85:6;72:20;63:29;;97:33;124:5;97:33;;;57:78;;;;;142:146;;230:6;217:20;208:29;;242:41;277:5;242:41;;;202:86;;;;;313:707;;430:3;423:4;415:6;411:17;407:27;397:2;;448:1;445;438:12;397:2;485:6;472:20;507:80;522:64;579:6;522:64;;;507:80;;;498:89;;604:5;629:6;622:5;615:21;659:4;651:6;647:17;637:27;;681:4;676:3;672:14;665:21;;734:6;781:3;773:4;765:6;761:17;756:3;752:27;749:36;746:2;;;798:1;795;788:12;746:2;823:1;808:206;833:6;830:1;827:13;808:206;;;891:3;913:37;946:3;934:10;913:37;;;908:3;901:50;974:4;969:3;965:14;958:21;;1002:4;997:3;993:14;986:21;;865:149;855:1;852;848:9;843:14;;808:206;;;812:14;390:630;;;;;;;;1045:696;;1168:3;1161:4;1153:6;1149:17;1145:27;1135:2;;1186:1;1183;1176:12;1135:2;1223:6;1210:20;1245:86;1260:70;1323:6;1260:70;;;1245:86;;;1236:95;;1348:5;1373:6;1366:5;1359:21;1403:4;1395:6;1391:17;1381:27;;1425:4;1420:3;1416:14;1409:21;;1478:6;1511:1;1496:239;1521:6;1518:1;1515:13;1496:239;;;1604:3;1591:17;1583:6;1579:30;1628:43;1667:3;1655:10;1628:43;;;1623:3;1616:56;1695:4;1690:3;1686:14;1679:21;;1723:4;1718:3;1714:14;1707:21;;1553:182;1543:1;1540;1536:9;1531:14;;1496:239;;;1500:14;1128:613;;;;;;;;1763:335;;;1877:3;1870:4;1862:6;1858:17;1854:27;1844:2;;1895:1;1892;1885:12;1844:2;1928:6;1915:20;1905:30;;1955:18;1947:6;1944:30;1941:2;;;1987:1;1984;1977:12;1941:2;2021:4;2013:6;2009:17;1997:29;;2071:3;2064;2056:6;2052:16;2042:8;2038:31;2035:40;2032:2;;;2088:1;2085;2078:12;2032:2;1837:261;;;;;;2107:440;;2208:3;2201:4;2193:6;2189:17;2185:27;2175:2;;2226:1;2223;2216:12;2175:2;2263:6;2250:20;2285:64;2300:48;2341:6;2300:48;;;2285:64;;;2276:73;;2369:6;2362:5;2355:21;2405:4;2397:6;2393:17;2438:4;2431:5;2427:16;2473:3;2464:6;2459:3;2455:16;2452:25;2449:2;;;2490:1;2487;2480:12;2449:2;2500:41;2534:6;2529:3;2524;2500:41;;;2168:379;;;;;;;;2570:336;;;2685:3;2678:4;2670:6;2666:17;2662:27;2652:2;;2703:1;2700;2693:12;2652:2;2736:6;2723:20;2713:30;;2763:18;2755:6;2752:30;2749:2;;;2795:1;2792;2785:12;2749:2;2829:4;2821:6;2817:17;2805:29;;2879:3;2872;2864:6;2860:16;2850:8;2846:31;2843:40;2840:2;;;2896:1;2893;2886:12;2840:2;2645:261;;;;;;2915:434;;3013:3;3006:4;2998:6;2994:17;2990:27;2980:2;;3031:1;3028;3021:12;2980:2;3068:6;3055:20;3090:61;3105:45;3143:6;3105:45;;;3090:61;;;3081:70;;3171:6;3164:5;3157:21;3207:4;3199:6;3195:17;3240:4;3233:5;3229:16;3275:3;3266:6;3261:3;3257:16;3254:25;3251:2;;;3292:1;3289;3282:12;3251:2;3302:41;3336:6;3331:3;3326;3302:41;;;2973:376;;;;;;;;3358:442;;3460:3;3453:4;3445:6;3441:17;3437:27;3427:2;;3478:1;3475;3468:12;3427:2;3515:6;3502:20;3537:65;3552:49;3594:6;3552:49;;;3537:65;;;3528:74;;3622:6;3615:5;3608:21;3658:4;3650:6;3646:17;3691:4;3684:5;3680:16;3726:3;3717:6;3712:3;3708:16;3705:25;3702:2;;;3743:1;3740;3733:12;3702:2;3753:41;3787:6;3782:3;3777;3753:41;;;3420:380;;;;;;;;3808:134;;3892:6;3886:13;3877:22;;3904:33;3931:5;3904:33;;;3871:71;;;;;3949:241;;4053:2;4041:9;4032:7;4028:23;4024:32;4021:2;;;4069:1;4066;4059:12;4021:2;4104:1;4121:53;4166:7;4157:6;4146:9;4142:22;4121:53;;;4111:63;;4083:97;4015:175;;;;;4197:257;;4309:2;4297:9;4288:7;4284:23;4280:32;4277:2;;;4325:1;4322;4315:12;4277:2;4360:1;4377:61;4430:7;4421:6;4410:9;4406:22;4377:61;;;4367:71;;4339:105;4271:183;;;;;4461:492;;;;4602:2;4590:9;4581:7;4577:23;4573:32;4570:2;;;4618:1;4615;4608:12;4570:2;4653:1;4670:53;4715:7;4706:6;4695:9;4691:22;4670:53;;;4660:63;;4632:97;4788:2;4777:9;4773:18;4760:32;4812:18;4804:6;4801:30;4798:2;;;4844:1;4841;4834:12;4798:2;4872:65;4929:7;4920:6;4909:9;4905:22;4872:65;;;4862:75;;;;4739:204;4564:389;;;;;;4960:741;;;;;;5137:2;5125:9;5116:7;5112:23;5108:32;5105:2;;;5153:1;5150;5143:12;5105:2;5188:1;5205:53;5250:7;5241:6;5230:9;5226:22;5205:53;;;5195:63;;5167:97;5323:2;5312:9;5308:18;5295:32;5347:18;5339:6;5336:30;5333:2;;;5379:1;5376;5369:12;5333:2;5407:65;5464:7;5455:6;5444:9;5440:22;5407:65;;;5397:75;;;;5274:204;5537:2;5526:9;5522:18;5509:32;5561:18;5553:6;5550:30;5547:2;;;5593:1;5590;5583:12;5547:2;5621:64;5677:7;5668:6;5657:9;5653:22;5621:64;;;5611:74;;;;5488:203;5099:602;;;;;;;;;5708:1019;;;;;5935:3;5923:9;5914:7;5910:23;5906:33;5903:2;;;5952:1;5949;5942:12;5903:2;5987:1;6004:53;6049:7;6040:6;6029:9;6025:22;6004:53;;;5994:63;;5966:97;6122:2;6111:9;6107:18;6094:32;6146:18;6138:6;6135:30;6132:2;;;6178:1;6175;6168:12;6132:2;6198:63;6253:7;6244:6;6233:9;6229:22;6198:63;;;6188:73;;6073:194;6326:2;6315:9;6311:18;6298:32;6350:18;6342:6;6339:30;6336:2;;;6382:1;6379;6372:12;6336:2;6402:84;6478:7;6469:6;6458:9;6454:22;6402:84;;;6392:94;;6277:215;6551:2;6540:9;6536:18;6523:32;6575:18;6567:6;6564:30;6561:2;;;6607:1;6604;6597:12;6561:2;6627:84;6703:7;6694:6;6683:9;6679:22;6627:84;;;6617:94;;6502:215;5897:830;;;;;;;;6734:1145;;;;;;6978:3;6966:9;6957:7;6953:23;6949:33;6946:2;;;6995:1;6992;6985:12;6946:2;7030:1;7047:53;7092:7;7083:6;7072:9;7068:22;7047:53;;;7037:63;;7009:97;7165:2;7154:9;7150:18;7137:32;7189:18;7181:6;7178:30;7175:2;;;7221:1;7218;7211:12;7175:2;7241:63;7296:7;7287:6;7276:9;7272:22;7241:63;;;7231:73;;7116:194;7369:2;7358:9;7354:18;7341:32;7393:18;7385:6;7382:30;7379:2;;;7425:1;7422;7415:12;7379:2;7445:84;7521:7;7512:6;7501:9;7497:22;7445:84;;;7435:94;;7320:215;7594:2;7583:9;7579:18;7566:32;7618:18;7610:6;7607:30;7604:2;;;7650:1;7647;7640:12;7604:2;7670:84;7746:7;7737:6;7726:9;7722:22;7670:84;;;7660:94;;7545:215;7791:3;7810:53;7855:7;7846:6;7835:9;7831:22;7810:53;;;7800:63;;7770:99;6940:939;;;;;;;;;7886:1249;;;;;;8139:3;8127:9;8118:7;8114:23;8110:33;8107:2;;;8156:1;8153;8146:12;8107:2;8191:1;8208:53;8253:7;8244:6;8233:9;8229:22;8208:53;;;8198:63;;8170:97;8326:2;8315:9;8311:18;8298:32;8350:18;8342:6;8339:30;8336:2;;;8382:1;8379;8372:12;8336:2;8402:63;8457:7;8448:6;8437:9;8433:22;8402:63;;;8392:73;;8277:194;8530:2;8519:9;8515:18;8502:32;8554:18;8546:6;8543:30;8540:2;;;8586:1;8583;8576:12;8540:2;8606:84;8682:7;8673:6;8662:9;8658:22;8606:84;;;8596:94;;8481:215;8755:2;8744:9;8740:18;8727:32;8779:18;8771:6;8768:30;8765:2;;;8811:1;8808;8801:12;8765:2;8831:84;8907:7;8898:6;8887:9;8883:22;8831:84;;;8821:94;;8706:215;8980:3;8969:9;8965:19;8952:33;9005:18;8997:6;8994:30;8991:2;;;9037:1;9034;9027:12;8991:2;9057:62;9111:7;9102:6;9091:9;9087:22;9057:62;;;9047:72;;8931:194;8101:1034;;;;;;;;;9142:1375;;;;;;;9412:3;9400:9;9391:7;9387:23;9383:33;9380:2;;;9429:1;9426;9419:12;9380:2;9464:1;9481:53;9526:7;9517:6;9506:9;9502:22;9481:53;;;9471:63;;9443:97;9599:2;9588:9;9584:18;9571:32;9623:18;9615:6;9612:30;9609:2;;;9655:1;9652;9645:12;9609:2;9675:63;9730:7;9721:6;9710:9;9706:22;9675:63;;;9665:73;;9550:194;9803:2;9792:9;9788:18;9775:32;9827:18;9819:6;9816:30;9813:2;;;9859:1;9856;9849:12;9813:2;9879:84;9955:7;9946:6;9935:9;9931:22;9879:84;;;9869:94;;9754:215;10028:2;10017:9;10013:18;10000:32;10052:18;10044:6;10041:30;10038:2;;;10084:1;10081;10074:12;10038:2;10104:84;10180:7;10171:6;10160:9;10156:22;10104:84;;;10094:94;;9979:215;10253:3;10242:9;10238:19;10225:33;10278:18;10270:6;10267:30;10264:2;;;10310:1;10307;10300:12;10264:2;10330:62;10384:7;10375:6;10364:9;10360:22;10330:62;;;10320:72;;10204:194;10429:3;10448:53;10493:7;10484:6;10473:9;10469:22;10448:53;;;10438:63;;10408:99;9374:1143;;;;;;;;;10524:377;;10653:2;10641:9;10632:7;10628:23;10624:32;10621:2;;;10669:1;10666;10659:12;10621:2;10732:1;10721:9;10717:17;10704:31;10755:18;10747:6;10744:30;10741:2;;;10787:1;10784;10777:12;10741:2;10807:78;10877:7;10868:6;10857:9;10853:22;10807:78;;;10797:88;;10683:208;10615:286;;;;;10908:614;;;;;11067:2;11055:9;11046:7;11042:23;11038:32;11035:2;;;11083:1;11080;11073:12;11035:2;11146:1;11135:9;11131:17;11118:31;11169:18;11161:6;11158:30;11155:2;;;11201:1;11198;11191:12;11155:2;11229:64;11285:7;11276:6;11265:9;11261:22;11229:64;;;11219:74;;;;11097:202;11358:2;11347:9;11343:18;11330:32;11382:18;11374:6;11371:30;11368:2;;;11414:1;11411;11404:12;11368:2;11442:64;11498:7;11489:6;11478:9;11474:22;11442:64;;;11432:74;;;;11309:203;11029:493;;;;;;;;11529:263;;11644:2;11632:9;11623:7;11619:23;11615:32;11612:2;;;11660:1;11657;11650:12;11612:2;11695:1;11712:64;11768:7;11759:6;11748:9;11744:22;11712:64;;;11702:74;;11674:108;11606:186;;;;;11800:181;;11913:62;11971:3;11963:6;11913:62;;;11899:76;;11892:89;;;;;11989:113;12072:24;12090:5;12072:24;;;12067:3;12060:37;12054:48;;;12109:152;12210:45;12230:24;12248:5;12230:24;;;12210:45;;;12205:3;12198:58;12192:69;;;12297:896;;12454:60;12508:5;12454:60;;;12527:92;12612:6;12607:3;12527:92;;;12520:99;;12642:3;12684:4;12676:6;12672:17;12667:3;12663:27;12711:62;12767:5;12711:62;;;12793:7;12821:1;12806:348;12831:6;12828:1;12825:13;12806:348;;;12893:9;12887:4;12883:20;12878:3;12871:33;12938:6;12932:13;12960:76;13031:4;13016:13;12960:76;;;12952:84;;13053:66;13112:6;13053:66;;;13043:76;;13142:4;13137:3;13133:14;13126:21;;12863:291;12853:1;12850;12846:9;12841:14;;12806:348;;;12810:14;13167:4;13160:11;;13184:3;13177:10;;12433:760;;;;;;;;;;13201:104;13278:21;13293:5;13278:21;;;13273:3;13266:34;13260:45;;;13312:113;13395:24;13413:5;13395:24;;;13390:3;13383:37;13377:48;;;13432:152;13533:45;13553:24;13571:5;13553:24;;;13533:45;;;13528:3;13521:58;13515:69;;;13614:297;;13728:70;13791:6;13786:3;13728:70;;;13721:77;;13810:43;13846:6;13841:3;13834:5;13810:43;;;13875:29;13897:6;13875:29;;;13870:3;13866:39;13859:46;;13714:197;;;;;;13942:310;;14074:88;14155:6;14150:3;14074:88;;;14067:95;;14174:43;14210:6;14205:3;14198:5;14174:43;;;14239:6;14234:3;14230:16;14223:23;;14060:192;;;;;;14260:343;;14370:38;14402:5;14370:38;;;14420:70;14483:6;14478:3;14420:70;;;14413:77;;14495:52;14540:6;14535:3;14528:4;14521:5;14517:16;14495:52;;;14568:29;14590:6;14568:29;;;14563:3;14559:39;14552:46;;14350:253;;;;;;14635:300;;14751:71;14815:6;14810:3;14751:71;;;14744:78;;14834:43;14870:6;14865:3;14858:5;14834:43;;;14899:29;14921:6;14899:29;;;14894:3;14890:39;14883:46;;14737:198;;;;;;14943:347;;15055:39;15088:5;15055:39;;;15106:71;15170:6;15165:3;15106:71;;;15099:78;;15182:52;15227:6;15222:3;15215:4;15208:5;15204:16;15182:52;;;15255:29;15277:6;15255:29;;;15250:3;15246:39;15239:46;;15035:255;;;;;;15297:319;;15395:35;15424:5;15395:35;;;15442:61;15496:6;15491:3;15442:61;;;15435:68;;15508:52;15553:6;15548:3;15541:4;15534:5;15530:16;15508:52;;;15581:29;15603:6;15581:29;;;15576:3;15572:39;15565:46;;15375:241;;;;;;15623:339;;15731:35;15760:5;15731:35;;;15778:71;15842:6;15837:3;15778:71;;;15771:78;;15854:52;15899:6;15894:3;15887:4;15880:5;15876:16;15854:52;;;15927:29;15949:6;15927:29;;;15922:3;15918:39;15911:46;;15711:251;;;;;;15970:364;;16130:67;16194:2;16189:3;16130:67;;;16123:74;;16230:66;16226:1;16221:3;16217:11;16210:87;16325:2;16320:3;16316:12;16309:19;;16116:218;;;;16343:400;;16521:85;16603:2;16598:3;16521:85;;;16514:92;;16639:66;16635:1;16630:3;16626:11;16619:87;16734:2;16729:3;16725:12;16718:19;;16507:236;;;;16752:465;;16912:67;16976:2;16971:3;16912:67;;;16905:74;;17012:66;17008:1;17003:3;16999:11;16992:87;17113:66;17108:2;17103:3;17099:12;17092:88;17208:2;17203:3;17199:12;17192:19;;16898:319;;;;17226:465;;17386:67;17450:2;17445:3;17386:67;;;17379:74;;17486:66;17482:1;17477:3;17473:11;17466:87;17587:66;17582:2;17577:3;17573:12;17566:88;17682:2;17677:3;17673:12;17666:19;;17372:319;;;;17700:465;;17860:67;17924:2;17919:3;17860:67;;;17853:74;;17960:66;17956:1;17951:3;17947:11;17940:87;18061:66;18056:2;18051:3;18047:12;18040:88;18156:2;18151:3;18147:12;18140:19;;17846:319;;;;18174:465;;18334:67;18398:2;18393:3;18334:67;;;18327:74;;18434:66;18430:1;18425:3;18421:11;18414:87;18535:66;18530:2;18525:3;18521:12;18514:88;18630:2;18625:3;18621:12;18614:19;;18320:319;;;;18648:465;;18808:67;18872:2;18867:3;18808:67;;;18801:74;;18908:66;18904:1;18899:3;18895:11;18888:87;19009:66;19004:2;18999:3;18995:12;18988:88;19104:2;19099:3;19095:12;19088:19;;18794:319;;;;19122:465;;19282:67;19346:2;19341:3;19282:67;;;19275:74;;19382:66;19378:1;19373:3;19369:11;19362:87;19483:66;19478:2;19473:3;19469:12;19462:88;19578:2;19573:3;19569:12;19562:19;;19268:319;;;;19596:465;;19756:67;19820:2;19815:3;19756:67;;;19749:74;;19856:66;19852:1;19847:3;19843:11;19836:87;19957:66;19952:2;19947:3;19943:12;19936:88;20052:2;20047:3;20043:12;20036:19;;19742:319;;;;20070:465;;20230:67;20294:2;20289:3;20230:67;;;20223:74;;20330:66;20326:1;20321:3;20317:11;20310:87;20431:66;20426:2;20421:3;20417:12;20410:88;20526:2;20521:3;20517:12;20510:19;;20216:319;;;;20543:113;20626:24;20644:5;20626:24;;;20621:3;20614:37;20608:48;;;20663:107;20742:22;20758:5;20742:22;;;20737:3;20730:35;20724:46;;;20777:383;;20924:75;20995:3;20986:6;20924:75;;;21021:2;21016:3;21012:12;21005:19;;21035:75;21106:3;21097:6;21035:75;;;21132:2;21127:3;21123:12;21116:19;;21152:3;21145:10;;20912:248;;;;;;21167:282;;21321:103;21420:3;21411:6;21403;21321:103;;;21314:110;;21441:3;21434:10;;21302:147;;;;;;21456:511;;21683:148;21827:3;21683:148;;;21676:155;;21842:75;21913:3;21904:6;21842:75;;;21939:2;21934:3;21930:12;21923:19;;21959:3;21952:10;;21664:303;;;;;21974:213;;22092:2;22081:9;22077:18;22069:26;;22106:71;22174:1;22163:9;22159:17;22150:6;22106:71;;;22063:124;;;;;22194:432;;22370:2;22359:9;22355:18;22347:26;;22384:71;22452:1;22441:9;22437:17;22428:6;22384:71;;;22503:9;22497:4;22493:20;22488:2;22477:9;22473:18;22466:48;22528:88;22611:4;22602:6;22594;22528:88;;;22520:96;;22341:285;;;;;;;22633:647;;22865:2;22854:9;22850:18;22842:26;;22879:71;22947:1;22936:9;22932:17;22923:6;22879:71;;;22998:9;22992:4;22988:20;22983:2;22972:9;22968:18;22961:48;23023:88;23106:4;23097:6;23089;23023:88;;;23015:96;;23159:9;23153:4;23149:20;23144:2;23133:9;23129:18;23122:48;23184:86;23265:4;23256:6;23248;23184:86;;;23176:94;;22836:444;;;;;;;;;23287:523;;23481:2;23470:9;23466:18;23458:26;;23495:71;23563:1;23552:9;23548:17;23539:6;23495:71;;;23614:9;23608:4;23604:20;23599:2;23588:9;23584:18;23577:48;23639:78;23712:4;23703:6;23639:78;;;23631:86;;23728:72;23796:2;23785:9;23781:18;23772:6;23728:72;;;23452:358;;;;;;;23817:719;;24057:3;24046:9;24042:19;24034:27;;24072:71;24140:1;24129:9;24125:17;24116:6;24072:71;;;24191:9;24185:4;24181:20;24176:2;24165:9;24161:18;24154:48;24216:78;24289:4;24280:6;24216:78;;;24208:86;;24305:72;24373:2;24362:9;24358:18;24349:6;24305:72;;;24425:9;24419:4;24415:20;24410:2;24399:9;24395:18;24388:48;24450:76;24521:4;24512:6;24450:76;;;24442:84;;24028:508;;;;;;;;24543:779;;24841:2;24830:9;24826:18;24818:26;;24891:9;24885:4;24881:20;24877:1;24866:9;24862:17;24855:47;24916:120;25031:4;25022:6;24916:120;;;24908:128;;25084:9;25078:4;25074:20;25069:2;25058:9;25054:18;25047:48;25109:120;25224:4;25215:6;25109:120;;;25101:128;;25240:72;25308:2;25297:9;25293:18;25284:6;25240:72;;;24812:510;;;;;;;25329:201;;25441:2;25430:9;25426:18;25418:26;;25455:65;25517:1;25506:9;25502:17;25493:6;25455:65;;;25412:118;;;;;25537:213;;25655:2;25644:9;25640:18;25632:26;;25669:71;25737:1;25726:9;25722:17;25713:6;25669:71;;;25626:124;;;;;25757:539;;25955:3;25944:9;25940:19;25932:27;;25970:71;26038:1;26027:9;26023:17;26014:6;25970:71;;;26052:68;26116:2;26105:9;26101:18;26092:6;26052:68;;;26131:72;26199:2;26188:9;26184:18;26175:6;26131:72;;;26214;26282:2;26271:9;26267:18;26258:6;26214:72;;;25926:370;;;;;;;;26303:297;;26439:2;26428:9;26424:18;26416:26;;26489:9;26483:4;26479:20;26475:1;26464:9;26460:17;26453:47;26514:76;26585:4;26576:6;26514:76;;;26506:84;;26410:190;;;;;26607:293;;26741:2;26730:9;26726:18;26718:26;;26791:9;26785:4;26781:20;26777:1;26766:9;26762:17;26755:47;26816:74;26885:4;26876:6;26816:74;;;26808:82;;26712:188;;;;;26907:407;;27098:2;27087:9;27083:18;27075:26;;27148:9;27142:4;27138:20;27134:1;27123:9;27119:17;27112:47;27173:131;27299:4;27173:131;;;27165:139;;27069:245;;;;27321:407;;27512:2;27501:9;27497:18;27489:26;;27562:9;27556:4;27552:20;27548:1;27537:9;27533:17;27526:47;27587:131;27713:4;27587:131;;;27579:139;;27483:245;;;;27735:407;;27926:2;27915:9;27911:18;27903:26;;27976:9;27970:4;27966:20;27962:1;27951:9;27947:17;27940:47;28001:131;28127:4;28001:131;;;27993:139;;27897:245;;;;28149:407;;28340:2;28329:9;28325:18;28317:26;;28390:9;28384:4;28380:20;28376:1;28365:9;28361:17;28354:47;28415:131;28541:4;28415:131;;;28407:139;;28311:245;;;;28563:407;;28754:2;28743:9;28739:18;28731:26;;28804:9;28798:4;28794:20;28790:1;28779:9;28775:17;28768:47;28829:131;28955:4;28829:131;;;28821:139;;28725:245;;;;28977:407;;29168:2;29157:9;29153:18;29145:26;;29218:9;29212:4;29208:20;29204:1;29193:9;29189:17;29182:47;29243:131;29369:4;29243:131;;;29235:139;;29139:245;;;;29391:407;;29582:2;29571:9;29567:18;29559:26;;29632:9;29626:4;29622:20;29618:1;29607:9;29603:17;29596:47;29657:131;29783:4;29657:131;;;29649:139;;29553:245;;;;29805:407;;29996:2;29985:9;29981:18;29973:26;;30046:9;30040:4;30036:20;30032:1;30021:9;30017:17;30010:47;30071:131;30197:4;30071:131;;;30063:139;;29967:245;;;;30219:407;;30410:2;30399:9;30395:18;30387:26;;30460:9;30454:4;30450:20;30446:1;30435:9;30431:17;30424:47;30485:131;30611:4;30485:131;;;30477:139;;30381:245;;;;30633:412;;30799:2;30788:9;30784:18;30776:26;;30813:71;30881:1;30870:9;30866:17;30857:6;30813:71;;;30932:9;30926:4;30922:20;30917:2;30906:9;30902:18;30895:48;30957:78;31030:4;31021:6;30957:78;;;30949:86;;30770:275;;;;;;31052:256;;31114:2;31108:9;31098:19;;31152:4;31144:6;31140:17;31251:6;31239:10;31236:22;31215:18;31203:10;31200:34;31197:62;31194:2;;;31272:1;31269;31262:12;31194:2;31292:10;31288:2;31281:22;31092:216;;;;;31315:304;;31474:18;31466:6;31463:30;31460:2;;;31506:1;31503;31496:12;31460:2;31541:4;31533:6;31529:17;31521:25;;31604:4;31598;31594:15;31586:23;;31397:222;;;;31626:310;;31791:18;31783:6;31780:30;31777:2;;;31823:1;31820;31813:12;31777:2;31858:4;31850:6;31846:17;31838:25;;31921:4;31915;31911:15;31903:23;;31714:222;;;;31943:321;;32086:18;32078:6;32075:30;32072:2;;;32118:1;32115;32108:12;32072:2;32185:4;32181:9;32174:4;32166:6;32162:17;32158:33;32150:41;;32249:4;32243;32239:15;32231:23;;32009:255;;;;32271:318;;32411:18;32403:6;32400:30;32397:2;;;32443:1;32440;32433:12;32397:2;32510:4;32506:9;32499:4;32491:6;32487:17;32483:33;32475:41;;32574:4;32568;32564:15;32556:23;;32334:255;;;;32596:322;;32740:18;32732:6;32729:30;32726:2;;;32772:1;32769;32762:12;32726:2;32839:4;32835:9;32828:4;32820:6;32816:17;32812:33;32804:41;;32903:4;32897;32893:15;32885:23;;32663:255;;;;32925:157;;33017:3;33009:11;;33055:4;33050:3;33046:14;33038:22;;33003:79;;;;33089:143;;33204:5;33198:12;33188:22;;33169:63;;;;33239:121;;33332:5;33326:12;33316:22;;33297:63;;;;33367:118;;33457:5;33451:12;33441:22;;33422:63;;;;33492:122;;33586:5;33580:12;33570:22;;33551:63;;;;33621:114;;33725:4;33720:3;33716:14;33708:22;;33702:33;;;;33743:184;;33879:6;33874:3;33867:19;33916:4;33911:3;33907:14;33892:29;;33860:67;;;;;33936:162;;34050:6;34045:3;34038:19;34087:4;34082:3;34078:14;34063:29;;34031:67;;;;;34107:144;;34242:3;34227:18;;34220:31;;;;;34260:153;;34365:6;34360:3;34353:19;34402:4;34397:3;34393:14;34378:29;;34346:67;;;;;34422:163;;34537:6;34532:3;34525:19;34574:4;34569:3;34565:14;34550:29;;34518:67;;;;;34594:145;;34730:3;34715:18;;34708:31;;;;;34747:91;;34809:24;34827:5;34809:24;;;34798:35;;34792:46;;;;34845:99;;34915:24;34933:5;34915:24;;;34904:35;;34898:46;;;;34951:85;;35024:5;35017:13;35010:21;34999:32;;34993:43;;;;35043:72;;35105:5;35094:16;;35088:27;;;;35122:121;;35195:42;35188:5;35184:54;35173:65;;35167:76;;;;35250:72;;35312:5;35301:16;;35295:27;;;;35329:81;;35400:4;35393:5;35389:16;35378:27;;35372:38;;;;35418:145;35499:6;35494:3;35489;35476:30;35555:1;35546:6;35541:3;35537:16;35530:27;35469:94;;;;35572:268;35637:1;35644:101;35658:6;35655:1;35652:13;35644:101;;;35734:1;35729:3;35725:11;35719:18;35715:1;35710:3;35706:11;35699:39;35680:2;35677:1;35673:10;35668:15;;35644:101;;;35760:6;35757:1;35754:13;35751:2;;;35825:1;35816:6;35811:3;35807:16;35800:27;35751:2;35621:219;;;;;35848:95;;35912:26;35932:5;35912:26;;;35901:37;;35895:48;;;;35950:74;;36014:5;36003:16;;35997:27;;;;36031:89;;36095:20;36109:5;36095:20;;;36084:31;;36078:42;;;;36127:97;;36215:2;36211:7;36206:2;36199:5;36195:14;36191:28;36181:38;;36175:49;;;;36232:94;;36310:5;36306:2;36302:14;36280:36;;36274:52;;;;36334:117;36403:24;36421:5;36403:24;;;36396:5;36393:35;36383:2;;36442:1;36439;36432:12;36383:2;36377:74;;36458:133;36535:32;36561:5;36535:32;;;36528:5;36525:43;36515:2;;36582:1;36579;36572:12;36515:2;36509:82;;36598:117;36667:24;36685:5;36667:24;;;36660:5;36657:35;36647:2;;36706:1;36703;36696:12;36647:2;36641:74;
Swarm Source
bzzr://fba7787a2333da4a0399f4857616b5fb435314fd9dcaf1fcb055eb78c0c3f18a
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.