Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
187 MADC
Holders
150
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 MADCLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
NFT
Compiler Version
v0.8.6+commit.11564f7e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-05-27 */ // Sources flattened with hardhat v2.9.6 https://hardhat.org // File @openzeppelin/contracts/access/[email protected] // SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged( bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole ); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked( bytes32 indexed role, address indexed account, address indexed sender ); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File @openzeppelin/contracts/utils/introspection/[email protected] // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File @openzeppelin/contracts/access/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require( account == _msgSender(), "AccessControl: can only renounce roles for self" ); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer( address indexed from, address indexed to, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval( address indexed owner, address indexed approved, uint256 indexed tokenId ); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll( address indexed owner, address indexed operator, bool approved ); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File @openzeppelin/contracts/utils/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require( address(this).balance >= amount, "Address: insufficient balance" ); (bool success, ) = recipient.call{value: amount}(""); require( success, "Address: unable to send value, recipient may have reverted" ); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue( target, data, value, "Address: low-level call with value failed" ); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require( address(this).balance >= value, "Address: insufficient balance for call" ); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}( data ); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall( target, data, "Address: low-level static call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall( target, data, "Address: low-level delegate call failed" ); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File @openzeppelin/contracts/token/ERC721/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require( owner != address(0), "ERC721: balance query for the zero address" ); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require( owner != address(0), "ERC721: owner query for nonexistent token" ); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require( _exists(tokenId), "ERC721Metadata: URI query for nonexistent token" ); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require( _exists(tokenId), "ERC721: approved query for nonexistent token" ); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved" ); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require( _checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require( _exists(tokenId), "ERC721: operator query for nonexistent token" ); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require( ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner" ); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received( _msgSender(), from, tokenId, _data ) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert( "ERC721: transfer to non ERC721Receiver implementer" ); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require( index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds" ); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require( index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds" ); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Burnable.sol) pragma solidity ^0.8.0; /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require( _isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved" ); _burn(tokenId); } } // File @openzeppelin/contracts/security/[email protected] // OpenZeppelin Contracts v4.4.1 (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File @openzeppelin/contracts/token/ERC721/extensions/[email protected] // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Pausable.sol) pragma solidity ^0.8.0; /** * @dev ERC721 token with pausable token transfers, minting and burning. * * Useful for scenarios such as preventing trades until the end of an evaluation * period, or having an emergency switch for freezing all token transfers in the * event of a large bug. */ abstract contract ERC721Pausable is ERC721, Pausable { /** * @dev See {ERC721-_beforeTokenTransfer}. * * Requirements: * * - the contract must not be paused. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); require(!paused(), "ERC721Pausable: token transfer while paused"); } } // File @openzeppelin/contracts/interfaces/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo(uint256 tokenId, uint256 salePrice) external view returns (address receiver, uint256 royaltyAmount); } // File @openzeppelin/contracts/token/common/[email protected] // OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `tokenId` must be already minted. * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty( uint256 tokenId, address receiver, uint96 feeNumerator ) internal virtual { require( feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice" ); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } } // File contracts/NFT.sol pragma solidity ^0.8.0; contract NFT is AccessControl, ERC2981, ERC721Enumerable, ERC721Burnable, ERC721Pausable { event RoyaltyWalletChanged( address indexed previousWallet, address indexed newWallet ); event RoyaltyFeeChanged(uint256 previousFee, uint256 newFee); event BaseURIChanged(string previousURI, string newURI); bytes32 public constant OWNER_ROLE = keccak256("OWNER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); string private _baseTokenURI; bool public isArtCodeSealed; string public artCode; string public artCodeDependencies; // e.g., [email protected] string public artCodeDescription; /** * @param _name ERC721 token name * @param _symbol ERC721 token symbol * @param _uri Base token uri * @param _royaltyWallet Wallet where royalties should be sent * @param _royaltyFee Fee numerator to be used for fees */ constructor( string memory _name, string memory _symbol, string memory _uri, address _royaltyWallet, uint96 _royaltyFee ) ERC721(_name, _symbol) { _setBaseTokenURI(_uri); _setDefaultRoyalty(_royaltyWallet, _royaltyFee); _setupRole(DEFAULT_ADMIN_ROLE, msg.sender); _setupRole(OWNER_ROLE, msg.sender); _setupRole(MINTER_ROLE, msg.sender); } /** * @dev Throws if called by any account other than owners. Implemented using the underlying AccessControl methods. */ modifier onlyOwners() { require( hasRole(OWNER_ROLE, _msgSender()), "Caller does not have the OWNER_ROLE" ); _; } /** * @dev Throws if called by any account other than minters. Implemented using the underlying AccessControl methods. */ modifier onlyMinters() { require( hasRole(MINTER_ROLE, _msgSender()), "Caller does not have the MINTER_ROLE" ); _; } /** * @dev Mints the specified token ids to the recipient addresses * @param recipient Address that will receive the tokens * @param tokenIds Array of tokenIds to be minted */ function mint(address recipient, uint256[] calldata tokenIds) external onlyMinters { for (uint256 i = 0; i < tokenIds.length; i++) { _mint(recipient, tokenIds[i]); } } /** * @dev Mints the specified token id to the recipient addresses * @dev The unused string parameter exists to support the API used by ChainBridge. * @param recipient Address that will receive the tokens * @param tokenId tokenId to be minted */ function mint( address recipient, uint256 tokenId, string calldata ) external onlyMinters { _mint(recipient, tokenId); } /** * @dev Pauses token transfers */ function pause() external onlyOwners { _pause(); } /** * @dev Unpauses token transfers */ function unpause() external onlyOwners { _unpause(); } /** * @dev Sets the base token URI * @param uri Base token URI */ function setBaseTokenURI(string calldata uri) external onlyOwners { _setBaseTokenURI(uri); } /** * @dev Sets the generative art script and supporting information * @param _artCode The generative art script or source code * @param _artCodeDependencies Any information about dependencies or required tools to run the script * @param _artCodeDescription Description of the script */ function setArtCode( string memory _artCode, string memory _artCodeDependencies, string memory _artCodeDescription ) external onlyOwners { require(isArtCodeSealed == false, "Art code is sealed."); artCode = _artCode; artCodeDependencies = _artCodeDependencies; artCodeDescription = _artCodeDescription; } /** * @dev Locks the already set generative art script and supporting information */ function sealArtCode() external onlyOwners { require(isArtCodeSealed == false, "Art code is already sealed."); require(bytes(artCode).length != 0, "No art code set."); require( bytes(artCodeDependencies).length != 0, "No art code deps. set." ); require( bytes(artCodeDescription).length != 0, "No art code description set." ); isArtCodeSealed = true; } /** * @dev For each existing tokenId, it returns the URI where metadata is stored * @param tokenId Token id */ function tokenURI(uint256 tokenId) public view override returns (string memory) { string memory uri = super.tokenURI(tokenId); return bytes(uri).length > 0 ? string(abi.encodePacked(uri, ".json")) : ""; } function supportsInterface(bytes4 interfaceId) public view override(AccessControl, ERC2981, ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override(ERC721, ERC721Enumerable, ERC721Pausable) { super._beforeTokenTransfer(from, to, tokenId); } function _setBaseTokenURI(string memory newURI) internal { emit BaseURIChanged(_baseTokenURI, newURI); _baseTokenURI = newURI; } function _baseURI() internal view override returns (string memory) { return _baseTokenURI; } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"_royaltyWallet","type":"address"},{"internalType":"uint96","name":"_royaltyFee","type":"uint96"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"previousURI","type":"string"},{"indexed":false,"internalType":"string","name":"newURI","type":"string"}],"name":"BaseURIChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"previousFee","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"RoyaltyFeeChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousWallet","type":"address"},{"indexed":true,"internalType":"address","name":"newWallet","type":"address"}],"name":"RoyaltyWalletChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"OWNER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artCode","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artCodeDependencies","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"artCodeDescription","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isArtCodeSealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"","type":"string"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"sealArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_artCode","type":"string"},{"internalType":"string","name":"_artCodeDependencies","type":"string"},{"internalType":"string","name":"_artCodeDescription","type":"string"}],"name":"setArtCode","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040516200604f3803806200604f83398181016040528101906200003791906200060a565b8484816003908051906020019062000051929190620004ae565b5080600490805190602001906200006a929190620004ae565b5050506000600d60006101000a81548160ff02191690831515021790555062000099836200012f60201b60201c565b620000ab82826200018760201b60201c565b620000c06000801b336200032b60201b60201c565b620000f27fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e336200032b60201b60201c565b620001247f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6336200032b60201b60201c565b505050505062000b36565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e82604051620001639291906200080a565b60405180910390a180600e908051906020019062000183929190620004ae565b5050565b620001976200034160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620001f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001ef9062000845565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200026b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002629062000867565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600160008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6200033d82826200034b60201b60201c565b5050565b6000612710905090565b6200035d82826200043c60201b60201c565b6200043857600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003dd620004a660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b828054620004bc906200099b565b90600052602060002090601f016020900481019282620004e057600085556200052c565b82601f10620004fb57805160ff19168380011785556200052c565b828001600101855582156200052c579182015b828111156200052b5782518255916020019190600101906200050e565b5b5090506200053b91906200053f565b5090565b5b808211156200055a57600081600090555060010162000540565b5090565b6000620005756200056f84620008b2565b62000889565b90508281526020810184848401111562000594576200059362000a6a565b5b620005a184828562000965565b509392505050565b600081519050620005ba8162000b02565b92915050565b600082601f830112620005d857620005d762000a65565b5b8151620005ea8482602086016200055e565b91505092915050565b600081519050620006048162000b1c565b92915050565b600080600080600060a0868803121562000629576200062862000a74565b5b600086015167ffffffffffffffff8111156200064a576200064962000a6f565b5b6200065888828901620005c0565b955050602086015167ffffffffffffffff8111156200067c576200067b62000a6f565b5b6200068a88828901620005c0565b945050604086015167ffffffffffffffff811115620006ae57620006ad62000a6f565b5b620006bc88828901620005c0565b9350506060620006cf88828901620005a9565b9250506080620006e288828901620005f3565b9150509295509295909350565b6000620006fc82620008fd565b62000708818562000908565b93506200071a81856020860162000965565b620007258162000a79565b840191505092915050565b600081546200073f816200099b565b6200074b818662000908565b945060018216600081146200076957600181146200077c57620007b3565b60ff1983168652602086019350620007b3565b6200078785620008e8565b60005b83811015620007ab578154818901526001820191506020810190506200078a565b808801955050505b50505092915050565b6000620007cb602a8362000908565b9150620007d88262000a8a565b604082019050919050565b6000620007f260198362000908565b9150620007ff8262000ad9565b602082019050919050565b6000604082019050818103600083015262000826818562000730565b905081810360208301526200083c8184620006ef565b90509392505050565b600060208201905081810360008301526200086081620007bc565b9050919050565b600060208201905081810360008301526200088281620007e3565b9050919050565b600062000895620008a8565b9050620008a38282620009d1565b919050565b6000604051905090565b600067ffffffffffffffff821115620008d057620008cf62000a36565b5b620008db8262000a79565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600082825260208201905092915050565b600062000926826200092d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006bffffffffffffffffffffffff82169050919050565b60005b838110156200098557808201518184015260208101905062000968565b8381111562000995576000848401525b50505050565b60006002820490506001821680620009b457607f821691505b60208210811415620009cb57620009ca62000a07565b5b50919050565b620009dc8262000a79565b810181811067ffffffffffffffff82111715620009fe57620009fd62000a36565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b62000b0d8162000919565b811462000b1957600080fd5b50565b62000b27816200094d565b811462000b3357600080fd5b50565b6155098062000b466000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063b88d4fde116100b8578063d53913931161007c578063d539139314610678578063d547741f14610696578063de836ebd146106b2578063e58378bb146106ce578063e985e9c5146106ec57610232565b8063b88d4fde146105d4578063c87b56dd146105f0578063cb53a7d614610620578063d3f600211461063e578063d3fc98641461065c57610232565b806395d89b41116100ff57806395d89b411461054057806396052ded1461055e5780639fca399f1461057c578063a217fddf1461059a578063a22cb465146105b857610232565b806370a08231146104ba5780638456cb59146104ea5780638fab34e7146104f457806391d148541461051057610232565b80632f745c59116101be57806342842e0e1161018257806342842e0e1461040457806342966c68146104205780634f6ccce71461043c5780635c975abb1461046c5780636352211e1461048a57610232565b80632f745c591461038857806330176e13146103b857806330e46619146103d457806336568abe146103de5780633f4ba83a146103fa57610232565b806318160ddd1161020557806318160ddd146102d157806323b872dd146102ef578063248a9ca31461030b5780632a55205a1461033b5780632f2ff15d1461036c57610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613abc565b61071c565b60405161025e9190614346565b60405180910390f35b61026f61072e565b60405161027c919061437c565b60405180910390f35b61029f600480360381019061029a9190613c0a565b6107c0565b6040516102ac91906142b6565b60405180910390f35b6102cf60048036038101906102ca919061399b565b610845565b005b6102d961095d565b6040516102e69190614775565b60405180910390f35b61030960048036038101906103049190613825565b61096a565b005b61032560048036038101906103209190613a4f565b6109ca565b6040516103329190614361565b60405180910390f35b61035560048036038101906103509190613c37565b6109e9565b60405161036392919061431d565b60405180910390f35b61038660048036038101906103819190613a7c565b610bd4565b005b6103a2600480360381019061039d919061399b565b610bf5565b6040516103af9190614775565b60405180910390f35b6103d260048036038101906103cd9190613b16565b610c9a565b005b6103dc610d5b565b005b6103f860048036038101906103f39190613a7c565b610f34565b005b610402610fb7565b005b61041e60048036038101906104199190613825565b611031565b005b61043a60048036038101906104359190613c0a565b611051565b005b61045660048036038101906104519190613c0a565b6110ad565b6040516104639190614775565b60405180910390f35b61047461111e565b6040516104819190614346565b60405180910390f35b6104a4600480360381019061049f9190613c0a565b611135565b6040516104b191906142b6565b60405180910390f35b6104d460048036038101906104cf91906137b8565b6111e7565b6040516104e19190614775565b60405180910390f35b6104f261129f565b005b61050e60048036038101906105099190613b63565b611319565b005b61052a60048036038101906105259190613a7c565b611429565b6040516105379190614346565b60405180910390f35b610548611493565b604051610555919061437c565b60405180910390f35b610566611525565b6040516105739190614346565b60405180910390f35b610584611538565b604051610591919061437c565b60405180910390f35b6105a26115c6565b6040516105af9190614361565b60405180910390f35b6105d260048036038101906105cd919061395b565b6115cd565b005b6105ee60048036038101906105e99190613878565b6115e3565b005b61060a60048036038101906106059190613c0a565b611645565b604051610617919061437c565b60405180910390f35b61062861169b565b604051610635919061437c565b60405180910390f35b610646611729565b604051610653919061437c565b60405180910390f35b610676600480360381019061067191906139db565b6117b7565b005b610680611837565b60405161068d9190614361565b60405180910390f35b6106b060048036038101906106ab9190613a7c565b61185b565b005b6106cc60048036038101906106c791906138fb565b61187c565b005b6106d6611936565b6040516106e39190614361565b60405180910390f35b610706600480360381019061070191906137e5565b61195a565b6040516107139190614346565b60405180910390f35b6000610727826119ee565b9050919050565b60606003805461073d90614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461076990614a6e565b80156107b65780601f1061078b576101008083540402835291602001916107b6565b820191906000526020600020905b81548152906001019060200180831161079957829003601f168201915b5050505050905090565b60006107cb82611a68565b61080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080190614615565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085082611135565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890614695565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108e0611ad4565b73ffffffffffffffffffffffffffffffffffffffff16148061090f575061090e81610909611ad4565b61195a565b5b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590614575565b60405180910390fd5b6109588383611adc565b505050565b6000600b80549050905090565b61097b610975611ad4565b82611b95565b6109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906146d5565b60405180910390fd5b6109c5838383611c73565b505050565b6000806000838152602001908152602001600020600101549050919050565b6000806000600260008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610b7f5760016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b89611eda565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bb591906148f6565b610bbf91906148c5565b90508160000151819350935050509250929050565b610bdd826109ca565b610be681611ee4565b610bf08383611ef8565b505050565b6000610c00836111e7565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890614455565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ccb7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610cc6611ad4565b611429565b610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190614435565b60405180910390fd5b610d5782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611fd8565b5050565b610d8c7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610d87611ad4565b611429565b610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614435565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890614515565b60405180910390fd5b600060108054610e3090614a6e565b90501415610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90614675565b60405180910390fd5b600060118054610e8290614a6e565b90501415610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc906146b5565b60405180910390fd5b600060128054610ed490614a6e565b90501415610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614635565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b610f3c611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614755565b60405180910390fd5b610fb3828261202c565b5050565b610fe87fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610fe3611ad4565b611429565b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90614435565b60405180910390fd5b61102f61210d565b565b61104c838383604051806020016040528060008152506115e3565b505050565b61106261105c611ad4565b82611b95565b6110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890614735565b60405180910390fd5b6110aa816121af565b50565b60006110b761095d565b82106110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef906146f5565b60405180910390fd5b600b828154811061110c5761110b614c07565b5b90600052602060002001549050919050565b6000600d60009054906101000a900460ff16905090565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d5906145b5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90614595565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d07fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6112cb611ad4565b611429565b61130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614435565b60405180910390fd5b6113176122cc565b565b61134a7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e611345611ad4565b611429565b611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614435565b60405180910390fd5b60001515600f60009054906101000a900460ff161515146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906145d5565b60405180910390fd5b82601090805190602001906113f592919061350b565b50816011908051906020019061140c92919061350b565b50806012908051906020019061142392919061350b565b50505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546114a290614a6e565b80601f01602080910402602001604051908101604052809291908181526020018280546114ce90614a6e565b801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1681565b6012805461154590614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461157190614a6e565b80156115be5780601f10611593576101008083540402835291602001916115be565b820191906000526020600020905b8154815290600101906020018083116115a157829003601f168201915b505050505081565b6000801b81565b6115df6115d8611ad4565b838361236f565b5050565b6115f46115ee611ad4565b83611b95565b611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a906146d5565b60405180910390fd5b61163f848484846124dc565b50505050565b6060600061165283612538565b905060008151116116725760405180602001604052806000815250611693565b80604051602001611683919061425a565b6040516020818303038152906040525b915050919050565b601080546116a890614a6e565b80601f01602080910402602001604051908101604052809291908181526020018280546116d490614a6e565b80156117215780601f106116f657610100808354040283529160200191611721565b820191906000526020600020905b81548152906001019060200180831161170457829003601f168201915b505050505081565b6011805461173690614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461176290614a6e565b80156117af5780601f10611784576101008083540402835291602001916117af565b820191906000526020600020905b81548152906001019060200180831161179257829003601f168201915b505050505081565b6117e87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66117e3611ad4565b611429565b611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614715565b60405180910390fd5b61183184846125df565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611864826109ca565b61186d81611ee4565b611877838361202c565b505050565b6118ad7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118a8611ad4565b611429565b6118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614715565b60405180910390fd5b60005b828290508110156119305761191d8484848481811061191157611910614c07565b5b905060200201356125df565b808061192890614ad1565b9150506118ef565b50505050565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a615750611a60826127b9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4f83611135565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba082611a68565b611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614535565b60405180910390fd5b6000611bea83611135565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c2c5750611c2b818561195a565b5b80611c6a57508373ffffffffffffffffffffffffffffffffffffffff16611c52846107c0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c9382611135565b73ffffffffffffffffffffffffffffffffffffffff1614611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614495565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906144d5565b60405180910390fd5b611d6483838361289b565b611d6f600082611adc565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190614950565b925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e16919061486f565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed58383836128ab565b505050565b6000612710905090565b611ef581611ef0611ad4565b6128b0565b50565b611f028282611429565b611fd457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f79611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e8260405161200a92919061439e565b60405180910390a180600e908051906020019061202892919061350b565b5050565b6120368282611429565b1561210957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120ae611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61211561111e565b612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614415565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612198611ad4565b6040516121a591906142b6565b60405180910390a1565b60006121ba82611135565b90506121c88160008461289b565b6121d3600083611adc565b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122239190614950565b925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122c8816000846128ab565b5050565b6122d461111e565b15612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614555565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612358611ad4565b60405161236591906142b6565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d5906144f5565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124cf9190614346565b60405180910390a3505050565b6124e7848484611c73565b6124f38484848461294d565b612532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252990614475565b60405180910390fd5b50505050565b606061254382611a68565b612582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257990614655565b60405180910390fd5b600061258c612ae4565b905060008151116125ac57604051806020016040528060008152506125d7565b806125b684612b76565b6040516020016125c7929190614236565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561264f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612646906145f5565b60405180910390fd5b61265881611a68565b15612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906144b5565b60405180910390fd5b6126a46000838361289b565b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f4919061486f565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b5600083836128ab565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061288457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612894575061289382612cd7565b5b9050919050565b6128a6838383612d51565b505050565b505050565b6128ba8282611429565b612949576128df8173ffffffffffffffffffffffffffffffffffffffff166014612da9565b6128ed8360001c6020612da9565b6040516020016128fe92919061427c565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612940919061437c565b60405180910390fd5b5050565b600061296e8473ffffffffffffffffffffffffffffffffffffffff16612fe5565b15612ad7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612997611ad4565b8786866040518563ffffffff1660e01b81526004016129b994939291906142d1565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a0457506040513d601f19601f82011682018060405250810190612a019190613ae9565b60015b612a87573d8060008114612a34576040519150601f19603f3d011682016040523d82523d6000602084013e612a39565b606091505b50600081511415612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614475565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612adc565b600190505b949350505050565b6060600e8054612af390614a6e565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1f90614a6e565b8015612b6c5780601f10612b4157610100808354040283529160200191612b6c565b820191906000526020600020905b815481529060010190602001808311612b4f57829003601f168201915b5050505050905090565b60606000821415612bbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cd2565b600082905060005b60008214612bf0578080612bd990614ad1565b915050600a82612be991906148c5565b9150612bc6565b60008167ffffffffffffffff811115612c0c57612c0b614c36565b5b6040519080825280601f01601f191660200182016040528015612c3e5781602001600182028036833780820191505090505b5090505b60008514612ccb57600182612c579190614950565b9150600a85612c669190614b1a565b6030612c72919061486f565b60f81b818381518110612c8857612c87614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cc491906148c5565b9450612c42565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4a5750612d4982613008565b5b9050919050565b612d5c838383613082565b612d6461111e565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b906143f5565b60405180910390fd5b505050565b606060006002836002612dbc91906148f6565b612dc6919061486f565b67ffffffffffffffff811115612ddf57612dde614c36565b5b6040519080825280601f01601f191660200182016040528015612e115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e4957612e48614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ead57612eac614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612eed91906148f6565b612ef7919061486f565b90505b6001811115612f97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f3957612f38614c07565b5b1a60f81b828281518110612f5057612f4f614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f9090614a44565b9050612efa565b5060008414612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd2906143d5565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061307b575061307a82613196565b5b9050919050565b61308d838383613200565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130d0576130cb81613205565b61310f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461310e5761310d838261324e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131525761314d816133bb565b613191565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131905761318f828261348c565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161325b846111e7565b6132659190614950565b90506000600a600084815260200190815260200160002054905081811461334a576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b805490506133cf9190614950565b90506000600c60008481526020019081526020016000205490506000600b83815481106133ff576133fe614c07565b5b9060005260206000200154905080600b838154811061342157613420614c07565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b8054806134705761346f614bd8565b5b6001900381819060005260206000200160009055905550505050565b6000613497836111e7565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b82805461351790614a6e565b90600052602060002090601f0160209004810192826135395760008555613580565b82601f1061355257805160ff1916838001178555613580565b82800160010185558215613580579182015b8281111561357f578251825591602001919060010190613564565b5b50905061358d9190613591565b5090565b5b808211156135aa576000816000905550600101613592565b5090565b60006135c16135bc846147b5565b614790565b9050828152602081018484840111156135dd576135dc614c74565b5b6135e8848285614a02565b509392505050565b60006136036135fe846147e6565b614790565b90508281526020810184848401111561361f5761361e614c74565b5b61362a848285614a02565b509392505050565b60008135905061364181615460565b92915050565b60008083601f84011261365d5761365c614c6a565b5b8235905067ffffffffffffffff81111561367a57613679614c65565b5b60208301915083602082028301111561369657613695614c6f565b5b9250929050565b6000813590506136ac81615477565b92915050565b6000813590506136c18161548e565b92915050565b6000813590506136d6816154a5565b92915050565b6000815190506136eb816154a5565b92915050565b600082601f83011261370657613705614c6a565b5b81356137168482602086016135ae565b91505092915050565b60008083601f84011261373557613734614c6a565b5b8235905067ffffffffffffffff81111561375257613751614c65565b5b60208301915083600182028301111561376e5761376d614c6f565b5b9250929050565b600082601f83011261378a57613789614c6a565b5b813561379a8482602086016135f0565b91505092915050565b6000813590506137b2816154bc565b92915050565b6000602082840312156137ce576137cd614c7e565b5b60006137dc84828501613632565b91505092915050565b600080604083850312156137fc576137fb614c7e565b5b600061380a85828601613632565b925050602061381b85828601613632565b9150509250929050565b60008060006060848603121561383e5761383d614c7e565b5b600061384c86828701613632565b935050602061385d86828701613632565b925050604061386e868287016137a3565b9150509250925092565b6000806000806080858703121561389257613891614c7e565b5b60006138a087828801613632565b94505060206138b187828801613632565b93505060406138c2878288016137a3565b925050606085013567ffffffffffffffff8111156138e3576138e2614c79565b5b6138ef878288016136f1565b91505092959194509250565b60008060006040848603121561391457613913614c7e565b5b600061392286828701613632565b935050602084013567ffffffffffffffff81111561394357613942614c79565b5b61394f86828701613647565b92509250509250925092565b6000806040838503121561397257613971614c7e565b5b600061398085828601613632565b92505060206139918582860161369d565b9150509250929050565b600080604083850312156139b2576139b1614c7e565b5b60006139c085828601613632565b92505060206139d1858286016137a3565b9150509250929050565b600080600080606085870312156139f5576139f4614c7e565b5b6000613a0387828801613632565b9450506020613a14878288016137a3565b935050604085013567ffffffffffffffff811115613a3557613a34614c79565b5b613a418782880161371f565b925092505092959194509250565b600060208284031215613a6557613a64614c7e565b5b6000613a73848285016136b2565b91505092915050565b60008060408385031215613a9357613a92614c7e565b5b6000613aa1858286016136b2565b9250506020613ab285828601613632565b9150509250929050565b600060208284031215613ad257613ad1614c7e565b5b6000613ae0848285016136c7565b91505092915050565b600060208284031215613aff57613afe614c7e565b5b6000613b0d848285016136dc565b91505092915050565b60008060208385031215613b2d57613b2c614c7e565b5b600083013567ffffffffffffffff811115613b4b57613b4a614c79565b5b613b578582860161371f565b92509250509250929050565b600080600060608486031215613b7c57613b7b614c7e565b5b600084013567ffffffffffffffff811115613b9a57613b99614c79565b5b613ba686828701613775565b935050602084013567ffffffffffffffff811115613bc757613bc6614c79565b5b613bd386828701613775565b925050604084013567ffffffffffffffff811115613bf457613bf3614c79565b5b613c0086828701613775565b9150509250925092565b600060208284031215613c2057613c1f614c7e565b5b6000613c2e848285016137a3565b91505092915050565b60008060408385031215613c4e57613c4d614c7e565b5b6000613c5c858286016137a3565b9250506020613c6d858286016137a3565b9150509250929050565b613c8081614984565b82525050565b613c8f81614996565b82525050565b613c9e816149a2565b82525050565b6000613caf8261482c565b613cb98185614842565b9350613cc9818560208601614a11565b613cd281614c83565b840191505092915050565b6000613ce882614837565b613cf28185614853565b9350613d02818560208601614a11565b613d0b81614c83565b840191505092915050565b6000613d2182614837565b613d2b8185614864565b9350613d3b818560208601614a11565b80840191505092915050565b60008154613d5481614a6e565b613d5e8186614853565b94506001821660008114613d795760018114613d8b57613dbe565b60ff1983168652602086019350613dbe565b613d9485614817565b60005b83811015613db657815481890152600182019150602081019050613d97565b808801955050505b50505092915050565b6000613dd4602083614853565b9150613ddf82614c94565b602082019050919050565b6000613df7602b83614853565b9150613e0282614cbd565b604082019050919050565b6000613e1a601483614853565b9150613e2582614d0c565b602082019050919050565b6000613e3d602383614853565b9150613e4882614d35565b604082019050919050565b6000613e60602b83614853565b9150613e6b82614d84565b604082019050919050565b6000613e83603283614853565b9150613e8e82614dd3565b604082019050919050565b6000613ea6602583614853565b9150613eb182614e22565b604082019050919050565b6000613ec9601c83614853565b9150613ed482614e71565b602082019050919050565b6000613eec602483614853565b9150613ef782614e9a565b604082019050919050565b6000613f0f601983614853565b9150613f1a82614ee9565b602082019050919050565b6000613f32601b83614853565b9150613f3d82614f12565b602082019050919050565b6000613f55602c83614853565b9150613f6082614f3b565b604082019050919050565b6000613f78601083614853565b9150613f8382614f8a565b602082019050919050565b6000613f9b603883614853565b9150613fa682614fb3565b604082019050919050565b6000613fbe602a83614853565b9150613fc982615002565b604082019050919050565b6000613fe1602983614853565b9150613fec82615051565b604082019050919050565b6000614004601383614853565b915061400f826150a0565b602082019050919050565b6000614027602083614853565b9150614032826150c9565b602082019050919050565b600061404a602c83614853565b9150614055826150f2565b604082019050919050565b600061406d600583614864565b915061407882615141565b600582019050919050565b6000614090601c83614853565b915061409b8261516a565b602082019050919050565b60006140b3602f83614853565b91506140be82615193565b604082019050919050565b60006140d6601083614853565b91506140e1826151e2565b602082019050919050565b60006140f9602183614853565b91506141048261520b565b604082019050919050565b600061411c601683614853565b91506141278261525a565b602082019050919050565b600061413f603183614853565b915061414a82615283565b604082019050919050565b6000614162602c83614853565b915061416d826152d2565b604082019050919050565b6000614185602483614853565b915061419082615321565b604082019050919050565b60006141a8601783614864565b91506141b382615370565b601782019050919050565b60006141cb603083614853565b91506141d682615399565b604082019050919050565b60006141ee601183614864565b91506141f9826153e8565b601182019050919050565b6000614211602f83614853565b915061421c82615411565b604082019050919050565b614230816149f8565b82525050565b60006142428285613d16565b915061424e8284613d16565b91508190509392505050565b60006142668284613d16565b915061427182614060565b915081905092915050565b60006142878261419b565b91506142938285613d16565b915061429e826141e1565b91506142aa8284613d16565b91508190509392505050565b60006020820190506142cb6000830184613c77565b92915050565b60006080820190506142e66000830187613c77565b6142f36020830186613c77565b6143006040830185614227565b81810360608301526143128184613ca4565b905095945050505050565b60006040820190506143326000830185613c77565b61433f6020830184614227565b9392505050565b600060208201905061435b6000830184613c86565b92915050565b60006020820190506143766000830184613c95565b92915050565b600060208201905081810360008301526143968184613cdd565b905092915050565b600060408201905081810360008301526143b88185613d47565b905081810360208301526143cc8184613cdd565b90509392505050565b600060208201905081810360008301526143ee81613dc7565b9050919050565b6000602082019050818103600083015261440e81613dea565b9050919050565b6000602082019050818103600083015261442e81613e0d565b9050919050565b6000602082019050818103600083015261444e81613e30565b9050919050565b6000602082019050818103600083015261446e81613e53565b9050919050565b6000602082019050818103600083015261448e81613e76565b9050919050565b600060208201905081810360008301526144ae81613e99565b9050919050565b600060208201905081810360008301526144ce81613ebc565b9050919050565b600060208201905081810360008301526144ee81613edf565b9050919050565b6000602082019050818103600083015261450e81613f02565b9050919050565b6000602082019050818103600083015261452e81613f25565b9050919050565b6000602082019050818103600083015261454e81613f48565b9050919050565b6000602082019050818103600083015261456e81613f6b565b9050919050565b6000602082019050818103600083015261458e81613f8e565b9050919050565b600060208201905081810360008301526145ae81613fb1565b9050919050565b600060208201905081810360008301526145ce81613fd4565b9050919050565b600060208201905081810360008301526145ee81613ff7565b9050919050565b6000602082019050818103600083015261460e8161401a565b9050919050565b6000602082019050818103600083015261462e8161403d565b9050919050565b6000602082019050818103600083015261464e81614083565b9050919050565b6000602082019050818103600083015261466e816140a6565b9050919050565b6000602082019050818103600083015261468e816140c9565b9050919050565b600060208201905081810360008301526146ae816140ec565b9050919050565b600060208201905081810360008301526146ce8161410f565b9050919050565b600060208201905081810360008301526146ee81614132565b9050919050565b6000602082019050818103600083015261470e81614155565b9050919050565b6000602082019050818103600083015261472e81614178565b9050919050565b6000602082019050818103600083015261474e816141be565b9050919050565b6000602082019050818103600083015261476e81614204565b9050919050565b600060208201905061478a6000830184614227565b92915050565b600061479a6147ab565b90506147a68282614aa0565b919050565b6000604051905090565b600067ffffffffffffffff8211156147d0576147cf614c36565b5b6147d982614c83565b9050602081019050919050565b600067ffffffffffffffff82111561480157614800614c36565b5b61480a82614c83565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061487a826149f8565b9150614885836149f8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148ba576148b9614b4b565b5b828201905092915050565b60006148d0826149f8565b91506148db836149f8565b9250826148eb576148ea614b7a565b5b828204905092915050565b6000614901826149f8565b915061490c836149f8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561494557614944614b4b565b5b828202905092915050565b600061495b826149f8565b9150614966836149f8565b92508282101561497957614978614b4b565b5b828203905092915050565b600061498f826149d8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a2f578082015181840152602081019050614a14565b83811115614a3e576000848401525b50505050565b6000614a4f826149f8565b91506000821415614a6357614a62614b4b565b5b600182039050919050565b60006002820490506001821680614a8657607f821691505b60208210811415614a9a57614a99614ba9565b5b50919050565b614aa982614c83565b810181811067ffffffffffffffff82111715614ac857614ac7614c36565b5b80604052505050565b6000614adc826149f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b0f57614b0e614b4b565b5b600182019050919050565b6000614b25826149f8565b9150614b30836149f8565b925082614b4057614b3f614b7a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204f574e45525f5260008201527f4f4c450000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41727420636f646520697320616c7265616479207365616c65642e0000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f41727420636f6465206973207365616c65642e00000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f2061727420636f6465206465736372697074696f6e207365742e00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2061727420636f6465207365742e00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2061727420636f646520646570732e207365742e00000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204d494e5445525f60008201527f524f4c4500000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61546981614984565b811461547457600080fd5b50565b61548081614996565b811461548b57600080fd5b50565b615497816149a2565b81146154a257600080fd5b50565b6154ae816149ac565b81146154b957600080fd5b50565b6154c5816149f8565b81146154d057600080fd5b5056fea2646970667358221220adb935ddca55177887a256b44ca9a8a0e2713c9c080dca9e0bdbcb033e4dd96b64736f6c6343000806003300000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006a37c8a9fba923b6404ba956b2b354bb2428d25500000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000144d616443202d20436f6c6f722052687974686d7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d414443000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011697066733a2f2f756e646563696465642f000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063b88d4fde116100b8578063d53913931161007c578063d539139314610678578063d547741f14610696578063de836ebd146106b2578063e58378bb146106ce578063e985e9c5146106ec57610232565b8063b88d4fde146105d4578063c87b56dd146105f0578063cb53a7d614610620578063d3f600211461063e578063d3fc98641461065c57610232565b806395d89b41116100ff57806395d89b411461054057806396052ded1461055e5780639fca399f1461057c578063a217fddf1461059a578063a22cb465146105b857610232565b806370a08231146104ba5780638456cb59146104ea5780638fab34e7146104f457806391d148541461051057610232565b80632f745c59116101be57806342842e0e1161018257806342842e0e1461040457806342966c68146104205780634f6ccce71461043c5780635c975abb1461046c5780636352211e1461048a57610232565b80632f745c591461038857806330176e13146103b857806330e46619146103d457806336568abe146103de5780633f4ba83a146103fa57610232565b806318160ddd1161020557806318160ddd146102d157806323b872dd146102ef578063248a9ca31461030b5780632a55205a1461033b5780632f2ff15d1461036c57610232565b806301ffc9a71461023757806306fdde0314610267578063081812fc14610285578063095ea7b3146102b5575b600080fd5b610251600480360381019061024c9190613abc565b61071c565b60405161025e9190614346565b60405180910390f35b61026f61072e565b60405161027c919061437c565b60405180910390f35b61029f600480360381019061029a9190613c0a565b6107c0565b6040516102ac91906142b6565b60405180910390f35b6102cf60048036038101906102ca919061399b565b610845565b005b6102d961095d565b6040516102e69190614775565b60405180910390f35b61030960048036038101906103049190613825565b61096a565b005b61032560048036038101906103209190613a4f565b6109ca565b6040516103329190614361565b60405180910390f35b61035560048036038101906103509190613c37565b6109e9565b60405161036392919061431d565b60405180910390f35b61038660048036038101906103819190613a7c565b610bd4565b005b6103a2600480360381019061039d919061399b565b610bf5565b6040516103af9190614775565b60405180910390f35b6103d260048036038101906103cd9190613b16565b610c9a565b005b6103dc610d5b565b005b6103f860048036038101906103f39190613a7c565b610f34565b005b610402610fb7565b005b61041e60048036038101906104199190613825565b611031565b005b61043a60048036038101906104359190613c0a565b611051565b005b61045660048036038101906104519190613c0a565b6110ad565b6040516104639190614775565b60405180910390f35b61047461111e565b6040516104819190614346565b60405180910390f35b6104a4600480360381019061049f9190613c0a565b611135565b6040516104b191906142b6565b60405180910390f35b6104d460048036038101906104cf91906137b8565b6111e7565b6040516104e19190614775565b60405180910390f35b6104f261129f565b005b61050e60048036038101906105099190613b63565b611319565b005b61052a60048036038101906105259190613a7c565b611429565b6040516105379190614346565b60405180910390f35b610548611493565b604051610555919061437c565b60405180910390f35b610566611525565b6040516105739190614346565b60405180910390f35b610584611538565b604051610591919061437c565b60405180910390f35b6105a26115c6565b6040516105af9190614361565b60405180910390f35b6105d260048036038101906105cd919061395b565b6115cd565b005b6105ee60048036038101906105e99190613878565b6115e3565b005b61060a60048036038101906106059190613c0a565b611645565b604051610617919061437c565b60405180910390f35b61062861169b565b604051610635919061437c565b60405180910390f35b610646611729565b604051610653919061437c565b60405180910390f35b610676600480360381019061067191906139db565b6117b7565b005b610680611837565b60405161068d9190614361565b60405180910390f35b6106b060048036038101906106ab9190613a7c565b61185b565b005b6106cc60048036038101906106c791906138fb565b61187c565b005b6106d6611936565b6040516106e39190614361565b60405180910390f35b610706600480360381019061070191906137e5565b61195a565b6040516107139190614346565b60405180910390f35b6000610727826119ee565b9050919050565b60606003805461073d90614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461076990614a6e565b80156107b65780601f1061078b576101008083540402835291602001916107b6565b820191906000526020600020905b81548152906001019060200180831161079957829003601f168201915b5050505050905090565b60006107cb82611a68565b61080a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080190614615565b60405180910390fd5b6007600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061085082611135565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156108c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b890614695565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108e0611ad4565b73ffffffffffffffffffffffffffffffffffffffff16148061090f575061090e81610909611ad4565b61195a565b5b61094e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094590614575565b60405180910390fd5b6109588383611adc565b505050565b6000600b80549050905090565b61097b610975611ad4565b82611b95565b6109ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b1906146d5565b60405180910390fd5b6109c5838383611c73565b505050565b6000806000838152602001908152602001600020600101549050919050565b6000806000600260008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610b7f5760016040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b89611eda565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610bb591906148f6565b610bbf91906148c5565b90508160000151819350935050509250929050565b610bdd826109ca565b610be681611ee4565b610bf08383611ef8565b505050565b6000610c00836111e7565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890614455565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ccb7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610cc6611ad4565b611429565b610d0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0190614435565b60405180910390fd5b610d5782828080601f016020809104026020016040519081016040528093929190818152602001838380828437600081840152601f19601f82011690508083019250505050505050611fd8565b5050565b610d8c7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610d87611ad4565b611429565b610dcb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc290614435565b60405180910390fd5b60001515600f60009054906101000a900460ff16151514610e21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1890614515565b60405180910390fd5b600060108054610e3090614a6e565b90501415610e73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6a90614675565b60405180910390fd5b600060118054610e8290614a6e565b90501415610ec5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ebc906146b5565b60405180910390fd5b600060128054610ed490614a6e565b90501415610f17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0e90614635565b60405180910390fd5b6001600f60006101000a81548160ff021916908315150217905550565b610f3c611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610fa9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa090614755565b60405180910390fd5b610fb3828261202c565b5050565b610fe87fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e610fe3611ad4565b611429565b611027576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101e90614435565b60405180910390fd5b61102f61210d565b565b61104c838383604051806020016040528060008152506115e3565b505050565b61106261105c611ad4565b82611b95565b6110a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109890614735565b60405180910390fd5b6110aa816121af565b50565b60006110b761095d565b82106110f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ef906146f5565b60405180910390fd5b600b828154811061110c5761110b614c07565b5b90600052602060002001549050919050565b6000600d60009054906101000a900460ff16905090565b6000806005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156111de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d5906145b5565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611258576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124f90614595565b60405180910390fd5b600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6112d07fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e6112cb611ad4565b611429565b61130f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161130690614435565b60405180910390fd5b6113176122cc565b565b61134a7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e611345611ad4565b611429565b611389576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138090614435565b60405180910390fd5b60001515600f60009054906101000a900460ff161515146113df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d6906145d5565b60405180910390fd5b82601090805190602001906113f592919061350b565b50816011908051906020019061140c92919061350b565b50806012908051906020019061142392919061350b565b50505050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600480546114a290614a6e565b80601f01602080910402602001604051908101604052809291908181526020018280546114ce90614a6e565b801561151b5780601f106114f05761010080835404028352916020019161151b565b820191906000526020600020905b8154815290600101906020018083116114fe57829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1681565b6012805461154590614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461157190614a6e565b80156115be5780601f10611593576101008083540402835291602001916115be565b820191906000526020600020905b8154815290600101906020018083116115a157829003601f168201915b505050505081565b6000801b81565b6115df6115d8611ad4565b838361236f565b5050565b6115f46115ee611ad4565b83611b95565b611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162a906146d5565b60405180910390fd5b61163f848484846124dc565b50505050565b6060600061165283612538565b905060008151116116725760405180602001604052806000815250611693565b80604051602001611683919061425a565b6040516020818303038152906040525b915050919050565b601080546116a890614a6e565b80601f01602080910402602001604051908101604052809291908181526020018280546116d490614a6e565b80156117215780601f106116f657610100808354040283529160200191611721565b820191906000526020600020905b81548152906001019060200180831161170457829003601f168201915b505050505081565b6011805461173690614a6e565b80601f016020809104026020016040519081016040528092919081815260200182805461176290614a6e565b80156117af5780601f10611784576101008083540402835291602001916117af565b820191906000526020600020905b81548152906001019060200180831161179257829003601f168201915b505050505081565b6117e87f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66117e3611ad4565b611429565b611827576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181e90614715565b60405180910390fd5b61183184846125df565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611864826109ca565b61186d81611ee4565b611877838361202c565b505050565b6118ad7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66118a8611ad4565b611429565b6118ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e390614715565b60405180910390fd5b60005b828290508110156119305761191d8484848481811061191157611910614c07565b5b905060200201356125df565b808061192890614ad1565b9150506118ef565b50505050565b7fb19546dff01e856fb3f010c267a7b1c60363cf8a4664e21cc89c26224620214e81565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a615750611a60826127b9565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166005600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816007600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611b4f83611135565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611ba082611a68565b611bdf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bd690614535565b60405180910390fd5b6000611bea83611135565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c2c5750611c2b818561195a565b5b80611c6a57508373ffffffffffffffffffffffffffffffffffffffff16611c52846107c0565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c9382611135565b73ffffffffffffffffffffffffffffffffffffffff1614611ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce090614495565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d50906144d5565b60405180910390fd5b611d6483838361289b565b611d6f600082611adc565b6001600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190614950565b925050819055506001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e16919061486f565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611ed58383836128ab565b505050565b6000612710905090565b611ef581611ef0611ad4565b6128b0565b50565b611f028282611429565b611fd457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611f79611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b7fc41b7cb64e5be01af4afc2641afc861432136270f4206b7773f229b658b96699600e8260405161200a92919061439e565b60405180910390a180600e908051906020019061202892919061350b565b5050565b6120368282611429565b1561210957600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120ae611ad4565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b61211561111e565b612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214b90614415565b60405180910390fd5b6000600d60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612198611ad4565b6040516121a591906142b6565b60405180910390a1565b60006121ba82611135565b90506121c88160008461289b565b6121d3600083611adc565b6001600660008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122239190614950565b925050819055506005600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122c8816000846128ab565b5050565b6122d461111e565b15612314576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161230b90614555565b60405180910390fd5b6001600d60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612358611ad4565b60405161236591906142b6565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156123de576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123d5906144f5565b60405180910390fd5b80600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516124cf9190614346565b60405180910390a3505050565b6124e7848484611c73565b6124f38484848461294d565b612532576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252990614475565b60405180910390fd5b50505050565b606061254382611a68565b612582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257990614655565b60405180910390fd5b600061258c612ae4565b905060008151116125ac57604051806020016040528060008152506125d7565b806125b684612b76565b6040516020016125c7929190614236565b6040516020818303038152906040525b915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561264f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612646906145f5565b60405180910390fd5b61265881611a68565b15612698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268f906144b5565b60405180910390fd5b6126a46000838361289b565b6001600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546126f4919061486f565b92505081905550816005600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127b5600083836128ab565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061288457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612894575061289382612cd7565b5b9050919050565b6128a6838383612d51565b505050565b505050565b6128ba8282611429565b612949576128df8173ffffffffffffffffffffffffffffffffffffffff166014612da9565b6128ed8360001c6020612da9565b6040516020016128fe92919061427c565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612940919061437c565b60405180910390fd5b5050565b600061296e8473ffffffffffffffffffffffffffffffffffffffff16612fe5565b15612ad7578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612997611ad4565b8786866040518563ffffffff1660e01b81526004016129b994939291906142d1565b602060405180830381600087803b1580156129d357600080fd5b505af1925050508015612a0457506040513d601f19601f82011682018060405250810190612a019190613ae9565b60015b612a87573d8060008114612a34576040519150601f19603f3d011682016040523d82523d6000602084013e612a39565b606091505b50600081511415612a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a7690614475565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612adc565b600190505b949350505050565b6060600e8054612af390614a6e565b80601f0160208091040260200160405190810160405280929190818152602001828054612b1f90614a6e565b8015612b6c5780601f10612b4157610100808354040283529160200191612b6c565b820191906000526020600020905b815481529060010190602001808311612b4f57829003601f168201915b5050505050905090565b60606000821415612bbe576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612cd2565b600082905060005b60008214612bf0578080612bd990614ad1565b915050600a82612be991906148c5565b9150612bc6565b60008167ffffffffffffffff811115612c0c57612c0b614c36565b5b6040519080825280601f01601f191660200182016040528015612c3e5781602001600182028036833780820191505090505b5090505b60008514612ccb57600182612c579190614950565b9150600a85612c669190614b1a565b6030612c72919061486f565b60f81b818381518110612c8857612c87614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cc491906148c5565b9450612c42565b8093505050505b919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612d4a5750612d4982613008565b5b9050919050565b612d5c838383613082565b612d6461111e565b15612da4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9b906143f5565b60405180910390fd5b505050565b606060006002836002612dbc91906148f6565b612dc6919061486f565b67ffffffffffffffff811115612ddf57612dde614c36565b5b6040519080825280601f01601f191660200182016040528015612e115781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612e4957612e48614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612ead57612eac614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612eed91906148f6565b612ef7919061486f565b90505b6001811115612f97577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612f3957612f38614c07565b5b1a60f81b828281518110612f5057612f4f614c07565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612f9090614a44565b9050612efa565b5060008414612fdb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd2906143d5565b60405180910390fd5b8091505092915050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061307b575061307a82613196565b5b9050919050565b61308d838383613200565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156130d0576130cb81613205565b61310f565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461310e5761310d838261324e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156131525761314d816133bb565b613191565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146131905761318f828261348c565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161325b846111e7565b6132659190614950565b90506000600a600084815260200190815260200160002054905081811461334a576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b805490506133cf9190614950565b90506000600c60008481526020019081526020016000205490506000600b83815481106133ff576133fe614c07565b5b9060005260206000200154905080600b838154811061342157613420614c07565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b8054806134705761346f614bd8565b5b6001900381819060005260206000200160009055905550505050565b6000613497836111e7565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b82805461351790614a6e565b90600052602060002090601f0160209004810192826135395760008555613580565b82601f1061355257805160ff1916838001178555613580565b82800160010185558215613580579182015b8281111561357f578251825591602001919060010190613564565b5b50905061358d9190613591565b5090565b5b808211156135aa576000816000905550600101613592565b5090565b60006135c16135bc846147b5565b614790565b9050828152602081018484840111156135dd576135dc614c74565b5b6135e8848285614a02565b509392505050565b60006136036135fe846147e6565b614790565b90508281526020810184848401111561361f5761361e614c74565b5b61362a848285614a02565b509392505050565b60008135905061364181615460565b92915050565b60008083601f84011261365d5761365c614c6a565b5b8235905067ffffffffffffffff81111561367a57613679614c65565b5b60208301915083602082028301111561369657613695614c6f565b5b9250929050565b6000813590506136ac81615477565b92915050565b6000813590506136c18161548e565b92915050565b6000813590506136d6816154a5565b92915050565b6000815190506136eb816154a5565b92915050565b600082601f83011261370657613705614c6a565b5b81356137168482602086016135ae565b91505092915050565b60008083601f84011261373557613734614c6a565b5b8235905067ffffffffffffffff81111561375257613751614c65565b5b60208301915083600182028301111561376e5761376d614c6f565b5b9250929050565b600082601f83011261378a57613789614c6a565b5b813561379a8482602086016135f0565b91505092915050565b6000813590506137b2816154bc565b92915050565b6000602082840312156137ce576137cd614c7e565b5b60006137dc84828501613632565b91505092915050565b600080604083850312156137fc576137fb614c7e565b5b600061380a85828601613632565b925050602061381b85828601613632565b9150509250929050565b60008060006060848603121561383e5761383d614c7e565b5b600061384c86828701613632565b935050602061385d86828701613632565b925050604061386e868287016137a3565b9150509250925092565b6000806000806080858703121561389257613891614c7e565b5b60006138a087828801613632565b94505060206138b187828801613632565b93505060406138c2878288016137a3565b925050606085013567ffffffffffffffff8111156138e3576138e2614c79565b5b6138ef878288016136f1565b91505092959194509250565b60008060006040848603121561391457613913614c7e565b5b600061392286828701613632565b935050602084013567ffffffffffffffff81111561394357613942614c79565b5b61394f86828701613647565b92509250509250925092565b6000806040838503121561397257613971614c7e565b5b600061398085828601613632565b92505060206139918582860161369d565b9150509250929050565b600080604083850312156139b2576139b1614c7e565b5b60006139c085828601613632565b92505060206139d1858286016137a3565b9150509250929050565b600080600080606085870312156139f5576139f4614c7e565b5b6000613a0387828801613632565b9450506020613a14878288016137a3565b935050604085013567ffffffffffffffff811115613a3557613a34614c79565b5b613a418782880161371f565b925092505092959194509250565b600060208284031215613a6557613a64614c7e565b5b6000613a73848285016136b2565b91505092915050565b60008060408385031215613a9357613a92614c7e565b5b6000613aa1858286016136b2565b9250506020613ab285828601613632565b9150509250929050565b600060208284031215613ad257613ad1614c7e565b5b6000613ae0848285016136c7565b91505092915050565b600060208284031215613aff57613afe614c7e565b5b6000613b0d848285016136dc565b91505092915050565b60008060208385031215613b2d57613b2c614c7e565b5b600083013567ffffffffffffffff811115613b4b57613b4a614c79565b5b613b578582860161371f565b92509250509250929050565b600080600060608486031215613b7c57613b7b614c7e565b5b600084013567ffffffffffffffff811115613b9a57613b99614c79565b5b613ba686828701613775565b935050602084013567ffffffffffffffff811115613bc757613bc6614c79565b5b613bd386828701613775565b925050604084013567ffffffffffffffff811115613bf457613bf3614c79565b5b613c0086828701613775565b9150509250925092565b600060208284031215613c2057613c1f614c7e565b5b6000613c2e848285016137a3565b91505092915050565b60008060408385031215613c4e57613c4d614c7e565b5b6000613c5c858286016137a3565b9250506020613c6d858286016137a3565b9150509250929050565b613c8081614984565b82525050565b613c8f81614996565b82525050565b613c9e816149a2565b82525050565b6000613caf8261482c565b613cb98185614842565b9350613cc9818560208601614a11565b613cd281614c83565b840191505092915050565b6000613ce882614837565b613cf28185614853565b9350613d02818560208601614a11565b613d0b81614c83565b840191505092915050565b6000613d2182614837565b613d2b8185614864565b9350613d3b818560208601614a11565b80840191505092915050565b60008154613d5481614a6e565b613d5e8186614853565b94506001821660008114613d795760018114613d8b57613dbe565b60ff1983168652602086019350613dbe565b613d9485614817565b60005b83811015613db657815481890152600182019150602081019050613d97565b808801955050505b50505092915050565b6000613dd4602083614853565b9150613ddf82614c94565b602082019050919050565b6000613df7602b83614853565b9150613e0282614cbd565b604082019050919050565b6000613e1a601483614853565b9150613e2582614d0c565b602082019050919050565b6000613e3d602383614853565b9150613e4882614d35565b604082019050919050565b6000613e60602b83614853565b9150613e6b82614d84565b604082019050919050565b6000613e83603283614853565b9150613e8e82614dd3565b604082019050919050565b6000613ea6602583614853565b9150613eb182614e22565b604082019050919050565b6000613ec9601c83614853565b9150613ed482614e71565b602082019050919050565b6000613eec602483614853565b9150613ef782614e9a565b604082019050919050565b6000613f0f601983614853565b9150613f1a82614ee9565b602082019050919050565b6000613f32601b83614853565b9150613f3d82614f12565b602082019050919050565b6000613f55602c83614853565b9150613f6082614f3b565b604082019050919050565b6000613f78601083614853565b9150613f8382614f8a565b602082019050919050565b6000613f9b603883614853565b9150613fa682614fb3565b604082019050919050565b6000613fbe602a83614853565b9150613fc982615002565b604082019050919050565b6000613fe1602983614853565b9150613fec82615051565b604082019050919050565b6000614004601383614853565b915061400f826150a0565b602082019050919050565b6000614027602083614853565b9150614032826150c9565b602082019050919050565b600061404a602c83614853565b9150614055826150f2565b604082019050919050565b600061406d600583614864565b915061407882615141565b600582019050919050565b6000614090601c83614853565b915061409b8261516a565b602082019050919050565b60006140b3602f83614853565b91506140be82615193565b604082019050919050565b60006140d6601083614853565b91506140e1826151e2565b602082019050919050565b60006140f9602183614853565b91506141048261520b565b604082019050919050565b600061411c601683614853565b91506141278261525a565b602082019050919050565b600061413f603183614853565b915061414a82615283565b604082019050919050565b6000614162602c83614853565b915061416d826152d2565b604082019050919050565b6000614185602483614853565b915061419082615321565b604082019050919050565b60006141a8601783614864565b91506141b382615370565b601782019050919050565b60006141cb603083614853565b91506141d682615399565b604082019050919050565b60006141ee601183614864565b91506141f9826153e8565b601182019050919050565b6000614211602f83614853565b915061421c82615411565b604082019050919050565b614230816149f8565b82525050565b60006142428285613d16565b915061424e8284613d16565b91508190509392505050565b60006142668284613d16565b915061427182614060565b915081905092915050565b60006142878261419b565b91506142938285613d16565b915061429e826141e1565b91506142aa8284613d16565b91508190509392505050565b60006020820190506142cb6000830184613c77565b92915050565b60006080820190506142e66000830187613c77565b6142f36020830186613c77565b6143006040830185614227565b81810360608301526143128184613ca4565b905095945050505050565b60006040820190506143326000830185613c77565b61433f6020830184614227565b9392505050565b600060208201905061435b6000830184613c86565b92915050565b60006020820190506143766000830184613c95565b92915050565b600060208201905081810360008301526143968184613cdd565b905092915050565b600060408201905081810360008301526143b88185613d47565b905081810360208301526143cc8184613cdd565b90509392505050565b600060208201905081810360008301526143ee81613dc7565b9050919050565b6000602082019050818103600083015261440e81613dea565b9050919050565b6000602082019050818103600083015261442e81613e0d565b9050919050565b6000602082019050818103600083015261444e81613e30565b9050919050565b6000602082019050818103600083015261446e81613e53565b9050919050565b6000602082019050818103600083015261448e81613e76565b9050919050565b600060208201905081810360008301526144ae81613e99565b9050919050565b600060208201905081810360008301526144ce81613ebc565b9050919050565b600060208201905081810360008301526144ee81613edf565b9050919050565b6000602082019050818103600083015261450e81613f02565b9050919050565b6000602082019050818103600083015261452e81613f25565b9050919050565b6000602082019050818103600083015261454e81613f48565b9050919050565b6000602082019050818103600083015261456e81613f6b565b9050919050565b6000602082019050818103600083015261458e81613f8e565b9050919050565b600060208201905081810360008301526145ae81613fb1565b9050919050565b600060208201905081810360008301526145ce81613fd4565b9050919050565b600060208201905081810360008301526145ee81613ff7565b9050919050565b6000602082019050818103600083015261460e8161401a565b9050919050565b6000602082019050818103600083015261462e8161403d565b9050919050565b6000602082019050818103600083015261464e81614083565b9050919050565b6000602082019050818103600083015261466e816140a6565b9050919050565b6000602082019050818103600083015261468e816140c9565b9050919050565b600060208201905081810360008301526146ae816140ec565b9050919050565b600060208201905081810360008301526146ce8161410f565b9050919050565b600060208201905081810360008301526146ee81614132565b9050919050565b6000602082019050818103600083015261470e81614155565b9050919050565b6000602082019050818103600083015261472e81614178565b9050919050565b6000602082019050818103600083015261474e816141be565b9050919050565b6000602082019050818103600083015261476e81614204565b9050919050565b600060208201905061478a6000830184614227565b92915050565b600061479a6147ab565b90506147a68282614aa0565b919050565b6000604051905090565b600067ffffffffffffffff8211156147d0576147cf614c36565b5b6147d982614c83565b9050602081019050919050565b600067ffffffffffffffff82111561480157614800614c36565b5b61480a82614c83565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061487a826149f8565b9150614885836149f8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156148ba576148b9614b4b565b5b828201905092915050565b60006148d0826149f8565b91506148db836149f8565b9250826148eb576148ea614b7a565b5b828204905092915050565b6000614901826149f8565b915061490c836149f8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561494557614944614b4b565b5b828202905092915050565b600061495b826149f8565b9150614966836149f8565b92508282101561497957614978614b4b565b5b828203905092915050565b600061498f826149d8565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a2f578082015181840152602081019050614a14565b83811115614a3e576000848401525b50505050565b6000614a4f826149f8565b91506000821415614a6357614a62614b4b565b5b600182039050919050565b60006002820490506001821680614a8657607f821691505b60208210811415614a9a57614a99614ba9565b5b50919050565b614aa982614c83565b810181811067ffffffffffffffff82111715614ac857614ac7614c36565b5b80604052505050565b6000614adc826149f8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b0f57614b0e614b4b565b5b600182019050919050565b6000614b25826149f8565b9150614b30836149f8565b925082614b4057614b3f614b7a565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204f574e45525f5260008201527f4f4c450000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f41727420636f646520697320616c7265616479207365616c65642e0000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f41727420636f6465206973207365616c65642e00000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f2061727420636f6465206465736372697074696f6e207365742e00000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4e6f2061727420636f6465207365742e00000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4e6f2061727420636f646520646570732e207365742e00000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616c6c657220646f6573206e6f74206861766520746865204d494e5445525f60008201527f524f4c4500000000000000000000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b61546981614984565b811461547457600080fd5b50565b61548081614996565b811461548b57600080fd5b50565b615497816149a2565b81146154a257600080fd5b50565b6154ae816149ac565b81146154b957600080fd5b50565b6154c5816149f8565b81146154d057600080fd5b5056fea2646970667358221220adb935ddca55177887a256b44ca9a8a0e2713c9c080dca9e0bdbcb033e4dd96b64736f6c63430008060033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000001200000000000000000000000006a37c8a9fba923b6404ba956b2b354bb2428d25500000000000000000000000000000000000000000000000000000000000001f400000000000000000000000000000000000000000000000000000000000000144d616443202d20436f6c6f722052687974686d7300000000000000000000000000000000000000000000000000000000000000000000000000000000000000044d414443000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011697066733a2f2f756e646563696465642f000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _name (string): MadC - Color Rhythms
Arg [1] : _symbol (string): MADC
Arg [2] : _uri (string): ipfs://undecided/
Arg [3] : _royaltyWallet (address): 0x6a37C8a9fBA923b6404ba956B2b354bb2428d255
Arg [4] : _royaltyFee (uint96): 500
-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [3] : 0000000000000000000000006a37c8a9fba923b6404ba956b2b354bb2428d255
Arg [4] : 00000000000000000000000000000000000000000000000000000000000001f4
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [6] : 4d616443202d20436f6c6f722052687974686d73000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 4d41444300000000000000000000000000000000000000000000000000000000
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [10] : 697066733a2f2f756e646563696465642f000000000000000000000000000000
Deployed Bytecode Sourcemap
66004:5874:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71127:236;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35072:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36766:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36289:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50901:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37685:376;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12865:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63247:505;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;13308:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50482:343;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69301:106;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70224:472;;;:::i;:::-;;14438:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69136:68;;;:::i;:::-;;38132:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57046:282;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51091:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58469:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34679:326;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34322:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69008:64;;;:::i;:::-;;69737:377;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;11275:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35241:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66549:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66671:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10304:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37146:187;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38388:365;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;70838:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66583:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66611:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68780:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66441:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13741:190;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68265:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66374:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37404:214;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71127:236;71290:4;71319:36;71343:11;71319:23;:36::i;:::-;71312:43;;71127:236;;;:::o;35072:100::-;35126:13;35159:5;35152:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35072:100;:::o;36766:308::-;36887:7;36934:16;36942:7;36934;:16::i;:::-;36912:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;37042:15;:24;37058:7;37042:24;;;;;;;;;;;;;;;;;;;;;37035:31;;36766:308;;;:::o;36289:411::-;36370:13;36386:23;36401:7;36386:14;:23::i;:::-;36370:39;;36434:5;36428:11;;:2;:11;;;;36420:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;36528:5;36512:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;36537:37;36554:5;36561:12;:10;:12::i;:::-;36537:16;:37::i;:::-;36512:62;36490:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;36671:21;36680:2;36684:7;36671:8;:21::i;:::-;36359:341;36289:411;;:::o;50901:113::-;50962:7;50989:10;:17;;;;50982:24;;50901:113;:::o;37685:376::-;37894:41;37913:12;:10;:12::i;:::-;37927:7;37894:18;:41::i;:::-;37872:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;38025:28;38035:4;38041:2;38045:7;38025:9;:28::i;:::-;37685:376;;;:::o;12865:181::-;12984:7;13016:6;:12;13023:4;13016:12;;;;;;;;;;;:22;;;13009:29;;12865:181;;;:::o;63247:505::-;63389:7;63398;63423:26;63452:17;:27;63470:8;63452:27;;;;;;;;;;;63423:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63524:1;63496:30;;:7;:16;;;:30;;;63492:92;;;63553:19;63543:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63492:92;63596:21;63674:17;:15;:17::i;:::-;63620:71;;63634:7;:23;;;63621:36;;:10;:36;;;;:::i;:::-;63620:71;;;;:::i;:::-;63596:95;;63712:7;:16;;;63730:13;63704:40;;;;;;63247:505;;;;;:::o;13308:188::-;13427:18;13440:4;13427:12;:18::i;:::-;10795:16;10806:4;10795:10;:16::i;:::-;13463:25:::1;13474:4;13480:7;13463:10;:25::i;:::-;13308:188:::0;;;:::o;50482:343::-;50624:7;50679:23;50696:5;50679:16;:23::i;:::-;50671:5;:31;50649:124;;;;;;;;;;;;:::i;:::-;;;;;;;;;50791:12;:19;50804:5;50791:19;;;;;;;;;;;;;;;:26;50811:5;50791:26;;;;;;;;;;;;50784:33;;50482:343;;;;:::o;69301:106::-;67615:33;66411:23;67635:12;:10;:12::i;:::-;67615:7;:33::i;:::-;67593:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;69378:21:::1;69395:3;;69378:21;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:16;:21::i;:::-;69301:106:::0;;:::o;70224:472::-;67615:33;66411:23;67635:12;:10;:12::i;:::-;67615:7;:33::i;:::-;67593:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;70305:5:::1;70286:24;;:15;;;;;;;;;;;:24;;;70278:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;70386:1;70367:7;70361:21;;;;;:::i;:::-;;;:26;;70353:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;70478:1;70447:19;70441:33;;;;;:::i;:::-;;;:38;;70419:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;70598:1;70568:18;70562:32;;;;;:::i;:::-;;;:37;;70540:115;;;;;;;;;;;;:::i;:::-;;;;;;;;;70684:4;70666:15;;:22;;;;;;;;;;;;;;;;;;70224:472::o:0;14438:287::-;14591:12;:10;:12::i;:::-;14580:23;;:7;:23;;;14558:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;14691:26;14703:4;14709:7;14691:11;:26::i;:::-;14438:287;;:::o;69136:68::-;67615:33;66411:23;67635:12;:10;:12::i;:::-;67615:7;:33::i;:::-;67593:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;69186:10:::1;:8;:10::i;:::-;69136:68::o:0;38132:185::-;38270:39;38287:4;38293:2;38297:7;38270:39;;;;;;;;;;;;:16;:39::i;:::-;38132:185;;;:::o;57046:282::-;57178:41;57197:12;:10;:12::i;:::-;57211:7;57178:18;:41::i;:::-;57156:139;;;;;;;;;;;;:::i;:::-;;;;;;;;;57306:14;57312:7;57306:5;:14::i;:::-;57046:282;:::o;51091:320::-;51211:7;51266:30;:28;:30::i;:::-;51258:5;:38;51236:132;;;;;;;;;;;;:::i;:::-;;;;;;;;;51386:10;51397:5;51386:17;;;;;;;;:::i;:::-;;;;;;;;;;51379:24;;51091:320;;;:::o;58469:86::-;58516:4;58540:7;;;;;;;;;;;58533:14;;58469:86;:::o;34679:326::-;34796:7;34821:13;34837:7;:16;34845:7;34837:16;;;;;;;;;;;;;;;;;;;;;34821:32;;34903:1;34886:19;;:5;:19;;;;34864:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;34992:5;34985:12;;;34679:326;;;:::o;34322:295::-;34439:7;34503:1;34486:19;;:5;:19;;;;34464:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;34593:9;:16;34603:5;34593:16;;;;;;;;;;;;;;;;34586:23;;34322:295;;;:::o;69008:64::-;67615:33;66411:23;67635:12;:10;:12::i;:::-;67615:7;:33::i;:::-;67593:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;69056:8:::1;:6;:8::i;:::-;69008:64::o:0;69737:377::-;67615:33;66411:23;67635:12;:10;:12::i;:::-;67615:7;:33::i;:::-;67593:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;69944:5:::1;69925:24;;:15;;;;;;;;;;;:24;;;69917:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;69994:8;69984:7;:18;;;;;;;;;;;;:::i;:::-;;70035:20;70013:19;:42;;;;;;;;;;;;:::i;:::-;;70087:19;70066:18;:40;;;;;;;;;;;;:::i;:::-;;69737:377:::0;;;:::o;11275:197::-;11406:4;11435:6;:12;11442:4;11435:12;;;;;;;;;;;:20;;:29;11456:7;11435:29;;;;;;;;;;;;;;;;;;;;;;;;;11428:36;;11275:197;;;;:::o;35241:104::-;35297:13;35330:7;35323:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35241:104;:::o;66549:27::-;;;;;;;;;;;;;:::o;66671:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;10304:49::-;10349:4;10304:49;;;:::o;37146:187::-;37273:52;37292:12;:10;:12::i;:::-;37306:8;37316;37273:18;:52::i;:::-;37146:187;;:::o;38388:365::-;38577:41;38596:12;:10;:12::i;:::-;38610:7;38577:18;:41::i;:::-;38555:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;38706:39;38720:4;38726:2;38730:7;38739:5;38706:13;:39::i;:::-;38388:365;;;;:::o;70838:281::-;70939:13;70970:17;70990:23;71005:7;70990:14;:23::i;:::-;70970:43;;71064:1;71050:3;71044:17;:21;:67;;;;;;;;;;;;;;;;;71092:3;71075:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;71044:67;71024:87;;;70838:281;;;:::o;66583:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66611:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;68780:166::-;67934:34;66479:24;67955:12;:10;:12::i;:::-;67934:7;:34::i;:::-;67912:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;68913:25:::1;68919:9;68930:7;68913:5;:25::i;:::-;68780:166:::0;;;;:::o;66441:62::-;66479:24;66441:62;:::o;13741:190::-;13861:18;13874:4;13861:12;:18::i;:::-;10795:16;10806:4;10795:10;:16::i;:::-;13897:26:::1;13909:4;13915:7;13897:11;:26::i;:::-;13741:190:::0;;;:::o;68265:226::-;67934:34;66479:24;67955:12;:10;:12::i;:::-;67934:7;:34::i;:::-;67912:120;;;;;;;;;;;;:::i;:::-;;;;;;;;;68387:9:::1;68382:102;68406:8;;:15;;68402:1;:19;68382:102;;;68443:29;68449:9;68460:8;;68469:1;68460:11;;;;;;;:::i;:::-;;;;;;;;68443:5;:29::i;:::-;68423:3;;;;;:::i;:::-;;;;68382:102;;;;68265:226:::0;;;:::o;66374:60::-;66411:23;66374:60;:::o;37404:214::-;37546:4;37575:18;:25;37594:5;37575:25;;;;;;;;;;;;;;;:35;37601:8;37575:35;;;;;;;;;;;;;;;;;;;;;;;;;37568:42;;37404:214;;;;:::o;50098:300::-;50245:4;50302:35;50287:50;;;:11;:50;;;;:103;;;;50354:36;50378:11;50354:23;:36::i;:::-;50287:103;50267:123;;50098:300;;;:::o;40300:127::-;40365:4;40417:1;40389:30;;:7;:16;40397:7;40389:16;;;;;;;;;;;;;;;;;;;;;:30;;;;40382:37;;40300:127;;;:::o;3954:98::-;4007:7;4034:10;4027:17;;3954:98;:::o;44587:174::-;44689:2;44662:15;:24;44678:7;44662:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44745:7;44741:2;44707:46;;44716:23;44731:7;44716:14;:23::i;:::-;44707:46;;;;;;;;;;;;44587:174;;:::o;40594:452::-;40723:4;40767:16;40775:7;40767;:16::i;:::-;40745:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40866:13;40882:23;40897:7;40882:14;:23::i;:::-;40866:39;;40935:5;40924:16;;:7;:16;;;:65;;;;40957:32;40974:5;40981:7;40957:16;:32::i;:::-;40924:65;:113;;;;41030:7;41006:31;;:20;41018:7;41006:11;:20::i;:::-;:31;;;40924:113;40916:122;;;40594:452;;;;:::o;43807:662::-;43980:4;43953:31;;:23;43968:7;43953:14;:23::i;:::-;:31;;;43931:118;;;;;;;;;;;;:::i;:::-;;;;;;;;;44082:1;44068:16;;:2;:16;;;;44060:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;44138:39;44159:4;44165:2;44169:7;44138:20;:39::i;:::-;44242:29;44259:1;44263:7;44242:8;:29::i;:::-;44303:1;44284:9;:15;44294:4;44284:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;44332:1;44315:9;:13;44325:2;44315:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;44363:2;44344:7;:16;44352:7;44344:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44402:7;44398:2;44383:27;;44392:4;44383:27;;;;;;;;;;;;44423:38;44443:4;44449:2;44453:7;44423:19;:38::i;:::-;43807:662;;;:::o;64034:97::-;64092:6;64118:5;64111:12;;64034:97;:::o;11776:105::-;11843:30;11854:4;11860:12;:10;:12::i;:::-;11843:10;:30::i;:::-;11776:105;:::o;16008:238::-;16092:22;16100:4;16106:7;16092;:22::i;:::-;16087:152;;16163:4;16131:6;:12;16138:4;16131:12;;;;;;;;;;;:20;;:29;16152:7;16131:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;16214:12;:10;:12::i;:::-;16187:40;;16205:7;16187:40;;16199:4;16187:40;;;;;;;;;;16087:152;16008:238;;:::o;71610:151::-;71683:37;71698:13;71713:6;71683:37;;;;;;;:::i;:::-;;;;;;;;71747:6;71731:13;:22;;;;;;;;;;;;:::i;:::-;;71610:151;:::o;16378:239::-;16462:22;16470:4;16476:7;16462;:22::i;:::-;16458:152;;;16533:5;16501:6;:12;16508:4;16501:12;;;;;;;;;;;:20;;:29;16522:7;16501:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;16585:12;:10;:12::i;:::-;16558:40;;16576:7;16558:40;;16570:4;16558:40;;;;;;;;;;16458:152;16378:239;;:::o;59528:120::-;59072:8;:6;:8::i;:::-;59064:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;59597:5:::1;59587:7;;:15;;;;;;;;;;;;;;;;;;59618:22;59627:12;:10;:12::i;:::-;59618:22;;;;;;:::i;:::-;;;;;;;;59528:120::o:0;43050:420::-;43110:13;43126:23;43141:7;43126:14;:23::i;:::-;43110:39;;43162:48;43183:5;43198:1;43202:7;43162:20;:48::i;:::-;43251:29;43268:1;43272:7;43251:8;:29::i;:::-;43313:1;43293:9;:16;43303:5;43293:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;43332:7;:16;43340:7;43332:16;;;;;;;;;;;;43325:23;;;;;;;;;;;43394:7;43390:1;43366:36;;43375:5;43366:36;;;;;;;;;;;;43415:47;43435:5;43450:1;43454:7;43415:19;:47::i;:::-;43099:371;43050:420;:::o;59269:118::-;58795:8;:6;:8::i;:::-;58794:9;58786:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;59339:4:::1;59329:7;;:14;;;;;;;;;;;;;;;;;;59359:20;59366:12;:10;:12::i;:::-;59359:20;;;;;;:::i;:::-;;;;;;;;59269:118::o:0;44903:315::-;45058:8;45049:17;;:5;:17;;;;45041:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;45145:8;45107:18;:25;45126:5;45107:25;;;;;;;;;;;;;;;:35;45133:8;45107:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;45191:8;45169:41;;45184:5;45169:41;;;45201:8;45169:41;;;;;;:::i;:::-;;;;;;;;44903:315;;;:::o;39635:352::-;39792:28;39802:4;39808:2;39812:7;39792:9;:28::i;:::-;39853:48;39876:4;39882:2;39886:7;39895:5;39853:22;:48::i;:::-;39831:148;;;;;;;;;;;;:::i;:::-;;;;;;;;;39635:352;;;;:::o;35416:468::-;35534:13;35587:16;35595:7;35587;:16::i;:::-;35565:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;35691:21;35715:10;:8;:10::i;:::-;35691:34;;35780:1;35762:7;35756:21;:25;:120;;;;;;;;;;;;;;;;;35825:7;35834:18;:7;:16;:18::i;:::-;35808:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35756:120;35736:140;;;35416:468;;;:::o;42382:439::-;42476:1;42462:16;;:2;:16;;;;42454:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;42535:16;42543:7;42535;:16::i;:::-;42534:17;42526:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;42597:45;42626:1;42630:2;42634:7;42597:20;:45::i;:::-;42672:1;42655:9;:13;42665:2;42655:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;42703:2;42684:7;:16;42692:7;42684:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;42748:7;42744:2;42723:33;;42740:1;42723:33;;;;;;;;;;;;42769:44;42797:1;42801:2;42805:7;42769:19;:44::i;:::-;42382:439;;:::o;33903:355::-;34050:4;34107:25;34092:40;;;:11;:40;;;;:105;;;;34164:33;34149:48;;;:11;:48;;;;34092:105;:158;;;;34214:36;34238:11;34214:23;:36::i;:::-;34092:158;34072:178;;33903:355;;;:::o;71371:231::-;71549:45;71576:4;71582:2;71586:7;71549:26;:45::i;:::-;71371:231;;;:::o;47846:125::-;;;;:::o;12171:505::-;12260:22;12268:4;12274:7;12260;:22::i;:::-;12255:414;;12448:41;12476:7;12448:41;;12486:2;12448:19;:41::i;:::-;12562:38;12590:4;12582:13;;12597:2;12562:19;:38::i;:::-;12353:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;12299:358;;;;;;;;;;;:::i;:::-;;;;;;;;12255:414;12171:505;;:::o;45783:980::-;45938:4;45959:15;:2;:13;;;:15::i;:::-;45955:801;;;46028:2;46012:36;;;46071:12;:10;:12::i;:::-;46106:4;46133:7;46163:5;46012:175;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45991:710;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46387:1;46370:6;:13;:18;46366:320;;;46413:108;;;;;;;;;;:::i;:::-;;;;;;;;46366:320;46636:6;46630:13;46621:6;46617:2;46613:15;46606:38;45991:710;46261:41;;;46251:51;;;:6;:51;;;;46244:58;;;;;45955:801;46740:4;46733:11;;45783:980;;;;;;;:::o;71769:106::-;71821:13;71854;71847:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71769:106;:::o;4537:723::-;4593:13;4823:1;4814:5;:10;4810:53;;;4841:10;;;;;;;;;;;;;;;;;;;;;4810:53;4873:12;4888:5;4873:20;;4904:14;4929:78;4944:1;4936:4;:9;4929:78;;4962:8;;;;;:::i;:::-;;;;4993:2;4985:10;;;;;:::i;:::-;;;4929:78;;;5017:19;5049:6;5039:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5017:39;;5067:154;5083:1;5074:5;:10;5067:154;;5111:1;5101:11;;;;;:::i;:::-;;;5178:2;5170:5;:10;;;;:::i;:::-;5157:2;:24;;;;:::i;:::-;5144:39;;5127:6;5134;5127:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;5207:2;5198:11;;;;;:::i;:::-;;;5067:154;;;5245:6;5231:21;;;;;4537:723;;;;:::o;62901:291::-;63048:4;63105:26;63090:41;;;:11;:41;;;;:94;;;;63148:36;63172:11;63148:23;:36::i;:::-;63090:94;63070:114;;62901:291;;;:::o;60333:275::-;60477:45;60504:4;60510:2;60514:7;60477:26;:45::i;:::-;60544:8;:6;:8::i;:::-;60543:9;60535:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;60333:275;;;:::o;5838:483::-;5940:13;5971:19;6016:1;6007:6;6003:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;5993:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5971:47;;6029:15;:6;6036:1;6029:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6055;:6;6062:1;6055:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;6086:9;6111:1;6102:6;6098:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;6086:26;;6081:135;6118:1;6114;:5;6081:135;;;6153:12;6174:3;6166:5;:11;6153:25;;;;;;;:::i;:::-;;;;;6141:6;6148:1;6141:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;6203:1;6193:11;;;;;6121:3;;;;:::i;:::-;;;6081:135;;;;6243:1;6234:5;:10;6226:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;6306:6;6292:21;;;5838:483;;;;:::o;24769:326::-;24829:4;25086:1;25064:7;:19;;;:23;25057:30;;24769:326;;;:::o;10903:280::-;11033:4;11090:32;11075:47;;;:11;:47;;;;:100;;;;11139:36;11163:11;11139:23;:36::i;:::-;11075:100;11055:120;;10903:280;;;:::o;52024:589::-;52168:45;52195:4;52201:2;52205:7;52168:26;:45::i;:::-;52246:1;52230:18;;:4;:18;;;52226:187;;;52265:40;52297:7;52265:31;:40::i;:::-;52226:187;;;52335:2;52327:10;;:4;:10;;;52323:90;;52354:47;52387:4;52393:7;52354:32;:47::i;:::-;52323:90;52226:187;52441:1;52427:16;;:2;:16;;;52423:183;;;52460:45;52497:7;52460:36;:45::i;:::-;52423:183;;;52533:4;52527:10;;:2;:10;;;52523:83;;52554:40;52582:2;52586:7;52554:27;:40::i;:::-;52523:83;52423:183;52024:589;;;:::o;8116:207::-;8246:4;8290:25;8275:40;;;:11;:40;;;;8268:47;;8116:207;;;:::o;47335:126::-;;;;:::o;53336:164::-;53440:10;:17;;;;53413:15;:24;53429:7;53413:24;;;;;;;;;;;:44;;;;53468:10;53484:7;53468:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53336:164;:::o;54127:1002::-;54407:22;54457:1;54432:22;54449:4;54432:16;:22::i;:::-;:26;;;;:::i;:::-;54407:51;;54469:18;54490:17;:26;54508:7;54490:26;;;;;;;;;;;;54469:47;;54637:14;54623:10;:28;54619:328;;54668:19;54690:12;:18;54703:4;54690:18;;;;;;;;;;;;;;;:34;54709:14;54690:34;;;;;;;;;;;;54668:56;;54774:11;54741:12;:18;54754:4;54741:18;;;;;;;;;;;;;;;:30;54760:10;54741:30;;;;;;;;;;;:44;;;;54891:10;54858:17;:30;54876:11;54858:30;;;;;;;;;;;:43;;;;54653:294;54619:328;55043:17;:26;55061:7;55043:26;;;;;;;;;;;55036:33;;;55087:12;:18;55100:4;55087:18;;;;;;;;;;;;;;;:34;55106:14;55087:34;;;;;;;;;;;55080:41;;;54222:907;;54127:1002;;:::o;55424:1079::-;55677:22;55722:1;55702:10;:17;;;;:21;;;;:::i;:::-;55677:46;;55734:18;55755:15;:24;55771:7;55755:24;;;;;;;;;;;;55734:45;;56106:19;56128:10;56139:14;56128:26;;;;;;;;:::i;:::-;;;;;;;;;;56106:48;;56192:11;56167:10;56178;56167:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;56303:10;56272:15;:28;56288:11;56272:28;;;;;;;;;;;:41;;;;56444:15;:24;56460:7;56444:24;;;;;;;;;;;56437:31;;;56479:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;55495:1008;;;55424:1079;:::o;52914:221::-;52999:14;53016:20;53033:2;53016:16;:20::i;:::-;52999:37;;53074:7;53047:12;:16;53060:2;53047:16;;;;;;;;;;;;;;;:24;53064:6;53047:24;;;;;;;;;;;:34;;;;53121:6;53092:17;:26;53110:7;53092:26;;;;;;;;;;;:35;;;;52988:147;52914:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;280:79;;:::i;:::-;249:2;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:2;;;698:79;;:::i;:::-;667:2;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;893:87;;;;:::o;1003:568::-;1076:8;1086:6;1136:3;1129:4;1121:6;1117:17;1113:27;1103:2;;1144:79;;:::i;:::-;1103:2;1257:6;1244:20;1234:30;;1287:18;1279:6;1276:30;1273:2;;;1309:79;;:::i;:::-;1273:2;1423:4;1415:6;1411:17;1399:29;;1477:3;1469:4;1461:6;1457:17;1447:8;1443:32;1440:41;1437:2;;;1484:79;;:::i;:::-;1437:2;1093:478;;;;;:::o;1577:133::-;1620:5;1658:6;1645:20;1636:29;;1674:30;1698:5;1674:30;:::i;:::-;1626:84;;;;:::o;1716:139::-;1762:5;1800:6;1787:20;1778:29;;1816:33;1843:5;1816:33;:::i;:::-;1768:87;;;;:::o;1861:137::-;1906:5;1944:6;1931:20;1922:29;;1960:32;1986:5;1960:32;:::i;:::-;1912:86;;;;:::o;2004:141::-;2060:5;2091:6;2085:13;2076:22;;2107:32;2133:5;2107:32;:::i;:::-;2066:79;;;;:::o;2164:338::-;2219:5;2268:3;2261:4;2253:6;2249:17;2245:27;2235:2;;2276:79;;:::i;:::-;2235:2;2393:6;2380:20;2418:78;2492:3;2484:6;2477:4;2469:6;2465:17;2418:78;:::i;:::-;2409:87;;2225:277;;;;;:::o;2522:553::-;2580:8;2590:6;2640:3;2633:4;2625:6;2621:17;2617:27;2607:2;;2648:79;;:::i;:::-;2607:2;2761:6;2748:20;2738:30;;2791:18;2783:6;2780:30;2777:2;;;2813:79;;:::i;:::-;2777:2;2927:4;2919:6;2915:17;2903:29;;2981:3;2973:4;2965:6;2961:17;2951:8;2947:32;2944:41;2941:2;;;2988:79;;:::i;:::-;2941:2;2597:478;;;;;:::o;3095:340::-;3151:5;3200:3;3193:4;3185:6;3181:17;3177:27;3167:2;;3208:79;;:::i;:::-;3167:2;3325:6;3312:20;3350:79;3425:3;3417:6;3410:4;3402:6;3398:17;3350:79;:::i;:::-;3341:88;;3157:278;;;;;:::o;3441:139::-;3487:5;3525:6;3512:20;3503:29;;3541:33;3568:5;3541:33;:::i;:::-;3493:87;;;;:::o;3586:329::-;3645:6;3694:2;3682:9;3673:7;3669:23;3665:32;3662:2;;;3700:79;;:::i;:::-;3662:2;3820:1;3845:53;3890:7;3881:6;3870:9;3866:22;3845:53;:::i;:::-;3835:63;;3791:117;3652:263;;;;:::o;3921:474::-;3989:6;3997;4046:2;4034:9;4025:7;4021:23;4017:32;4014:2;;;4052:79;;:::i;:::-;4014:2;4172:1;4197:53;4242:7;4233:6;4222:9;4218:22;4197:53;:::i;:::-;4187:63;;4143:117;4299:2;4325:53;4370:7;4361:6;4350:9;4346:22;4325:53;:::i;:::-;4315:63;;4270:118;4004:391;;;;;:::o;4401:619::-;4478:6;4486;4494;4543:2;4531:9;4522:7;4518:23;4514:32;4511:2;;;4549:79;;:::i;:::-;4511:2;4669:1;4694:53;4739:7;4730:6;4719:9;4715:22;4694:53;:::i;:::-;4684:63;;4640:117;4796:2;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4767:118;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;4501:519;;;;;:::o;5026:943::-;5121:6;5129;5137;5145;5194:3;5182:9;5173:7;5169:23;5165:33;5162:2;;;5201:79;;:::i;:::-;5162:2;5321:1;5346:53;5391:7;5382:6;5371:9;5367:22;5346:53;:::i;:::-;5336:63;;5292:117;5448:2;5474:53;5519:7;5510:6;5499:9;5495:22;5474:53;:::i;:::-;5464:63;;5419:118;5576:2;5602:53;5647:7;5638:6;5627:9;5623:22;5602:53;:::i;:::-;5592:63;;5547:118;5732:2;5721:9;5717:18;5704:32;5763:18;5755:6;5752:30;5749:2;;;5785:79;;:::i;:::-;5749:2;5890:62;5944:7;5935:6;5924:9;5920:22;5890:62;:::i;:::-;5880:72;;5675:287;5152:817;;;;;;;:::o;5975:704::-;6070:6;6078;6086;6135:2;6123:9;6114:7;6110:23;6106:32;6103:2;;;6141:79;;:::i;:::-;6103:2;6261:1;6286:53;6331:7;6322:6;6311:9;6307:22;6286:53;:::i;:::-;6276:63;;6232:117;6416:2;6405:9;6401:18;6388:32;6447:18;6439:6;6436:30;6433:2;;;6469:79;;:::i;:::-;6433:2;6582:80;6654:7;6645:6;6634:9;6630:22;6582:80;:::i;:::-;6564:98;;;;6359:313;6093:586;;;;;:::o;6685:468::-;6750:6;6758;6807:2;6795:9;6786:7;6782:23;6778:32;6775:2;;;6813:79;;:::i;:::-;6775:2;6933:1;6958:53;7003:7;6994:6;6983:9;6979:22;6958:53;:::i;:::-;6948:63;;6904:117;7060:2;7086:50;7128:7;7119:6;7108:9;7104:22;7086:50;:::i;:::-;7076:60;;7031:115;6765:388;;;;;:::o;7159:474::-;7227:6;7235;7284:2;7272:9;7263:7;7259:23;7255:32;7252:2;;;7290:79;;:::i;:::-;7252:2;7410:1;7435:53;7480:7;7471:6;7460:9;7456:22;7435:53;:::i;:::-;7425:63;;7381:117;7537:2;7563:53;7608:7;7599:6;7588:9;7584:22;7563:53;:::i;:::-;7553:63;;7508:118;7242:391;;;;;:::o;7639:819::-;7728:6;7736;7744;7752;7801:2;7789:9;7780:7;7776:23;7772:32;7769:2;;;7807:79;;:::i;:::-;7769:2;7927:1;7952:53;7997:7;7988:6;7977:9;7973:22;7952:53;:::i;:::-;7942:63;;7898:117;8054:2;8080:53;8125:7;8116:6;8105:9;8101:22;8080:53;:::i;:::-;8070:63;;8025:118;8210:2;8199:9;8195:18;8182:32;8241:18;8233:6;8230:30;8227:2;;;8263:79;;:::i;:::-;8227:2;8376:65;8433:7;8424:6;8413:9;8409:22;8376:65;:::i;:::-;8358:83;;;;8153:298;7759:699;;;;;;;:::o;8464:329::-;8523:6;8572:2;8560:9;8551:7;8547:23;8543:32;8540:2;;;8578:79;;:::i;:::-;8540:2;8698:1;8723:53;8768:7;8759:6;8748:9;8744:22;8723:53;:::i;:::-;8713:63;;8669:117;8530:263;;;;:::o;8799:474::-;8867:6;8875;8924:2;8912:9;8903:7;8899:23;8895:32;8892:2;;;8930:79;;:::i;:::-;8892:2;9050:1;9075:53;9120:7;9111:6;9100:9;9096:22;9075:53;:::i;:::-;9065:63;;9021:117;9177:2;9203:53;9248:7;9239:6;9228:9;9224:22;9203:53;:::i;:::-;9193:63;;9148:118;8882:391;;;;;:::o;9279:327::-;9337:6;9386:2;9374:9;9365:7;9361:23;9357:32;9354:2;;;9392:79;;:::i;:::-;9354:2;9512:1;9537:52;9581:7;9572:6;9561:9;9557:22;9537:52;:::i;:::-;9527:62;;9483:116;9344:262;;;;:::o;9612:349::-;9681:6;9730:2;9718:9;9709:7;9705:23;9701:32;9698:2;;;9736:79;;:::i;:::-;9698:2;9856:1;9881:63;9936:7;9927:6;9916:9;9912:22;9881:63;:::i;:::-;9871:73;;9827:127;9688:273;;;;:::o;9967:529::-;10038:6;10046;10095:2;10083:9;10074:7;10070:23;10066:32;10063:2;;;10101:79;;:::i;:::-;10063:2;10249:1;10238:9;10234:17;10221:31;10279:18;10271:6;10268:30;10265:2;;;10301:79;;:::i;:::-;10265:2;10414:65;10471:7;10462:6;10451:9;10447:22;10414:65;:::i;:::-;10396:83;;;;10192:297;10053:443;;;;;:::o;10502:1159::-;10609:6;10617;10625;10674:2;10662:9;10653:7;10649:23;10645:32;10642:2;;;10680:79;;:::i;:::-;10642:2;10828:1;10817:9;10813:17;10800:31;10858:18;10850:6;10847:30;10844:2;;;10880:79;;:::i;:::-;10844:2;10985:63;11040:7;11031:6;11020:9;11016:22;10985:63;:::i;:::-;10975:73;;10771:287;11125:2;11114:9;11110:18;11097:32;11156:18;11148:6;11145:30;11142:2;;;11178:79;;:::i;:::-;11142:2;11283:63;11338:7;11329:6;11318:9;11314:22;11283:63;:::i;:::-;11273:73;;11068:288;11423:2;11412:9;11408:18;11395:32;11454:18;11446:6;11443:30;11440:2;;;11476:79;;:::i;:::-;11440:2;11581:63;11636:7;11627:6;11616:9;11612:22;11581:63;:::i;:::-;11571:73;;11366:288;10632:1029;;;;;:::o;11667:329::-;11726:6;11775:2;11763:9;11754:7;11750:23;11746:32;11743:2;;;11781:79;;:::i;:::-;11743:2;11901:1;11926:53;11971:7;11962:6;11951:9;11947:22;11926:53;:::i;:::-;11916:63;;11872:117;11733:263;;;;:::o;12002:474::-;12070:6;12078;12127:2;12115:9;12106:7;12102:23;12098:32;12095:2;;;12133:79;;:::i;:::-;12095:2;12253:1;12278:53;12323:7;12314:6;12303:9;12299:22;12278:53;:::i;:::-;12268:63;;12224:117;12380:2;12406:53;12451:7;12442:6;12431:9;12427:22;12406:53;:::i;:::-;12396:63;;12351:118;12085:391;;;;;:::o;12482:118::-;12569:24;12587:5;12569:24;:::i;:::-;12564:3;12557:37;12547:53;;:::o;12606:109::-;12687:21;12702:5;12687:21;:::i;:::-;12682:3;12675:34;12665:50;;:::o;12721:118::-;12808:24;12826:5;12808:24;:::i;:::-;12803:3;12796:37;12786:53;;:::o;12845:360::-;12931:3;12959:38;12991:5;12959:38;:::i;:::-;13013:70;13076:6;13071:3;13013:70;:::i;:::-;13006:77;;13092:52;13137:6;13132:3;13125:4;13118:5;13114:16;13092:52;:::i;:::-;13169:29;13191:6;13169:29;:::i;:::-;13164:3;13160:39;13153:46;;12935:270;;;;;:::o;13211:364::-;13299:3;13327:39;13360:5;13327:39;:::i;:::-;13382:71;13446:6;13441:3;13382:71;:::i;:::-;13375:78;;13462:52;13507:6;13502:3;13495:4;13488:5;13484:16;13462:52;:::i;:::-;13539:29;13561:6;13539:29;:::i;:::-;13534:3;13530:39;13523:46;;13303:272;;;;;:::o;13581:377::-;13687:3;13715:39;13748:5;13715:39;:::i;:::-;13770:89;13852:6;13847:3;13770:89;:::i;:::-;13763:96;;13868:52;13913:6;13908:3;13901:4;13894:5;13890:16;13868:52;:::i;:::-;13945:6;13940:3;13936:16;13929:23;;13691:267;;;;;:::o;13988:802::-;14073:3;14110:5;14104:12;14139:36;14165:9;14139:36;:::i;:::-;14191:71;14255:6;14250:3;14191:71;:::i;:::-;14184:78;;14293:1;14282:9;14278:17;14309:1;14304:135;;;;14453:1;14448:336;;;;14271:513;;14304:135;14388:4;14384:9;14373;14369:25;14364:3;14357:38;14424:4;14419:3;14415:14;14408:21;;14304:135;;14448:336;14515:38;14547:5;14515:38;:::i;:::-;14575:1;14589:154;14603:6;14600:1;14597:13;14589:154;;;14677:7;14671:14;14667:1;14662:3;14658:11;14651:35;14727:1;14718:7;14714:15;14703:26;;14625:4;14622:1;14618:12;14613:17;;14589:154;;;14772:1;14767:3;14763:11;14756:18;;14455:329;;14271:513;;14077:713;;;;;;:::o;14796:366::-;14938:3;14959:67;15023:2;15018:3;14959:67;:::i;:::-;14952:74;;15035:93;15124:3;15035:93;:::i;:::-;15153:2;15148:3;15144:12;15137:19;;14942:220;;;:::o;15168:366::-;15310:3;15331:67;15395:2;15390:3;15331:67;:::i;:::-;15324:74;;15407:93;15496:3;15407:93;:::i;:::-;15525:2;15520:3;15516:12;15509:19;;15314:220;;;:::o;15540:366::-;15682:3;15703:67;15767:2;15762:3;15703:67;:::i;:::-;15696:74;;15779:93;15868:3;15779:93;:::i;:::-;15897:2;15892:3;15888:12;15881:19;;15686:220;;;:::o;15912:366::-;16054:3;16075:67;16139:2;16134:3;16075:67;:::i;:::-;16068:74;;16151:93;16240:3;16151:93;:::i;:::-;16269:2;16264:3;16260:12;16253:19;;16058:220;;;:::o;16284:366::-;16426:3;16447:67;16511:2;16506:3;16447:67;:::i;:::-;16440:74;;16523:93;16612:3;16523:93;:::i;:::-;16641:2;16636:3;16632:12;16625:19;;16430:220;;;:::o;16656:366::-;16798:3;16819:67;16883:2;16878:3;16819:67;:::i;:::-;16812:74;;16895:93;16984:3;16895:93;:::i;:::-;17013:2;17008:3;17004:12;16997:19;;16802:220;;;:::o;17028:366::-;17170:3;17191:67;17255:2;17250:3;17191:67;:::i;:::-;17184:74;;17267:93;17356:3;17267:93;:::i;:::-;17385:2;17380:3;17376:12;17369:19;;17174:220;;;:::o;17400:366::-;17542:3;17563:67;17627:2;17622:3;17563:67;:::i;:::-;17556:74;;17639:93;17728:3;17639:93;:::i;:::-;17757:2;17752:3;17748:12;17741:19;;17546:220;;;:::o;17772:366::-;17914:3;17935:67;17999:2;17994:3;17935:67;:::i;:::-;17928:74;;18011:93;18100:3;18011:93;:::i;:::-;18129:2;18124:3;18120:12;18113:19;;17918:220;;;:::o;18144:366::-;18286:3;18307:67;18371:2;18366:3;18307:67;:::i;:::-;18300:74;;18383:93;18472:3;18383:93;:::i;:::-;18501:2;18496:3;18492:12;18485:19;;18290:220;;;:::o;18516:366::-;18658:3;18679:67;18743:2;18738:3;18679:67;:::i;:::-;18672:74;;18755:93;18844:3;18755:93;:::i;:::-;18873:2;18868:3;18864:12;18857:19;;18662:220;;;:::o;18888:366::-;19030:3;19051:67;19115:2;19110:3;19051:67;:::i;:::-;19044:74;;19127:93;19216:3;19127:93;:::i;:::-;19245:2;19240:3;19236:12;19229:19;;19034:220;;;:::o;19260:366::-;19402:3;19423:67;19487:2;19482:3;19423:67;:::i;:::-;19416:74;;19499:93;19588:3;19499:93;:::i;:::-;19617:2;19612:3;19608:12;19601:19;;19406:220;;;:::o;19632:366::-;19774:3;19795:67;19859:2;19854:3;19795:67;:::i;:::-;19788:74;;19871:93;19960:3;19871:93;:::i;:::-;19989:2;19984:3;19980:12;19973:19;;19778:220;;;:::o;20004:366::-;20146:3;20167:67;20231:2;20226:3;20167:67;:::i;:::-;20160:74;;20243:93;20332:3;20243:93;:::i;:::-;20361:2;20356:3;20352:12;20345:19;;20150:220;;;:::o;20376:366::-;20518:3;20539:67;20603:2;20598:3;20539:67;:::i;:::-;20532:74;;20615:93;20704:3;20615:93;:::i;:::-;20733:2;20728:3;20724:12;20717:19;;20522:220;;;:::o;20748:366::-;20890:3;20911:67;20975:2;20970:3;20911:67;:::i;:::-;20904:74;;20987:93;21076:3;20987:93;:::i;:::-;21105:2;21100:3;21096:12;21089:19;;20894:220;;;:::o;21120:366::-;21262:3;21283:67;21347:2;21342:3;21283:67;:::i;:::-;21276:74;;21359:93;21448:3;21359:93;:::i;:::-;21477:2;21472:3;21468:12;21461:19;;21266:220;;;:::o;21492:366::-;21634:3;21655:67;21719:2;21714:3;21655:67;:::i;:::-;21648:74;;21731:93;21820:3;21731:93;:::i;:::-;21849:2;21844:3;21840:12;21833:19;;21638:220;;;:::o;21864:400::-;22024:3;22045:84;22127:1;22122:3;22045:84;:::i;:::-;22038:91;;22138:93;22227:3;22138:93;:::i;:::-;22256:1;22251:3;22247:11;22240:18;;22028:236;;;:::o;22270:366::-;22412:3;22433:67;22497:2;22492:3;22433:67;:::i;:::-;22426:74;;22509:93;22598:3;22509:93;:::i;:::-;22627:2;22622:3;22618:12;22611:19;;22416:220;;;:::o;22642:366::-;22784:3;22805:67;22869:2;22864:3;22805:67;:::i;:::-;22798:74;;22881:93;22970:3;22881:93;:::i;:::-;22999:2;22994:3;22990:12;22983:19;;22788:220;;;:::o;23014:366::-;23156:3;23177:67;23241:2;23236:3;23177:67;:::i;:::-;23170:74;;23253:93;23342:3;23253:93;:::i;:::-;23371:2;23366:3;23362:12;23355:19;;23160:220;;;:::o;23386:366::-;23528:3;23549:67;23613:2;23608:3;23549:67;:::i;:::-;23542:74;;23625:93;23714:3;23625:93;:::i;:::-;23743:2;23738:3;23734:12;23727:19;;23532:220;;;:::o;23758:366::-;23900:3;23921:67;23985:2;23980:3;23921:67;:::i;:::-;23914:74;;23997:93;24086:3;23997:93;:::i;:::-;24115:2;24110:3;24106:12;24099:19;;23904:220;;;:::o;24130:366::-;24272:3;24293:67;24357:2;24352:3;24293:67;:::i;:::-;24286:74;;24369:93;24458:3;24369:93;:::i;:::-;24487:2;24482:3;24478:12;24471:19;;24276:220;;;:::o;24502:366::-;24644:3;24665:67;24729:2;24724:3;24665:67;:::i;:::-;24658:74;;24741:93;24830:3;24741:93;:::i;:::-;24859:2;24854:3;24850:12;24843:19;;24648:220;;;:::o;24874:366::-;25016:3;25037:67;25101:2;25096:3;25037:67;:::i;:::-;25030:74;;25113:93;25202:3;25113:93;:::i;:::-;25231:2;25226:3;25222:12;25215:19;;25020:220;;;:::o;25246:402::-;25406:3;25427:85;25509:2;25504:3;25427:85;:::i;:::-;25420:92;;25521:93;25610:3;25521:93;:::i;:::-;25639:2;25634:3;25630:12;25623:19;;25410:238;;;:::o;25654:366::-;25796:3;25817:67;25881:2;25876:3;25817:67;:::i;:::-;25810:74;;25893:93;25982:3;25893:93;:::i;:::-;26011:2;26006:3;26002:12;25995:19;;25800:220;;;:::o;26026:402::-;26186:3;26207:85;26289:2;26284:3;26207:85;:::i;:::-;26200:92;;26301:93;26390:3;26301:93;:::i;:::-;26419:2;26414:3;26410:12;26403:19;;26190:238;;;:::o;26434:366::-;26576:3;26597:67;26661:2;26656:3;26597:67;:::i;:::-;26590:74;;26673:93;26762:3;26673:93;:::i;:::-;26791:2;26786:3;26782:12;26775:19;;26580:220;;;:::o;26806:118::-;26893:24;26911:5;26893:24;:::i;:::-;26888:3;26881:37;26871:53;;:::o;26930:435::-;27110:3;27132:95;27223:3;27214:6;27132:95;:::i;:::-;27125:102;;27244:95;27335:3;27326:6;27244:95;:::i;:::-;27237:102;;27356:3;27349:10;;27114:251;;;;;:::o;27371:541::-;27604:3;27626:95;27717:3;27708:6;27626:95;:::i;:::-;27619:102;;27738:148;27882:3;27738:148;:::i;:::-;27731:155;;27903:3;27896:10;;27608:304;;;;:::o;27918:967::-;28300:3;28322:148;28466:3;28322:148;:::i;:::-;28315:155;;28487:95;28578:3;28569:6;28487:95;:::i;:::-;28480:102;;28599:148;28743:3;28599:148;:::i;:::-;28592:155;;28764:95;28855:3;28846:6;28764:95;:::i;:::-;28757:102;;28876:3;28869:10;;28304:581;;;;;:::o;28891:222::-;28984:4;29022:2;29011:9;29007:18;28999:26;;29035:71;29103:1;29092:9;29088:17;29079:6;29035:71;:::i;:::-;28989:124;;;;:::o;29119:640::-;29314:4;29352:3;29341:9;29337:19;29329:27;;29366:71;29434:1;29423:9;29419:17;29410:6;29366:71;:::i;:::-;29447:72;29515:2;29504:9;29500:18;29491:6;29447:72;:::i;:::-;29529;29597:2;29586:9;29582:18;29573:6;29529:72;:::i;:::-;29648:9;29642:4;29638:20;29633:2;29622:9;29618:18;29611:48;29676:76;29747:4;29738:6;29676:76;:::i;:::-;29668:84;;29319:440;;;;;;;:::o;29765:332::-;29886:4;29924:2;29913:9;29909:18;29901:26;;29937:71;30005:1;29994:9;29990:17;29981:6;29937:71;:::i;:::-;30018:72;30086:2;30075:9;30071:18;30062:6;30018:72;:::i;:::-;29891:206;;;;;:::o;30103:210::-;30190:4;30228:2;30217:9;30213:18;30205:26;;30241:65;30303:1;30292:9;30288:17;30279:6;30241:65;:::i;:::-;30195:118;;;;:::o;30319:222::-;30412:4;30450:2;30439:9;30435:18;30427:26;;30463:71;30531:1;30520:9;30516:17;30507:6;30463:71;:::i;:::-;30417:124;;;;:::o;30547:313::-;30660:4;30698:2;30687:9;30683:18;30675:26;;30747:9;30741:4;30737:20;30733:1;30722:9;30718:17;30711:47;30775:78;30848:4;30839:6;30775:78;:::i;:::-;30767:86;;30665:195;;;;:::o;30866:508::-;31024:4;31062:2;31051:9;31047:18;31039:26;;31111:9;31105:4;31101:20;31097:1;31086:9;31082:17;31075:47;31139:75;31209:4;31200:6;31139:75;:::i;:::-;31131:83;;31261:9;31255:4;31251:20;31246:2;31235:9;31231:18;31224:48;31289:78;31362:4;31353:6;31289:78;:::i;:::-;31281:86;;31029:345;;;;;:::o;31380:419::-;31546:4;31584:2;31573:9;31569:18;31561:26;;31633:9;31627:4;31623:20;31619:1;31608:9;31604:17;31597:47;31661:131;31787:4;31661:131;:::i;:::-;31653:139;;31551:248;;;:::o;31805:419::-;31971:4;32009:2;31998:9;31994:18;31986:26;;32058:9;32052:4;32048:20;32044:1;32033:9;32029:17;32022:47;32086:131;32212:4;32086:131;:::i;:::-;32078:139;;31976:248;;;:::o;32230:419::-;32396:4;32434:2;32423:9;32419:18;32411:26;;32483:9;32477:4;32473:20;32469:1;32458:9;32454:17;32447:47;32511:131;32637:4;32511:131;:::i;:::-;32503:139;;32401:248;;;:::o;32655:419::-;32821:4;32859:2;32848:9;32844:18;32836:26;;32908:9;32902:4;32898:20;32894:1;32883:9;32879:17;32872:47;32936:131;33062:4;32936:131;:::i;:::-;32928:139;;32826:248;;;:::o;33080:419::-;33246:4;33284:2;33273:9;33269:18;33261:26;;33333:9;33327:4;33323:20;33319:1;33308:9;33304:17;33297:47;33361:131;33487:4;33361:131;:::i;:::-;33353:139;;33251:248;;;:::o;33505:419::-;33671:4;33709:2;33698:9;33694:18;33686:26;;33758:9;33752:4;33748:20;33744:1;33733:9;33729:17;33722:47;33786:131;33912:4;33786:131;:::i;:::-;33778:139;;33676:248;;;:::o;33930:419::-;34096:4;34134:2;34123:9;34119:18;34111:26;;34183:9;34177:4;34173:20;34169:1;34158:9;34154:17;34147:47;34211:131;34337:4;34211:131;:::i;:::-;34203:139;;34101:248;;;:::o;34355:419::-;34521:4;34559:2;34548:9;34544:18;34536:26;;34608:9;34602:4;34598:20;34594:1;34583:9;34579:17;34572:47;34636:131;34762:4;34636:131;:::i;:::-;34628:139;;34526:248;;;:::o;34780:419::-;34946:4;34984:2;34973:9;34969:18;34961:26;;35033:9;35027:4;35023:20;35019:1;35008:9;35004:17;34997:47;35061:131;35187:4;35061:131;:::i;:::-;35053:139;;34951:248;;;:::o;35205:419::-;35371:4;35409:2;35398:9;35394:18;35386:26;;35458:9;35452:4;35448:20;35444:1;35433:9;35429:17;35422:47;35486:131;35612:4;35486:131;:::i;:::-;35478:139;;35376:248;;;:::o;35630:419::-;35796:4;35834:2;35823:9;35819:18;35811:26;;35883:9;35877:4;35873:20;35869:1;35858:9;35854:17;35847:47;35911:131;36037:4;35911:131;:::i;:::-;35903:139;;35801:248;;;:::o;36055:419::-;36221:4;36259:2;36248:9;36244:18;36236:26;;36308:9;36302:4;36298:20;36294:1;36283:9;36279:17;36272:47;36336:131;36462:4;36336:131;:::i;:::-;36328:139;;36226:248;;;:::o;36480:419::-;36646:4;36684:2;36673:9;36669:18;36661:26;;36733:9;36727:4;36723:20;36719:1;36708:9;36704:17;36697:47;36761:131;36887:4;36761:131;:::i;:::-;36753:139;;36651:248;;;:::o;36905:419::-;37071:4;37109:2;37098:9;37094:18;37086:26;;37158:9;37152:4;37148:20;37144:1;37133:9;37129:17;37122:47;37186:131;37312:4;37186:131;:::i;:::-;37178:139;;37076:248;;;:::o;37330:419::-;37496:4;37534:2;37523:9;37519:18;37511:26;;37583:9;37577:4;37573:20;37569:1;37558:9;37554:17;37547:47;37611:131;37737:4;37611:131;:::i;:::-;37603:139;;37501:248;;;:::o;37755:419::-;37921:4;37959:2;37948:9;37944:18;37936:26;;38008:9;38002:4;37998:20;37994:1;37983:9;37979:17;37972:47;38036:131;38162:4;38036:131;:::i;:::-;38028:139;;37926:248;;;:::o;38180:419::-;38346:4;38384:2;38373:9;38369:18;38361:26;;38433:9;38427:4;38423:20;38419:1;38408:9;38404:17;38397:47;38461:131;38587:4;38461:131;:::i;:::-;38453:139;;38351:248;;;:::o;38605:419::-;38771:4;38809:2;38798:9;38794:18;38786:26;;38858:9;38852:4;38848:20;38844:1;38833:9;38829:17;38822:47;38886:131;39012:4;38886:131;:::i;:::-;38878:139;;38776:248;;;:::o;39030:419::-;39196:4;39234:2;39223:9;39219:18;39211:26;;39283:9;39277:4;39273:20;39269:1;39258:9;39254:17;39247:47;39311:131;39437:4;39311:131;:::i;:::-;39303:139;;39201:248;;;:::o;39455:419::-;39621:4;39659:2;39648:9;39644:18;39636:26;;39708:9;39702:4;39698:20;39694:1;39683:9;39679:17;39672:47;39736:131;39862:4;39736:131;:::i;:::-;39728:139;;39626:248;;;:::o;39880:419::-;40046:4;40084:2;40073:9;40069:18;40061:26;;40133:9;40127:4;40123:20;40119:1;40108:9;40104:17;40097:47;40161:131;40287:4;40161:131;:::i;:::-;40153:139;;40051:248;;;:::o;40305:419::-;40471:4;40509:2;40498:9;40494:18;40486:26;;40558:9;40552:4;40548:20;40544:1;40533:9;40529:17;40522:47;40586:131;40712:4;40586:131;:::i;:::-;40578:139;;40476:248;;;:::o;40730:419::-;40896:4;40934:2;40923:9;40919:18;40911:26;;40983:9;40977:4;40973:20;40969:1;40958:9;40954:17;40947:47;41011:131;41137:4;41011:131;:::i;:::-;41003:139;;40901:248;;;:::o;41155:419::-;41321:4;41359:2;41348:9;41344:18;41336:26;;41408:9;41402:4;41398:20;41394:1;41383:9;41379:17;41372:47;41436:131;41562:4;41436:131;:::i;:::-;41428:139;;41326:248;;;:::o;41580:419::-;41746:4;41784:2;41773:9;41769:18;41761:26;;41833:9;41827:4;41823:20;41819:1;41808:9;41804:17;41797:47;41861:131;41987:4;41861:131;:::i;:::-;41853:139;;41751:248;;;:::o;42005:419::-;42171:4;42209:2;42198:9;42194:18;42186:26;;42258:9;42252:4;42248:20;42244:1;42233:9;42229:17;42222:47;42286:131;42412:4;42286:131;:::i;:::-;42278:139;;42176:248;;;:::o;42430:419::-;42596:4;42634:2;42623:9;42619:18;42611:26;;42683:9;42677:4;42673:20;42669:1;42658:9;42654:17;42647:47;42711:131;42837:4;42711:131;:::i;:::-;42703:139;;42601:248;;;:::o;42855:419::-;43021:4;43059:2;43048:9;43044:18;43036:26;;43108:9;43102:4;43098:20;43094:1;43083:9;43079:17;43072:47;43136:131;43262:4;43136:131;:::i;:::-;43128:139;;43026:248;;;:::o;43280:419::-;43446:4;43484:2;43473:9;43469:18;43461:26;;43533:9;43527:4;43523:20;43519:1;43508:9;43504:17;43497:47;43561:131;43687:4;43561:131;:::i;:::-;43553:139;;43451:248;;;:::o;43705:222::-;43798:4;43836:2;43825:9;43821:18;43813:26;;43849:71;43917:1;43906:9;43902:17;43893:6;43849:71;:::i;:::-;43803:124;;;;:::o;43933:129::-;43967:6;43994:20;;:::i;:::-;43984:30;;44023:33;44051:4;44043:6;44023:33;:::i;:::-;43974:88;;;:::o;44068:75::-;44101:6;44134:2;44128:9;44118:19;;44108:35;:::o;44149:307::-;44210:4;44300:18;44292:6;44289:30;44286:2;;;44322:18;;:::i;:::-;44286:2;44360:29;44382:6;44360:29;:::i;:::-;44352:37;;44444:4;44438;44434:15;44426:23;;44215:241;;;:::o;44462:308::-;44524:4;44614:18;44606:6;44603:30;44600:2;;;44636:18;;:::i;:::-;44600:2;44674:29;44696:6;44674:29;:::i;:::-;44666:37;;44758:4;44752;44748:15;44740:23;;44529:241;;;:::o;44776:141::-;44825:4;44848:3;44840:11;;44871:3;44868:1;44861:14;44905:4;44902:1;44892:18;44884:26;;44830:87;;;:::o;44923:98::-;44974:6;45008:5;45002:12;44992:22;;44981:40;;;:::o;45027:99::-;45079:6;45113:5;45107:12;45097:22;;45086:40;;;:::o;45132:168::-;45215:11;45249:6;45244:3;45237:19;45289:4;45284:3;45280:14;45265:29;;45227:73;;;;:::o;45306:169::-;45390:11;45424:6;45419:3;45412:19;45464:4;45459:3;45455:14;45440:29;;45402:73;;;;:::o;45481:148::-;45583:11;45620:3;45605:18;;45595:34;;;;:::o;45635:305::-;45675:3;45694:20;45712:1;45694:20;:::i;:::-;45689:25;;45728:20;45746:1;45728:20;:::i;:::-;45723:25;;45882:1;45814:66;45810:74;45807:1;45804:81;45801:2;;;45888:18;;:::i;:::-;45801:2;45932:1;45929;45925:9;45918:16;;45679:261;;;;:::o;45946:185::-;45986:1;46003:20;46021:1;46003:20;:::i;:::-;45998:25;;46037:20;46055:1;46037:20;:::i;:::-;46032:25;;46076:1;46066:2;;46081:18;;:::i;:::-;46066:2;46123:1;46120;46116:9;46111:14;;45988:143;;;;:::o;46137:348::-;46177:7;46200:20;46218:1;46200:20;:::i;:::-;46195:25;;46234:20;46252:1;46234:20;:::i;:::-;46229:25;;46422:1;46354:66;46350:74;46347:1;46344:81;46339:1;46332:9;46325:17;46321:105;46318:2;;;46429:18;;:::i;:::-;46318:2;46477:1;46474;46470:9;46459:20;;46185:300;;;;:::o;46491:191::-;46531:4;46551:20;46569:1;46551:20;:::i;:::-;46546:25;;46585:20;46603:1;46585:20;:::i;:::-;46580:25;;46624:1;46621;46618:8;46615:2;;;46629:18;;:::i;:::-;46615:2;46674:1;46671;46667:9;46659:17;;46536:146;;;;:::o;46688:96::-;46725:7;46754:24;46772:5;46754:24;:::i;:::-;46743:35;;46733:51;;;:::o;46790:90::-;46824:7;46867:5;46860:13;46853:21;46842:32;;46832:48;;;:::o;46886:77::-;46923:7;46952:5;46941:16;;46931:32;;;:::o;46969:149::-;47005:7;47045:66;47038:5;47034:78;47023:89;;47013:105;;;:::o;47124:126::-;47161:7;47201:42;47194:5;47190:54;47179:65;;47169:81;;;:::o;47256:77::-;47293:7;47322:5;47311:16;;47301:32;;;:::o;47339:154::-;47423:6;47418:3;47413;47400:30;47485:1;47476:6;47471:3;47467:16;47460:27;47390:103;;;:::o;47499:307::-;47567:1;47577:113;47591:6;47588:1;47585:13;47577:113;;;47676:1;47671:3;47667:11;47661:18;47657:1;47652:3;47648:11;47641:39;47613:2;47610:1;47606:10;47601:15;;47577:113;;;47708:6;47705:1;47702:13;47699:2;;;47788:1;47779:6;47774:3;47770:16;47763:27;47699:2;47548:258;;;;:::o;47812:171::-;47851:3;47874:24;47892:5;47874:24;:::i;:::-;47865:33;;47920:4;47913:5;47910:15;47907:2;;;47928:18;;:::i;:::-;47907:2;47975:1;47968:5;47964:13;47957:20;;47855:128;;;:::o;47989:320::-;48033:6;48070:1;48064:4;48060:12;48050:22;;48117:1;48111:4;48107:12;48138:18;48128:2;;48194:4;48186:6;48182:17;48172:27;;48128:2;48256;48248:6;48245:14;48225:18;48222:38;48219:2;;;48275:18;;:::i;:::-;48219:2;48040:269;;;;:::o;48315:281::-;48398:27;48420:4;48398:27;:::i;:::-;48390:6;48386:40;48528:6;48516:10;48513:22;48492:18;48480:10;48477:34;48474:62;48471:2;;;48539:18;;:::i;:::-;48471:2;48579:10;48575:2;48568:22;48358:238;;;:::o;48602:233::-;48641:3;48664:24;48682:5;48664:24;:::i;:::-;48655:33;;48710:66;48703:5;48700:77;48697:2;;;48780:18;;:::i;:::-;48697:2;48827:1;48820:5;48816:13;48809:20;;48645:190;;;:::o;48841:176::-;48873:1;48890:20;48908:1;48890:20;:::i;:::-;48885:25;;48924:20;48942:1;48924:20;:::i;:::-;48919:25;;48963:1;48953:2;;48968:18;;:::i;:::-;48953:2;49009:1;49006;49002:9;48997:14;;48875:142;;;;:::o;49023:180::-;49071:77;49068:1;49061:88;49168:4;49165:1;49158:15;49192:4;49189:1;49182:15;49209:180;49257:77;49254:1;49247:88;49354:4;49351:1;49344:15;49378:4;49375:1;49368:15;49395:180;49443:77;49440:1;49433:88;49540:4;49537:1;49530:15;49564:4;49561:1;49554:15;49581:180;49629:77;49626:1;49619:88;49726:4;49723:1;49716:15;49750:4;49747:1;49740:15;49767:180;49815:77;49812:1;49805:88;49912:4;49909:1;49902:15;49936:4;49933:1;49926:15;49953:180;50001:77;49998:1;49991:88;50098:4;50095:1;50088:15;50122:4;50119:1;50112:15;50139:117;50248:1;50245;50238:12;50262:117;50371:1;50368;50361:12;50385:117;50494:1;50491;50484:12;50508:117;50617:1;50614;50607:12;50631:117;50740:1;50737;50730:12;50754:117;50863:1;50860;50853:12;50877:102;50918:6;50969:2;50965:7;50960:2;50953:5;50949:14;50945:28;50935:38;;50925:54;;;:::o;50985:182::-;51125:34;51121:1;51113:6;51109:14;51102:58;51091:76;:::o;51173:230::-;51313:34;51309:1;51301:6;51297:14;51290:58;51382:13;51377:2;51369:6;51365:15;51358:38;51279:124;:::o;51409:170::-;51549:22;51545:1;51537:6;51533:14;51526:46;51515:64;:::o;51585:222::-;51725:34;51721:1;51713:6;51709:14;51702:58;51794:5;51789:2;51781:6;51777:15;51770:30;51691:116;:::o;51813:230::-;51953:34;51949:1;51941:6;51937:14;51930:58;52022:13;52017:2;52009:6;52005:15;51998:38;51919:124;:::o;52049:237::-;52189:34;52185:1;52177:6;52173:14;52166:58;52258:20;52253:2;52245:6;52241:15;52234:45;52155:131;:::o;52292:224::-;52432:34;52428:1;52420:6;52416:14;52409:58;52501:7;52496:2;52488:6;52484:15;52477:32;52398:118;:::o;52522:178::-;52662:30;52658:1;52650:6;52646:14;52639:54;52628:72;:::o;52706:223::-;52846:34;52842:1;52834:6;52830:14;52823:58;52915:6;52910:2;52902:6;52898:15;52891:31;52812:117;:::o;52935:175::-;53075:27;53071:1;53063:6;53059:14;53052:51;53041:69;:::o;53116:177::-;53256:29;53252:1;53244:6;53240:14;53233:53;53222:71;:::o;53299:231::-;53439:34;53435:1;53427:6;53423:14;53416:58;53508:14;53503:2;53495:6;53491:15;53484:39;53405:125;:::o;53536:166::-;53676:18;53672:1;53664:6;53660:14;53653:42;53642:60;:::o;53708:243::-;53848:34;53844:1;53836:6;53832:14;53825:58;53917:26;53912:2;53904:6;53900:15;53893:51;53814:137;:::o;53957:229::-;54097:34;54093:1;54085:6;54081:14;54074:58;54166:12;54161:2;54153:6;54149:15;54142:37;54063:123;:::o;54192:228::-;54332:34;54328:1;54320:6;54316:14;54309:58;54401:11;54396:2;54388:6;54384:15;54377:36;54298:122;:::o;54426:169::-;54566:21;54562:1;54554:6;54550:14;54543:45;54532:63;:::o;54601:182::-;54741:34;54737:1;54729:6;54725:14;54718:58;54707:76;:::o;54789:231::-;54929:34;54925:1;54917:6;54913:14;54906:58;54998:14;54993:2;54985:6;54981:15;54974:39;54895:125;:::o;55026:155::-;55166:7;55162:1;55154:6;55150:14;55143:31;55132:49;:::o;55187:178::-;55327:30;55323:1;55315:6;55311:14;55304:54;55293:72;:::o;55371:234::-;55511:34;55507:1;55499:6;55495:14;55488:58;55580:17;55575:2;55567:6;55563:15;55556:42;55477:128;:::o;55611:166::-;55751:18;55747:1;55739:6;55735:14;55728:42;55717:60;:::o;55783:220::-;55923:34;55919:1;55911:6;55907:14;55900:58;55992:3;55987:2;55979:6;55975:15;55968:28;55889:114;:::o;56009:172::-;56149:24;56145:1;56137:6;56133:14;56126:48;56115:66;:::o;56187:236::-;56327:34;56323:1;56315:6;56311:14;56304:58;56396:19;56391:2;56383:6;56379:15;56372:44;56293:130;:::o;56429:231::-;56569:34;56565:1;56557:6;56553:14;56546:58;56638:14;56633:2;56625:6;56621:15;56614:39;56535:125;:::o;56666:223::-;56806:34;56802:1;56794:6;56790:14;56783:58;56875:6;56870:2;56862:6;56858:15;56851:31;56772:117;:::o;56895:173::-;57035:25;57031:1;57023:6;57019:14;57012:49;57001:67;:::o;57074:235::-;57214:34;57210:1;57202:6;57198:14;57191:58;57283:18;57278:2;57270:6;57266:15;57259:43;57180:129;:::o;57315:167::-;57455:19;57451:1;57443:6;57439:14;57432:43;57421:61;:::o;57488:234::-;57628:34;57624:1;57616:6;57612:14;57605:58;57697:17;57692:2;57684:6;57680:15;57673:42;57594:128;:::o;57728:122::-;57801:24;57819:5;57801:24;:::i;:::-;57794:5;57791:35;57781:2;;57840:1;57837;57830:12;57781:2;57771:79;:::o;57856:116::-;57926:21;57941:5;57926:21;:::i;:::-;57919:5;57916:32;57906:2;;57962:1;57959;57952:12;57906:2;57896:76;:::o;57978:122::-;58051:24;58069:5;58051:24;:::i;:::-;58044:5;58041:35;58031:2;;58090:1;58087;58080:12;58031:2;58021:79;:::o;58106:120::-;58178:23;58195:5;58178:23;:::i;:::-;58171:5;58168:34;58158:2;;58216:1;58213;58206:12;58158:2;58148:78;:::o;58232:122::-;58305:24;58323:5;58305:24;:::i;:::-;58298:5;58295:35;58285:2;;58344:1;58341;58334:12;58285:2;58275:79;:::o
Swarm Source
ipfs://adb935ddca55177887a256b44ca9a8a0e2713c9c080dca9e0bdbcb033e4dd96b
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.