Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
25 UFIM
Holders
19
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 UFIMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
UncirculatedFakeInternetMoney
Compiler Version
v0.8.11+commit.d7f03943
Contract Source Code (Solidity Multiple files format)
// SPDX-License-Identifier: MIT import "./Dependencies.sol"; pragma solidity ^0.8.11; interface ITokenURI { function tokenURI(uint256 tokenId) external view returns (string memory); } contract UncirculatedFakeInternetMoney is ERC721, Ownable { ITokenURI public tokenURIContract; address public mintingAddress; address private royaltyBenificiary; uint16 private royaltyBasisPoints = 1000; uint16 private immutable maxTokens = 25; event ProjectEvent(address indexed poster, string indexed eventType, string content); event TokenEvent(address indexed poster, uint256 indexed tokenId, string indexed eventType, string content); constructor() ERC721('UncirculatedFakeInternetMoney', 'UFIM') { mintingAddress = msg.sender; royaltyBenificiary = msg.sender; } modifier onlyMinter() { require(mintingAddress == _msgSender(), 'Caller is not the minting address'); _; } function totalSupply() external pure returns (uint256) { return maxTokens; } function exists(uint256 tokenId) external view returns (bool) { return _exists(tokenId); } function mint(address to, uint256 tokenId) external onlyMinter { require(tokenId < maxTokens, 'Invalid tokenId'); _mint(to, tokenId); } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return tokenURIContract.tokenURI(tokenId); } function emitTokenEvent(uint256 tokenId, string calldata eventType, string calldata content) external { require( owner() == _msgSender() || ERC721.ownerOf(tokenId) == _msgSender(), 'Only project or token owner can emit token event' ); emit TokenEvent(_msgSender(), tokenId, eventType, content); } function emitProjectEvent(string calldata eventType, string calldata content) external onlyOwner { emit ProjectEvent(_msgSender(), eventType, content); } function setMintingAddress(address minter) external onlyOwner { mintingAddress = minter; } function setTokenURIContract(address _tokenURIAddress) external onlyOwner { tokenURIContract = ITokenURI(_tokenURIAddress); } function setRoyaltyInfo( address _royaltyBenificiary, uint16 _royaltyBasisPoints ) external onlyOwner { royaltyBenificiary = _royaltyBenificiary; royaltyBasisPoints = _royaltyBasisPoints; } // Royalty Info function royaltyInfo(uint256, uint256 _salePrice) external view returns (address, uint256) { return (royaltyBenificiary, _salePrice * royaltyBasisPoints / 10000); } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721) returns (bool) { // 0x2a55205a == ERC2981 interface id return interfaceId == 0x2a55205a || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: MIT 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); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @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); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } // /** // * @dev Replacement for Solidity's `transfer`: sends `amount` wei to // * `recipient`, forwarding all available gas and reverting on errors. // * // * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost // * of certain opcodes, possibly making contracts go over the 2300 gas limit // * imposed by `transfer`, making them unable to receive funds via // * `transfer`. {sendValue} removes this limitation. // * // * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. // * // * IMPORTANT: because control is transferred to `recipient`, care must be // * taken to not create reentrancy vulnerabilities. Consider using // * {ReentrancyGuard} or the // * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. // */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (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); } } } } /** * @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; } } /** * @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); } // Don't need these /** * @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); } } /// [MIT License] /// @title Base64 /// @notice Provides a function for encoding some bytes in base64 /// @author Brecht Devos <[email protected]> // library Base64 { // bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; // /// @notice Encodes some bytes to the base64 representation // function encode(bytes memory data) internal pure returns (string memory) { // uint256 len = data.length; // if (len == 0) return ""; // // multiply by 4/3 rounded up // uint256 encodedLen = 4 * ((len + 2) / 3); // // Add some extra buffer at the end // bytes memory result = new bytes(encodedLen + 32); // bytes memory table = TABLE; // assembly { // let tablePtr := add(table, 1) // let resultPtr := add(result, 32) // for { // let i := 0 // } lt(i, len) { // } { // i := add(i, 3) // let input := and(mload(add(data, i)), 0xffffff) // let out := mload(add(tablePtr, and(shr(18, input), 0x3F))) // out := shl(8, out) // out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)) // out := shl(8, out) // out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)) // out := shl(8, out) // out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)) // out := shl(224, out) // mstore(resultPtr, out) // resultPtr := add(resultPtr, 4) // } // switch mod(len, 3) // case 1 { // mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) // } // case 2 { // mstore(sub(resultPtr, 1), shl(248, 0x3d)) // } // mstore(result, encodedLen) // } // return string(result); // } // } /** * @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; } } /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _setOwner(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _setOwner(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _setOwner(newOwner); } function _setOwner(address newOwner) private { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } /** * @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 overriden 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 { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _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 || getApproved(tokenId) == spender || isApprovedForAll(owner, 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); } /** * @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); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); 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); } /** * @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 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(to).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 {} }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"ProjectEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"poster","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"string","name":"eventType","type":"string"},{"indexed":false,"internalType":"string","name":"content","type":"string"}],"name":"TokenEvent","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"eventType","type":"string"},{"internalType":"string","name":"content","type":"string"}],"name":"emitProjectEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"eventType","type":"string"},{"internalType":"string","name":"content","type":"string"}],"name":"emitTokenEvent","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","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":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"minter","type":"address"}],"name":"setMintingAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_royaltyBenificiary","type":"address"},{"internalType":"uint16","name":"_royaltyBasisPoints","type":"uint16"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_tokenURIAddress","type":"address"}],"name":"setTokenURIContract","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenURIContract","outputs":[{"internalType":"contract ITokenURI","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a06040526103e8600960146101000a81548161ffff021916908361ffff160217905550601961ffff1660809061ffff168152503480156200004057600080fd5b506040518060400160405280601d81526020017f556e63697263756c6174656446616b65496e7465726e65744d6f6e65790000008152506040518060400160405280600481526020017f5546494d000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000c592919062000257565b508060019080519060200190620000de92919062000257565b50505062000101620000f56200018960201b60201c565b6200019160201b60201c565b33600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555033600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200036c565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002659062000336565b90600052602060002090601f016020900481019282620002895760008555620002d5565b82601f10620002a457805160ff1916838001178555620002d5565b82800160010185558215620002d5579182015b82811115620002d4578251825591602001919060010190620002b7565b5b509050620002e49190620002e8565b5090565b5b8082111562000303576000816000905550600101620002e9565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200034f57607f821691505b6020821081141562000366576200036562000307565b5b50919050565b60805161363f6200038f600039600081816107b201526109f1015261363f6000f3fe608060405234801561001057600080fd5b50600436106101a95760003560e01c8063698f87be116100f9578063a22cb46511610097578063d4434ab011610071578063d4434ab0146104b7578063e985e9c5146104d3578063f2fde38b14610503578063fd4307c31461051f576101a9565b8063a22cb4651461044f578063b88d4fde1461046b578063c87b56dd14610487576101a9565b806372504a24116100d357806372504a24146103db57806382fc3147146103f75780638da5cb5b1461041357806395d89b4114610431576101a9565b8063698f87be1461038357806370a08231146103a1578063715018a6146103d1576101a9565b80632a55205a1161016657806342842e0e1161014057806342842e0e146102eb5780634f558e791461030757806352a6c8c9146103375780636352211e14610353576101a9565b80632a55205a1461028257806332d434e9146102b357806340c10f19146102cf576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c3919061201e565b61053d565b6040516101d59190612066565b60405180910390f35b6101e661057f565b6040516101f3919061211a565b60405180910390f35b61021660048036038101906102119190612172565b610611565b60405161022391906121e0565b60405180910390f35b61024660048036038101906102419190612227565b610696565b005b6102506107ae565b60405161025d9190612276565b60405180910390f35b610280600480360381019061027b9190612291565b6107da565b005b61029c600480360381019061029791906122e4565b61083a565b6040516102aa929190612324565b60405180910390f35b6102cd60048036038101906102c8919061234d565b610898565b005b6102e960048036038101906102e49190612227565b610958565b005b61030560048036038101906103009190612291565b610a63565b005b610321600480360381019061031c9190612172565b610a83565b60405161032e9190612066565b60405180910390f35b610351600480360381019061034c91906123df565b610a95565b005b61036d60048036038101906103689190612172565b610bcd565b60405161037a91906121e0565b60405180910390f35b61038b610c7f565b60405161039891906124d3565b60405180910390f35b6103bb60048036038101906103b6919061234d565b610ca5565b6040516103c89190612276565b60405180910390f35b6103d9610d5d565b005b6103f560048036038101906103f09190612528565b610de5565b005b610411600480360381019061040c919061234d565b610ec3565b005b61041b610f83565b60405161042891906121e0565b60405180910390f35b610439610fad565b604051610446919061211a565b60405180910390f35b61046960048036038101906104649190612594565b61103f565b005b61048560048036038101906104809190612704565b6111c0565b005b6104a1600480360381019061049c9190612172565b611222565b6040516104ae919061211a565b60405180910390f35b6104d160048036038101906104cc9190612787565b6112cc565b005b6104ed60048036038101906104e89190612808565b6113bd565b6040516104fa9190612066565b60405180910390f35b61051d6004803603810190610518919061234d565b611451565b005b610527611549565b60405161053491906121e0565b60405180910390f35b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061057857506105778261156f565b5b9050919050565b60606000805461058e90612877565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba90612877565b80156106075780601f106105dc57610100808354040283529160200191610607565b820191906000526020600020905b8154815290600101906020018083116105ea57829003601f168201915b5050505050905090565b600061061c82611651565b61065b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106529061291b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106a182610bcd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610709906129ad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107316116bd565b73ffffffffffffffffffffffffffffffffffffffff161480610760575061075f8161075a6116bd565b6113bd565b5b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690612a3f565b60405180910390fd5b6107a983836116c5565b505050565b60007f000000000000000000000000000000000000000000000000000000000000000061ffff16905090565b6107eb6107e56116bd565b8261177e565b61082a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082190612ad1565b60405180910390fd5b61083583838361185c565b505050565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600960149054906101000a900461ffff1661ffff16856108839190612b20565b61088d9190612ba9565b915091509250929050565b6108a06116bd565b73ffffffffffffffffffffffffffffffffffffffff166108be610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90612c26565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109606116bd565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e690612cb8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000061ffff168110610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90612d24565b60405180910390fd5b610a5f8282611ab8565b5050565b610a7e838383604051806020016040528060008152506111c0565b505050565b6000610a8e82611651565b9050919050565b610a9d6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610abb610f83565b73ffffffffffffffffffffffffffffffffffffffff161480610b175750610ae06116bd565b73ffffffffffffffffffffffffffffffffffffffff16610aff86610bcd565b73ffffffffffffffffffffffffffffffffffffffff16145b610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90612db6565b60405180910390fd5b8383604051610b66929190612e06565b604051809103902085610b776116bd565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610bbe929190612e4c565b60405180910390a45050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d90612ee2565b60405180910390fd5b80915050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90612f74565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d656116bd565b73ffffffffffffffffffffffffffffffffffffffff16610d83610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090612c26565b60405180910390fd5b610de36000611c86565b565b610ded6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610e0b610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890612c26565b60405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960146101000a81548161ffff021916908361ffff1602179055505050565b610ecb6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610ee9610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690612c26565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fbc90612877565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe890612877565b80156110355780601f1061100a57610100808354040283529160200191611035565b820191906000526020600020905b81548152906001019060200180831161101857829003601f168201915b5050505050905090565b6110476116bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90612fe0565b60405180910390fd5b80600560006110c26116bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661116f6116bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111b49190612066565b60405180910390a35050565b6111d16111cb6116bd565b8361177e565b611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790612ad1565b60405180910390fd5b61121c84848484611d4c565b50505050565b6060600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b815260040161127f9190612276565b600060405180830381865afa15801561129c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112c591906130a1565b9050919050565b6112d46116bd565b73ffffffffffffffffffffffffffffffffffffffff166112f2610f83565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90612c26565b60405180910390fd5b8383604051611358929190612e06565b60405180910390206113686116bd565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff884846040516113af929190612e4c565b60405180910390a350505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114596116bd565b73ffffffffffffffffffffffffffffffffffffffff16611477610f83565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490612c26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115349061315c565b60405180910390fd5b61154681611c86565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061163a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061164a575061164982611da8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661173883610bcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061178982611651565b6117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906131ee565b60405180910390fd5b60006117d383610bcd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061184257508373ffffffffffffffffffffffffffffffffffffffff1661182a84610611565b73ffffffffffffffffffffffffffffffffffffffff16145b80611853575061185281856113bd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661187c82610bcd565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613280565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613312565b60405180910390fd5b61194d838383611e12565b6119586000826116c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a89190613332565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ff9190613366565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f90613408565b60405180910390fd5b611b3181611651565b15611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890613474565b60405180910390fd5b611b7d60008383611e12565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bcd9190613366565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d5784848461185c565b611d6384848484611e17565b611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990613506565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6000611e388473ffffffffffffffffffffffffffffffffffffffff16611f9f565b15611f92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e616116bd565b8786866040518563ffffffff1660e01b8152600401611e83949392919061357b565b6020604051808303816000875af1925050508015611ebf57506040513d601f19601f82011682018060405250810190611ebc91906135dc565b60015b611f42573d8060008114611eef576040519150601f19603f3d011682016040523d82523d6000602084013e611ef4565b606091505b50600081511415611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190613506565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f97565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ffb81611fc6565b811461200657600080fd5b50565b60008135905061201881611ff2565b92915050565b60006020828403121561203457612033611fbc565b5b600061204284828501612009565b91505092915050565b60008115159050919050565b6120608161204b565b82525050565b600060208201905061207b6000830184612057565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120bb5780820151818401526020810190506120a0565b838111156120ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006120ec82612081565b6120f6818561208c565b935061210681856020860161209d565b61210f816120d0565b840191505092915050565b6000602082019050818103600083015261213481846120e1565b905092915050565b6000819050919050565b61214f8161213c565b811461215a57600080fd5b50565b60008135905061216c81612146565b92915050565b60006020828403121561218857612187611fbc565b5b60006121968482850161215d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ca8261219f565b9050919050565b6121da816121bf565b82525050565b60006020820190506121f560008301846121d1565b92915050565b612204816121bf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b6000806040838503121561223e5761223d611fbc565b5b600061224c85828601612212565b925050602061225d8582860161215d565b9150509250929050565b6122708161213c565b82525050565b600060208201905061228b6000830184612267565b92915050565b6000806000606084860312156122aa576122a9611fbc565b5b60006122b886828701612212565b93505060206122c986828701612212565b92505060406122da8682870161215d565b9150509250925092565b600080604083850312156122fb576122fa611fbc565b5b60006123098582860161215d565b925050602061231a8582860161215d565b9150509250929050565b600060408201905061233960008301856121d1565b6123466020830184612267565b9392505050565b60006020828403121561236357612362611fbc565b5b600061237184828501612212565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261239f5761239e61237a565b5b8235905067ffffffffffffffff8111156123bc576123bb61237f565b5b6020830191508360018202830111156123d8576123d7612384565b5b9250929050565b6000806000806000606086880312156123fb576123fa611fbc565b5b60006124098882890161215d565b955050602086013567ffffffffffffffff81111561242a57612429611fc1565b5b61243688828901612389565b9450945050604086013567ffffffffffffffff81111561245957612458611fc1565b5b61246588828901612389565b92509250509295509295909350565b6000819050919050565b600061249961249461248f8461219f565b612474565b61219f565b9050919050565b60006124ab8261247e565b9050919050565b60006124bd826124a0565b9050919050565b6124cd816124b2565b82525050565b60006020820190506124e860008301846124c4565b92915050565b600061ffff82169050919050565b612505816124ee565b811461251057600080fd5b50565b600081359050612522816124fc565b92915050565b6000806040838503121561253f5761253e611fbc565b5b600061254d85828601612212565b925050602061255e85828601612513565b9150509250929050565b6125718161204b565b811461257c57600080fd5b50565b60008135905061258e81612568565b92915050565b600080604083850312156125ab576125aa611fbc565b5b60006125b985828601612212565b92505060206125ca8582860161257f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612611826120d0565b810181811067ffffffffffffffff821117156126305761262f6125d9565b5b80604052505050565b6000612643611fb2565b905061264f8282612608565b919050565b600067ffffffffffffffff82111561266f5761266e6125d9565b5b612678826120d0565b9050602081019050919050565b82818337600083830152505050565b60006126a76126a284612654565b612639565b9050828152602081018484840111156126c3576126c26125d4565b5b6126ce848285612685565b509392505050565b600082601f8301126126eb576126ea61237a565b5b81356126fb848260208601612694565b91505092915050565b6000806000806080858703121561271e5761271d611fbc565b5b600061272c87828801612212565b945050602061273d87828801612212565b935050604061274e8782880161215d565b925050606085013567ffffffffffffffff81111561276f5761276e611fc1565b5b61277b878288016126d6565b91505092959194509250565b600080600080604085870312156127a1576127a0611fbc565b5b600085013567ffffffffffffffff8111156127bf576127be611fc1565b5b6127cb87828801612389565b9450945050602085013567ffffffffffffffff8111156127ee576127ed611fc1565b5b6127fa87828801612389565b925092505092959194509250565b6000806040838503121561281f5761281e611fbc565b5b600061282d85828601612212565b925050602061283e85828601612212565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061288f57607f821691505b602082108114156128a3576128a2612848565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612905602c8361208c565b9150612910826128a9565b604082019050919050565b60006020820190508181036000830152612934816128f8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061299760218361208c565b91506129a28261293b565b604082019050919050565b600060208201905081810360008301526129c68161298a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612a2960388361208c565b9150612a34826129cd565b604082019050919050565b60006020820190508181036000830152612a5881612a1c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612abb60318361208c565b9150612ac682612a5f565b604082019050919050565b60006020820190508181036000830152612aea81612aae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b2b8261213c565b9150612b368361213c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b6f57612b6e612af1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bb48261213c565b9150612bbf8361213c565b925082612bcf57612bce612b7a565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c1060208361208c565b9150612c1b82612bda565b602082019050919050565b60006020820190508181036000830152612c3f81612c03565b9050919050565b7f43616c6c6572206973206e6f7420746865206d696e74696e672061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ca260218361208c565b9150612cad82612c46565b604082019050919050565b60006020820190508181036000830152612cd181612c95565b9050919050565b7f496e76616c696420746f6b656e49640000000000000000000000000000000000600082015250565b6000612d0e600f8361208c565b9150612d1982612cd8565b602082019050919050565b60006020820190508181036000830152612d3d81612d01565b9050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b6000612da060308361208c565b9150612dab82612d44565b604082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b600081905092915050565b6000612ded8385612dd6565b9350612dfa838584612685565b82840190509392505050565b6000612e13828486612de1565b91508190509392505050565b6000612e2b838561208c565b9350612e38838584612685565b612e41836120d0565b840190509392505050565b60006020820190508181036000830152612e67818486612e1f565b90509392505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612ecc60298361208c565b9150612ed782612e70565b604082019050919050565b60006020820190508181036000830152612efb81612ebf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f5e602a8361208c565b9150612f6982612f02565b604082019050919050565b60006020820190508181036000830152612f8d81612f51565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612fca60198361208c565b9150612fd582612f94565b602082019050919050565b60006020820190508181036000830152612ff981612fbd565b9050919050565b600067ffffffffffffffff82111561301b5761301a6125d9565b5b613024826120d0565b9050602081019050919050565b600061304461303f84613000565b612639565b9050828152602081018484840111156130605761305f6125d4565b5b61306b84828561209d565b509392505050565b600082601f8301126130885761308761237a565b5b8151613098848260208601613031565b91505092915050565b6000602082840312156130b7576130b6611fbc565b5b600082015167ffffffffffffffff8111156130d5576130d4611fc1565b5b6130e184828501613073565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061314660268361208c565b9150613151826130ea565b604082019050919050565b6000602082019050818103600083015261317581613139565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131d8602c8361208c565b91506131e38261317c565b604082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061326a60298361208c565b91506132758261320e565b604082019050919050565b600060208201905081810360008301526132998161325d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132fc60248361208c565b9150613307826132a0565b604082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b600061333d8261213c565b91506133488361213c565b92508282101561335b5761335a612af1565b5b828203905092915050565b60006133718261213c565b915061337c8361213c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133b1576133b0612af1565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006133f260208361208c565b91506133fd826133bc565b602082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061345e601c8361208c565b915061346982613428565b602082019050919050565b6000602082019050818103600083015261348d81613451565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006134f060328361208c565b91506134fb82613494565b604082019050919050565b6000602082019050818103600083015261351f816134e3565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061354d82613526565b6135578185613531565b935061356781856020860161209d565b613570816120d0565b840191505092915050565b600060808201905061359060008301876121d1565b61359d60208301866121d1565b6135aa6040830185612267565b81810360608301526135bc8184613542565b905095945050505050565b6000815190506135d681611ff2565b92915050565b6000602082840312156135f2576135f1611fbc565b5b6000613600848285016135c7565b9150509291505056fea264697066735822122020df18358b5d1b0be9405d6be2cea674515713934440f2619d9a63c8aae3fa4a64736f6c634300080b0033
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101a95760003560e01c8063698f87be116100f9578063a22cb46511610097578063d4434ab011610071578063d4434ab0146104b7578063e985e9c5146104d3578063f2fde38b14610503578063fd4307c31461051f576101a9565b8063a22cb4651461044f578063b88d4fde1461046b578063c87b56dd14610487576101a9565b806372504a24116100d357806372504a24146103db57806382fc3147146103f75780638da5cb5b1461041357806395d89b4114610431576101a9565b8063698f87be1461038357806370a08231146103a1578063715018a6146103d1576101a9565b80632a55205a1161016657806342842e0e1161014057806342842e0e146102eb5780634f558e791461030757806352a6c8c9146103375780636352211e14610353576101a9565b80632a55205a1461028257806332d434e9146102b357806340c10f19146102cf576101a9565b806301ffc9a7146101ae57806306fdde03146101de578063081812fc146101fc578063095ea7b31461022c57806318160ddd1461024857806323b872dd14610266575b600080fd5b6101c860048036038101906101c3919061201e565b61053d565b6040516101d59190612066565b60405180910390f35b6101e661057f565b6040516101f3919061211a565b60405180910390f35b61021660048036038101906102119190612172565b610611565b60405161022391906121e0565b60405180910390f35b61024660048036038101906102419190612227565b610696565b005b6102506107ae565b60405161025d9190612276565b60405180910390f35b610280600480360381019061027b9190612291565b6107da565b005b61029c600480360381019061029791906122e4565b61083a565b6040516102aa929190612324565b60405180910390f35b6102cd60048036038101906102c8919061234d565b610898565b005b6102e960048036038101906102e49190612227565b610958565b005b61030560048036038101906103009190612291565b610a63565b005b610321600480360381019061031c9190612172565b610a83565b60405161032e9190612066565b60405180910390f35b610351600480360381019061034c91906123df565b610a95565b005b61036d60048036038101906103689190612172565b610bcd565b60405161037a91906121e0565b60405180910390f35b61038b610c7f565b60405161039891906124d3565b60405180910390f35b6103bb60048036038101906103b6919061234d565b610ca5565b6040516103c89190612276565b60405180910390f35b6103d9610d5d565b005b6103f560048036038101906103f09190612528565b610de5565b005b610411600480360381019061040c919061234d565b610ec3565b005b61041b610f83565b60405161042891906121e0565b60405180910390f35b610439610fad565b604051610446919061211a565b60405180910390f35b61046960048036038101906104649190612594565b61103f565b005b61048560048036038101906104809190612704565b6111c0565b005b6104a1600480360381019061049c9190612172565b611222565b6040516104ae919061211a565b60405180910390f35b6104d160048036038101906104cc9190612787565b6112cc565b005b6104ed60048036038101906104e89190612808565b6113bd565b6040516104fa9190612066565b60405180910390f35b61051d6004803603810190610518919061234d565b611451565b005b610527611549565b60405161053491906121e0565b60405180910390f35b6000632a55205a60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061057857506105778261156f565b5b9050919050565b60606000805461058e90612877565b80601f01602080910402602001604051908101604052809291908181526020018280546105ba90612877565b80156106075780601f106105dc57610100808354040283529160200191610607565b820191906000526020600020905b8154815290600101906020018083116105ea57829003601f168201915b5050505050905090565b600061061c82611651565b61065b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106529061291b565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006106a182610bcd565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610712576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610709906129ad565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107316116bd565b73ffffffffffffffffffffffffffffffffffffffff161480610760575061075f8161075a6116bd565b6113bd565b5b61079f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079690612a3f565b60405180910390fd5b6107a983836116c5565b505050565b60007f000000000000000000000000000000000000000000000000000000000000001961ffff16905090565b6107eb6107e56116bd565b8261177e565b61082a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082190612ad1565b60405180910390fd5b61083583838361185c565b505050565b600080600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16612710600960149054906101000a900461ffff1661ffff16856108839190612b20565b61088d9190612ba9565b915091509250929050565b6108a06116bd565b73ffffffffffffffffffffffffffffffffffffffff166108be610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610914576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090b90612c26565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6109606116bd565b73ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146109ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e690612cb8565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000001961ffff168110610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c90612d24565b60405180910390fd5b610a5f8282611ab8565b5050565b610a7e838383604051806020016040528060008152506111c0565b505050565b6000610a8e82611651565b9050919050565b610a9d6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610abb610f83565b73ffffffffffffffffffffffffffffffffffffffff161480610b175750610ae06116bd565b73ffffffffffffffffffffffffffffffffffffffff16610aff86610bcd565b73ffffffffffffffffffffffffffffffffffffffff16145b610b56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4d90612db6565b60405180910390fd5b8383604051610b66929190612e06565b604051809103902085610b776116bd565b73ffffffffffffffffffffffffffffffffffffffff167fad000c5a693465b4555f1044ddd1221ef0bfc49e5621ceb705b952ff97e2caac8585604051610bbe929190612e4c565b60405180910390a45050505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6d90612ee2565b60405180910390fd5b80915050919050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d16576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0d90612f74565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d656116bd565b73ffffffffffffffffffffffffffffffffffffffff16610d83610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610dd9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd090612c26565b60405180910390fd5b610de36000611c86565b565b610ded6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610e0b610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890612c26565b60405180910390fd5b81600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600960146101000a81548161ffff021916908361ffff1602179055505050565b610ecb6116bd565b73ffffffffffffffffffffffffffffffffffffffff16610ee9610f83565b73ffffffffffffffffffffffffffffffffffffffff1614610f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3690612c26565b60405180910390fd5b80600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610fbc90612877565b80601f0160208091040260200160405190810160405280929190818152602001828054610fe890612877565b80156110355780601f1061100a57610100808354040283529160200191611035565b820191906000526020600020905b81548152906001019060200180831161101857829003601f168201915b5050505050905090565b6110476116bd565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ac90612fe0565b60405180910390fd5b80600560006110c26116bd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661116f6116bd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516111b49190612066565b60405180910390a35050565b6111d16111cb6116bd565b8361177e565b611210576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120790612ad1565b60405180910390fd5b61121c84848484611d4c565b50505050565b6060600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663c87b56dd836040518263ffffffff1660e01b815260040161127f9190612276565b600060405180830381865afa15801561129c573d6000803e3d6000fd5b505050506040513d6000823e3d601f19601f820116820180604052508101906112c591906130a1565b9050919050565b6112d46116bd565b73ffffffffffffffffffffffffffffffffffffffff166112f2610f83565b73ffffffffffffffffffffffffffffffffffffffff1614611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90612c26565b60405180910390fd5b8383604051611358929190612e06565b60405180910390206113686116bd565b73ffffffffffffffffffffffffffffffffffffffff167f3d366eac52dec4372766dc4b15bba20b935b45d33171465a598eedabb5a5dff884846040516113af929190612e4c565b60405180910390a350505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6114596116bd565b73ffffffffffffffffffffffffffffffffffffffff16611477610f83565b73ffffffffffffffffffffffffffffffffffffffff16146114cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c490612c26565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561153d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115349061315c565b60405180910390fd5b61154681611c86565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061163a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061164a575061164982611da8565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661173883610bcd565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061178982611651565b6117c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117bf906131ee565b60405180910390fd5b60006117d383610bcd565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061184257508373ffffffffffffffffffffffffffffffffffffffff1661182a84610611565b73ffffffffffffffffffffffffffffffffffffffff16145b80611853575061185281856113bd565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661187c82610bcd565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c990613280565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611942576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161193990613312565b60405180910390fd5b61194d838383611e12565b6119586000826116c5565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119a89190613332565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546119ff9190613366565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b1f90613408565b60405180910390fd5b611b3181611651565b15611b71576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b6890613474565b60405180910390fd5b611b7d60008383611e12565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611bcd9190613366565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611d5784848461185c565b611d6384848484611e17565b611da2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d9990613506565b60405180910390fd5b50505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6000611e388473ffffffffffffffffffffffffffffffffffffffff16611f9f565b15611f92578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e616116bd565b8786866040518563ffffffff1660e01b8152600401611e83949392919061357b565b6020604051808303816000875af1925050508015611ebf57506040513d601f19601f82011682018060405250810190611ebc91906135dc565b60015b611f42573d8060008114611eef576040519150601f19603f3d011682016040523d82523d6000602084013e611ef4565b606091505b50600081511415611f3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3190613506565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050611f97565b600190505b949350505050565b600080823b905060008111915050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611ffb81611fc6565b811461200657600080fd5b50565b60008135905061201881611ff2565b92915050565b60006020828403121561203457612033611fbc565b5b600061204284828501612009565b91505092915050565b60008115159050919050565b6120608161204b565b82525050565b600060208201905061207b6000830184612057565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156120bb5780820151818401526020810190506120a0565b838111156120ca576000848401525b50505050565b6000601f19601f8301169050919050565b60006120ec82612081565b6120f6818561208c565b935061210681856020860161209d565b61210f816120d0565b840191505092915050565b6000602082019050818103600083015261213481846120e1565b905092915050565b6000819050919050565b61214f8161213c565b811461215a57600080fd5b50565b60008135905061216c81612146565b92915050565b60006020828403121561218857612187611fbc565b5b60006121968482850161215d565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006121ca8261219f565b9050919050565b6121da816121bf565b82525050565b60006020820190506121f560008301846121d1565b92915050565b612204816121bf565b811461220f57600080fd5b50565b600081359050612221816121fb565b92915050565b6000806040838503121561223e5761223d611fbc565b5b600061224c85828601612212565b925050602061225d8582860161215d565b9150509250929050565b6122708161213c565b82525050565b600060208201905061228b6000830184612267565b92915050565b6000806000606084860312156122aa576122a9611fbc565b5b60006122b886828701612212565b93505060206122c986828701612212565b92505060406122da8682870161215d565b9150509250925092565b600080604083850312156122fb576122fa611fbc565b5b60006123098582860161215d565b925050602061231a8582860161215d565b9150509250929050565b600060408201905061233960008301856121d1565b6123466020830184612267565b9392505050565b60006020828403121561236357612362611fbc565b5b600061237184828501612212565b91505092915050565b600080fd5b600080fd5b600080fd5b60008083601f84011261239f5761239e61237a565b5b8235905067ffffffffffffffff8111156123bc576123bb61237f565b5b6020830191508360018202830111156123d8576123d7612384565b5b9250929050565b6000806000806000606086880312156123fb576123fa611fbc565b5b60006124098882890161215d565b955050602086013567ffffffffffffffff81111561242a57612429611fc1565b5b61243688828901612389565b9450945050604086013567ffffffffffffffff81111561245957612458611fc1565b5b61246588828901612389565b92509250509295509295909350565b6000819050919050565b600061249961249461248f8461219f565b612474565b61219f565b9050919050565b60006124ab8261247e565b9050919050565b60006124bd826124a0565b9050919050565b6124cd816124b2565b82525050565b60006020820190506124e860008301846124c4565b92915050565b600061ffff82169050919050565b612505816124ee565b811461251057600080fd5b50565b600081359050612522816124fc565b92915050565b6000806040838503121561253f5761253e611fbc565b5b600061254d85828601612212565b925050602061255e85828601612513565b9150509250929050565b6125718161204b565b811461257c57600080fd5b50565b60008135905061258e81612568565b92915050565b600080604083850312156125ab576125aa611fbc565b5b60006125b985828601612212565b92505060206125ca8582860161257f565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612611826120d0565b810181811067ffffffffffffffff821117156126305761262f6125d9565b5b80604052505050565b6000612643611fb2565b905061264f8282612608565b919050565b600067ffffffffffffffff82111561266f5761266e6125d9565b5b612678826120d0565b9050602081019050919050565b82818337600083830152505050565b60006126a76126a284612654565b612639565b9050828152602081018484840111156126c3576126c26125d4565b5b6126ce848285612685565b509392505050565b600082601f8301126126eb576126ea61237a565b5b81356126fb848260208601612694565b91505092915050565b6000806000806080858703121561271e5761271d611fbc565b5b600061272c87828801612212565b945050602061273d87828801612212565b935050604061274e8782880161215d565b925050606085013567ffffffffffffffff81111561276f5761276e611fc1565b5b61277b878288016126d6565b91505092959194509250565b600080600080604085870312156127a1576127a0611fbc565b5b600085013567ffffffffffffffff8111156127bf576127be611fc1565b5b6127cb87828801612389565b9450945050602085013567ffffffffffffffff8111156127ee576127ed611fc1565b5b6127fa87828801612389565b925092505092959194509250565b6000806040838503121561281f5761281e611fbc565b5b600061282d85828601612212565b925050602061283e85828601612212565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061288f57607f821691505b602082108114156128a3576128a2612848565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612905602c8361208c565b9150612910826128a9565b604082019050919050565b60006020820190508181036000830152612934816128f8565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061299760218361208c565b91506129a28261293b565b604082019050919050565b600060208201905081810360008301526129c68161298a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612a2960388361208c565b9150612a34826129cd565b604082019050919050565b60006020820190508181036000830152612a5881612a1c565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612abb60318361208c565b9150612ac682612a5f565b604082019050919050565b60006020820190508181036000830152612aea81612aae565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612b2b8261213c565b9150612b368361213c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b6f57612b6e612af1565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612bb48261213c565b9150612bbf8361213c565b925082612bcf57612bce612b7a565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612c1060208361208c565b9150612c1b82612bda565b602082019050919050565b60006020820190508181036000830152612c3f81612c03565b9050919050565b7f43616c6c6572206973206e6f7420746865206d696e74696e672061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b6000612ca260218361208c565b9150612cad82612c46565b604082019050919050565b60006020820190508181036000830152612cd181612c95565b9050919050565b7f496e76616c696420746f6b656e49640000000000000000000000000000000000600082015250565b6000612d0e600f8361208c565b9150612d1982612cd8565b602082019050919050565b60006020820190508181036000830152612d3d81612d01565b9050919050565b7f4f6e6c792070726f6a656374206f7220746f6b656e206f776e65722063616e2060008201527f656d697420746f6b656e206576656e7400000000000000000000000000000000602082015250565b6000612da060308361208c565b9150612dab82612d44565b604082019050919050565b60006020820190508181036000830152612dcf81612d93565b9050919050565b600081905092915050565b6000612ded8385612dd6565b9350612dfa838584612685565b82840190509392505050565b6000612e13828486612de1565b91508190509392505050565b6000612e2b838561208c565b9350612e38838584612685565b612e41836120d0565b840190509392505050565b60006020820190508181036000830152612e67818486612e1f565b90509392505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612ecc60298361208c565b9150612ed782612e70565b604082019050919050565b60006020820190508181036000830152612efb81612ebf565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612f5e602a8361208c565b9150612f6982612f02565b604082019050919050565b60006020820190508181036000830152612f8d81612f51565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000612fca60198361208c565b9150612fd582612f94565b602082019050919050565b60006020820190508181036000830152612ff981612fbd565b9050919050565b600067ffffffffffffffff82111561301b5761301a6125d9565b5b613024826120d0565b9050602081019050919050565b600061304461303f84613000565b612639565b9050828152602081018484840111156130605761305f6125d4565b5b61306b84828561209d565b509392505050565b600082601f8301126130885761308761237a565b5b8151613098848260208601613031565b91505092915050565b6000602082840312156130b7576130b6611fbc565b5b600082015167ffffffffffffffff8111156130d5576130d4611fc1565b5b6130e184828501613073565b91505092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061314660268361208c565b9150613151826130ea565b604082019050919050565b6000602082019050818103600083015261317581613139565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006131d8602c8361208c565b91506131e38261317c565b604082019050919050565b60006020820190508181036000830152613207816131cb565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b600061326a60298361208c565b91506132758261320e565b604082019050919050565b600060208201905081810360008301526132998161325d565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006132fc60248361208c565b9150613307826132a0565b604082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b600061333d8261213c565b91506133488361213c565b92508282101561335b5761335a612af1565b5b828203905092915050565b60006133718261213c565b915061337c8361213c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133b1576133b0612af1565b5b828201905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006133f260208361208c565b91506133fd826133bc565b602082019050919050565b60006020820190508181036000830152613421816133e5565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061345e601c8361208c565b915061346982613428565b602082019050919050565b6000602082019050818103600083015261348d81613451565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006134f060328361208c565b91506134fb82613494565b604082019050919050565b6000602082019050818103600083015261351f816134e3565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061354d82613526565b6135578185613531565b935061356781856020860161209d565b613570816120d0565b840191505092915050565b600060808201905061359060008301876121d1565b61359d60208301866121d1565b6135aa6040830185612267565b81810360608301526135bc8184613542565b905095945050505050565b6000815190506135d681611ff2565b92915050565b6000602082840312156135f2576135f1611fbc565b5b6000613600848285016135c7565b9150509291505056fea264697066735822122020df18358b5d1b0be9405d6be2cea674515713934440f2619d9a63c8aae3fa4a64736f6c634300080b0033
Deployed Bytecode Sourcemap
190:2556:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2520:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24639:98:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26150:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25688:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;911:82:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27014:330:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2346:170:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;1879:96;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1097:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27410:179:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;997:96:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1390:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24342:235:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;252:33:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24080:205:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21920:92;;;:::i;:::-;;2114:209:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1979:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21288:85:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24801:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26434:290;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27655:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1246:140:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1716:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26790:162:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22161:189;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;290:29:1;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2520:224;2613:4;2689:10;2674:25;;:11;:25;;;;:65;;;;2703:36;2727:11;2703:23;:36::i;:::-;2674:65;2667:72;;2520:224;;;:::o;24639:98:0:-;24693:13;24725:5;24718:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24639:98;:::o;26150:217::-;26226:7;26253:16;26261:7;26253;:16::i;:::-;26245:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26336:15;:24;26352:7;26336:24;;;;;;;;;;;;;;;;;;;;;26329:31;;26150:217;;;:::o;25688:401::-;25768:13;25784:23;25799:7;25784:14;:23::i;:::-;25768:39;;25831:5;25825:11;;:2;:11;;;;25817:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25922:5;25906:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25931:37;25948:5;25955:12;:10;:12::i;:::-;25931:16;:37::i;:::-;25906:62;25885:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;26061:21;26070:2;26074:7;26061:8;:21::i;:::-;25758:331;25688:401;;:::o;911:82:1:-;957:7;979:9;972:16;;;;911:82;:::o;27014:330:0:-;27203:41;27222:12;:10;:12::i;:::-;27236:7;27203:18;:41::i;:::-;27195:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27309:28;27319:4;27325:2;27329:7;27309:9;:28::i;:::-;27014:330;;;:::o;2346:170:1:-;2419:7;2428;2451:18;;;;;;;;;;;2505:5;2484:18;;;;;;;;;;;2471:31;;:10;:31;;;;:::i;:::-;:39;;;;:::i;:::-;2443:68;;;;2346:170;;;;;:::o;1879:96::-;21511:12:0;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1964:6:1::1;1947:14;;:23;;;;;;;;;;;;;;;;;;1879:96:::0;:::o;1097:145::-;845:12;:10;:12::i;:::-;827:30;;:14;;;;;;;;;;;:30;;;819:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;1184:9:::1;1174:19;;:7;:19;1166:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;1219:18;1225:2;1229:7;1219:5;:18::i;:::-;1097:145:::0;;:::o;27410:179:0:-;27543:39;27560:4;27566:2;27570:7;27543:39;;;;;;;;;;;;:16;:39::i;:::-;27410:179;;;:::o;997:96:1:-;1053:4;1072:16;1080:7;1072;:16::i;:::-;1065:23;;997:96;;;:::o;1390:322::-;1524:12;:10;:12::i;:::-;1513:23;;:7;:5;:7::i;:::-;:23;;;:66;;;;1567:12;:10;:12::i;:::-;1540:39;;:23;1555:7;1540:14;:23::i;:::-;:39;;;1513:66;1498:145;;;;;;;;;;;;:::i;:::-;;;;;;;;;1688:9;;1654:53;;;;;;;:::i;:::-;;;;;;;;1679:7;1665:12;:10;:12::i;:::-;1654:53;;;1699:7;;1654:53;;;;;;;:::i;:::-;;;;;;;;1390:322;;;;;:::o;24342:235:0:-;24414:7;24433:13;24449:7;:16;24457:7;24449:16;;;;;;;;;;;;;;;;;;;;;24433:32;;24500:1;24483:19;;:5;:19;;;;24475:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24565:5;24558:12;;;24342:235;;;:::o;252:33:1:-;;;;;;;;;;;;;:::o;24080:205:0:-;24152:7;24196:1;24179:19;;:5;:19;;;;24171:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;24262:9;:16;24272:5;24262:16;;;;;;;;;;;;;;;;24255:23;;24080:205;;;:::o;21920:92::-;21511:12;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;21984:21:::1;22002:1;21984:9;:21::i;:::-;21920:92::o:0;2114:209:1:-;21511:12:0;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2253:19:1::1;2232:18;;:40;;;;;;;;;;;;;;;;;;2299:19;2278:18;;:40;;;;;;;;;;;;;;;;;;2114:209:::0;;:::o;1979:131::-;21511:12:0;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2088:16:1::1;2059;;:46;;;;;;;;;;;;;;;;;;1979:131:::0;:::o;21288:85:0:-;21334:7;21360:6;;;;;;;;;;;21353:13;;21288:85;:::o;24801:102::-;24857:13;24889:7;24882:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24801:102;:::o;26434:290::-;26548:12;:10;:12::i;:::-;26536:24;;:8;:24;;;;26528:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;26646:8;26601:18;:32;26620:12;:10;:12::i;:::-;26601:32;;;;;;;;;;;;;;;:42;26634:8;26601:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;26698:8;26669:48;;26684:12;:10;:12::i;:::-;26669:48;;;26708:8;26669:48;;;;;;:::i;:::-;;;;;;;;26434:290;;:::o;27655:320::-;27824:41;27843:12;:10;:12::i;:::-;27857:7;27824:18;:41::i;:::-;27816:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27929:39;27943:4;27949:2;27953:7;27962:5;27929:13;:39::i;:::-;27655:320;;;;:::o;1246:140:1:-;1319:13;1347:16;;;;;;;;;;;:25;;;1373:7;1347:34;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;1340:41;;1246:140;;;:::o;1716:159::-;21511:12:0;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1851:9:1::1;;1824:46;;;;;;;:::i;:::-;;;;;;;;1837:12;:10;:12::i;:::-;1824:46;;;1862:7;;1824:46;;;;;;;:::i;:::-;;;;;;;;1716:159:::0;;;;:::o;26790:162:0:-;26887:4;26910:18;:25;26929:5;26910:25;;;;;;;;;;;;;;;:35;26936:8;26910:35;;;;;;;;;;;;;;;;;;;;;;;;;26903:42;;26790:162;;;;:::o;22161:189::-;21511:12;:10;:12::i;:::-;21500:23;;:7;:5;:7::i;:::-;:23;;;21492:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;22269:1:::1;22249:22;;:8;:22;;;;22241:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22324:19;22334:8;22324:9;:19::i;:::-;22161:189:::0;:::o;290:29:1:-;;;;;;;;;;;;;:::o;23721:300:0:-;23823:4;23873:25;23858:40;;;:11;:40;;;;:104;;;;23929:33;23914:48;;;:11;:48;;;;23858:104;:156;;;;23978:36;24002:11;23978:23;:36::i;:::-;23858:156;23839:175;;23721:300;;;:::o;29447:125::-;29512:4;29563:1;29535:30;;:7;:16;29543:7;29535:16;;;;;;;;;;;;;;;;;;;;;:30;;;;29528:37;;29447:125;;;:::o;15379:96::-;15432:7;15458:10;15451:17;;15379:96;:::o;33298:171::-;33399:2;33372:15;:24;33388:7;33372:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33454:7;33450:2;33416:46;;33425:23;33440:7;33425:14;:23::i;:::-;33416:46;;;;;;;;;;;;33298:171;;:::o;29730:344::-;29823:4;29847:16;29855:7;29847;:16::i;:::-;29839:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29922:13;29938:23;29953:7;29938:14;:23::i;:::-;29922:39;;29990:5;29979:16;;:7;:16;;;:51;;;;30023:7;29999:31;;:20;30011:7;29999:11;:20::i;:::-;:31;;;29979:51;:87;;;;30034:32;30051:5;30058:7;30034:16;:32::i;:::-;29979:87;29971:96;;;29730:344;;;;:::o;32627:560::-;32781:4;32754:31;;:23;32769:7;32754:14;:23::i;:::-;:31;;;32746:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32863:1;32849:16;;:2;:16;;;;32841:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32917:39;32938:4;32944:2;32948:7;32917:20;:39::i;:::-;33018:29;33035:1;33039:7;33018:8;:29::i;:::-;33077:1;33058:9;:15;33068:4;33058:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;33105:1;33088:9;:13;33098:2;33088:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33135:2;33116:7;:16;33124:7;33116:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33172:7;33168:2;33153:27;;33162:4;33153:27;;;;;;;;;;;;32627:560;;;:::o;31366:372::-;31459:1;31445:16;;:2;:16;;;;31437:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;31517:16;31525:7;31517;:16::i;:::-;31516:17;31508:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31577:45;31606:1;31610:2;31614:7;31577:20;:45::i;:::-;31650:1;31633:9;:13;31643:2;31633:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31680:2;31661:7;:16;31669:7;31661:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31723:7;31719:2;31698:33;;31715:1;31698:33;;;;;;;;;;;;31366:372;;:::o;22356:169::-;22411:16;22430:6;;;;;;;;;;;22411:25;;22455:8;22446:6;;:17;;;;;;;;;;;;;;;;;;22509:8;22478:40;;22499:8;22478:40;;;;;;;;;;;;22401:124;22356:169;:::o;28837:307::-;28988:28;28998:4;29004:2;29008:7;28988:9;:28::i;:::-;29034:48;29057:4;29063:2;29067:7;29076:5;29034:22;:48::i;:::-;29026:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28837:307;;;;:::o;20244:155::-;20329:4;20367:25;20352:40;;;:11;:40;;;;20345:47;;20244:155;;;:::o;35360:122::-;;;;:::o;34022:782::-;34172:4;34192:15;:2;:13;;;:15::i;:::-;34188:610;;;34243:2;34227:36;;;34264:12;:10;:12::i;:::-;34278:4;34284:7;34293:5;34227:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34223:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34487:1;34470:6;:13;:18;34466:266;;;34512:60;;;;;;;;;;:::i;:::-;;;;;;;;34466:266;34684:6;34678:13;34669:6;34665:2;34661:15;34654:38;34223:523;34359:45;;;34349:55;;;:6;:55;;;;34342:62;;;;;34188:610;34783:4;34776:11;;34022:782;;;;;;;:::o;7462:377::-;7522:4;7725:12;7790:7;7778:20;7770:28;;7831:1;7824:4;:8;7817:15;;;7462:377;;;:::o;7:75:2:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:474::-;5983:6;5991;6040:2;6028:9;6019:7;6015:23;6011:32;6008:119;;;6046:79;;:::i;:::-;6008:119;6166:1;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6137:117;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5915:474;;;;;:::o;6395:332::-;6516:4;6554:2;6543:9;6539:18;6531:26;;6567:71;6635:1;6624:9;6620:17;6611:6;6567:71;:::i;:::-;6648:72;6716:2;6705:9;6701:18;6692:6;6648:72;:::i;:::-;6395:332;;;;;:::o;6733:329::-;6792:6;6841:2;6829:9;6820:7;6816:23;6812:32;6809:119;;;6847:79;;:::i;:::-;6809:119;6967:1;6992:53;7037:7;7028:6;7017:9;7013:22;6992:53;:::i;:::-;6982:63;;6938:117;6733:329;;;;:::o;7068:117::-;7177:1;7174;7167:12;7191:117;7300:1;7297;7290:12;7314:117;7423:1;7420;7413:12;7451:553;7509:8;7519:6;7569:3;7562:4;7554:6;7550:17;7546:27;7536:122;;7577:79;;:::i;:::-;7536:122;7690:6;7677:20;7667:30;;7720:18;7712:6;7709:30;7706:117;;;7742:79;;:::i;:::-;7706:117;7856:4;7848:6;7844:17;7832:29;;7910:3;7902:4;7894:6;7890:17;7880:8;7876:32;7873:41;7870:128;;;7917:79;;:::i;:::-;7870:128;7451:553;;;;;:::o;8010:1019::-;8111:6;8119;8127;8135;8143;8192:2;8180:9;8171:7;8167:23;8163:32;8160:119;;;8198:79;;:::i;:::-;8160:119;8318:1;8343:53;8388:7;8379:6;8368:9;8364:22;8343:53;:::i;:::-;8333:63;;8289:117;8473:2;8462:9;8458:18;8445:32;8504:18;8496:6;8493:30;8490:117;;;8526:79;;:::i;:::-;8490:117;8639:65;8696:7;8687:6;8676:9;8672:22;8639:65;:::i;:::-;8621:83;;;;8416:298;8781:2;8770:9;8766:18;8753:32;8812:18;8804:6;8801:30;8798:117;;;8834:79;;:::i;:::-;8798:117;8947:65;9004:7;8995:6;8984:9;8980:22;8947:65;:::i;:::-;8929:83;;;;8724:298;8010:1019;;;;;;;;:::o;9035:60::-;9063:3;9084:5;9077:12;;9035:60;;;:::o;9101:142::-;9151:9;9184:53;9202:34;9211:24;9229:5;9211:24;:::i;:::-;9202:34;:::i;:::-;9184:53;:::i;:::-;9171:66;;9101:142;;;:::o;9249:126::-;9299:9;9332:37;9363:5;9332:37;:::i;:::-;9319:50;;9249:126;;;:::o;9381:144::-;9449:9;9482:37;9513:5;9482:37;:::i;:::-;9469:50;;9381:144;;;:::o;9531:167::-;9636:55;9685:5;9636:55;:::i;:::-;9631:3;9624:68;9531:167;;:::o;9704:258::-;9815:4;9853:2;9842:9;9838:18;9830:26;;9866:89;9952:1;9941:9;9937:17;9928:6;9866:89;:::i;:::-;9704:258;;;;:::o;9968:89::-;10004:7;10044:6;10037:5;10033:18;10022:29;;9968:89;;;:::o;10063:120::-;10135:23;10152:5;10135:23;:::i;:::-;10128:5;10125:34;10115:62;;10173:1;10170;10163:12;10115:62;10063:120;:::o;10189:137::-;10234:5;10272:6;10259:20;10250:29;;10288:32;10314:5;10288:32;:::i;:::-;10189:137;;;;:::o;10332:472::-;10399:6;10407;10456:2;10444:9;10435:7;10431:23;10427:32;10424:119;;;10462:79;;:::i;:::-;10424:119;10582:1;10607:53;10652:7;10643:6;10632:9;10628:22;10607:53;:::i;:::-;10597:63;;10553:117;10709:2;10735:52;10779:7;10770:6;10759:9;10755:22;10735:52;:::i;:::-;10725:62;;10680:117;10332:472;;;;;:::o;10810:116::-;10880:21;10895:5;10880:21;:::i;:::-;10873:5;10870:32;10860:60;;10916:1;10913;10906:12;10860:60;10810:116;:::o;10932:133::-;10975:5;11013:6;11000:20;10991:29;;11029:30;11053:5;11029:30;:::i;:::-;10932:133;;;;:::o;11071:468::-;11136:6;11144;11193:2;11181:9;11172:7;11168:23;11164:32;11161:119;;;11199:79;;:::i;:::-;11161:119;11319:1;11344:53;11389:7;11380:6;11369:9;11365:22;11344:53;:::i;:::-;11334:63;;11290:117;11446:2;11472:50;11514:7;11505:6;11494:9;11490:22;11472:50;:::i;:::-;11462:60;;11417:115;11071:468;;;;;:::o;11545:117::-;11654:1;11651;11644:12;11668:180;11716:77;11713:1;11706:88;11813:4;11810:1;11803:15;11837:4;11834:1;11827:15;11854:281;11937:27;11959:4;11937:27;:::i;:::-;11929:6;11925:40;12067:6;12055:10;12052:22;12031:18;12019:10;12016:34;12013:62;12010:88;;;12078:18;;:::i;:::-;12010:88;12118:10;12114:2;12107:22;11897:238;11854:281;;:::o;12141:129::-;12175:6;12202:20;;:::i;:::-;12192:30;;12231:33;12259:4;12251:6;12231:33;:::i;:::-;12141:129;;;:::o;12276:307::-;12337:4;12427:18;12419:6;12416:30;12413:56;;;12449:18;;:::i;:::-;12413:56;12487:29;12509:6;12487:29;:::i;:::-;12479:37;;12571:4;12565;12561:15;12553:23;;12276:307;;;:::o;12589:154::-;12673:6;12668:3;12663;12650:30;12735:1;12726:6;12721:3;12717:16;12710:27;12589:154;;;:::o;12749:410::-;12826:5;12851:65;12867:48;12908:6;12867:48;:::i;:::-;12851:65;:::i;:::-;12842:74;;12939:6;12932:5;12925:21;12977:4;12970:5;12966:16;13015:3;13006:6;13001:3;12997:16;12994:25;12991:112;;;13022:79;;:::i;:::-;12991:112;13112:41;13146:6;13141:3;13136;13112:41;:::i;:::-;12832:327;12749:410;;;;;:::o;13178:338::-;13233:5;13282:3;13275:4;13267:6;13263:17;13259:27;13249:122;;13290:79;;:::i;:::-;13249:122;13407:6;13394:20;13432:78;13506:3;13498:6;13491:4;13483:6;13479:17;13432:78;:::i;:::-;13423:87;;13239:277;13178:338;;;;:::o;13522:943::-;13617:6;13625;13633;13641;13690:3;13678:9;13669:7;13665:23;13661:33;13658:120;;;13697:79;;:::i;:::-;13658:120;13817:1;13842:53;13887:7;13878:6;13867:9;13863:22;13842:53;:::i;:::-;13832:63;;13788:117;13944:2;13970:53;14015:7;14006:6;13995:9;13991:22;13970:53;:::i;:::-;13960:63;;13915:118;14072:2;14098:53;14143:7;14134:6;14123:9;14119:22;14098:53;:::i;:::-;14088:63;;14043:118;14228:2;14217:9;14213:18;14200:32;14259:18;14251:6;14248:30;14245:117;;;14281:79;;:::i;:::-;14245:117;14386:62;14440:7;14431:6;14420:9;14416:22;14386:62;:::i;:::-;14376:72;;14171:287;13522:943;;;;;;;:::o;14471:874::-;14563:6;14571;14579;14587;14636:2;14624:9;14615:7;14611:23;14607:32;14604:119;;;14642:79;;:::i;:::-;14604:119;14790:1;14779:9;14775:17;14762:31;14820:18;14812:6;14809:30;14806:117;;;14842:79;;:::i;:::-;14806:117;14955:65;15012:7;15003:6;14992:9;14988:22;14955:65;:::i;:::-;14937:83;;;;14733:297;15097:2;15086:9;15082:18;15069:32;15128:18;15120:6;15117:30;15114:117;;;15150:79;;:::i;:::-;15114:117;15263:65;15320:7;15311:6;15300:9;15296:22;15263:65;:::i;:::-;15245:83;;;;15040:298;14471:874;;;;;;;:::o;15351:474::-;15419:6;15427;15476:2;15464:9;15455:7;15451:23;15447:32;15444:119;;;15482:79;;:::i;:::-;15444:119;15602:1;15627:53;15672:7;15663:6;15652:9;15648:22;15627:53;:::i;:::-;15617:63;;15573:117;15729:2;15755:53;15800:7;15791:6;15780:9;15776:22;15755:53;:::i;:::-;15745:63;;15700:118;15351:474;;;;;:::o;15831:180::-;15879:77;15876:1;15869:88;15976:4;15973:1;15966:15;16000:4;15997:1;15990:15;16017:320;16061:6;16098:1;16092:4;16088:12;16078:22;;16145:1;16139:4;16135:12;16166:18;16156:81;;16222:4;16214:6;16210:17;16200:27;;16156:81;16284:2;16276:6;16273:14;16253:18;16250:38;16247:84;;;16303:18;;:::i;:::-;16247:84;16068:269;16017:320;;;:::o;16343:231::-;16483:34;16479:1;16471:6;16467:14;16460:58;16552:14;16547:2;16539:6;16535:15;16528:39;16343:231;:::o;16580:366::-;16722:3;16743:67;16807:2;16802:3;16743:67;:::i;:::-;16736:74;;16819:93;16908:3;16819:93;:::i;:::-;16937:2;16932:3;16928:12;16921:19;;16580:366;;;:::o;16952:419::-;17118:4;17156:2;17145:9;17141:18;17133:26;;17205:9;17199:4;17195:20;17191:1;17180:9;17176:17;17169:47;17233:131;17359:4;17233:131;:::i;:::-;17225:139;;16952:419;;;:::o;17377:220::-;17517:34;17513:1;17505:6;17501:14;17494:58;17586:3;17581:2;17573:6;17569:15;17562:28;17377:220;:::o;17603:366::-;17745:3;17766:67;17830:2;17825:3;17766:67;:::i;:::-;17759:74;;17842:93;17931:3;17842:93;:::i;:::-;17960:2;17955:3;17951:12;17944:19;;17603:366;;;:::o;17975:419::-;18141:4;18179:2;18168:9;18164:18;18156:26;;18228:9;18222:4;18218:20;18214:1;18203:9;18199:17;18192:47;18256:131;18382:4;18256:131;:::i;:::-;18248:139;;17975:419;;;:::o;18400:243::-;18540:34;18536:1;18528:6;18524:14;18517:58;18609:26;18604:2;18596:6;18592:15;18585:51;18400:243;:::o;18649:366::-;18791:3;18812:67;18876:2;18871:3;18812:67;:::i;:::-;18805:74;;18888:93;18977:3;18888:93;:::i;:::-;19006:2;19001:3;18997:12;18990:19;;18649:366;;;:::o;19021:419::-;19187:4;19225:2;19214:9;19210:18;19202:26;;19274:9;19268:4;19264:20;19260:1;19249:9;19245:17;19238:47;19302:131;19428:4;19302:131;:::i;:::-;19294:139;;19021:419;;;:::o;19446:236::-;19586:34;19582:1;19574:6;19570:14;19563:58;19655:19;19650:2;19642:6;19638:15;19631:44;19446:236;:::o;19688:366::-;19830:3;19851:67;19915:2;19910:3;19851:67;:::i;:::-;19844:74;;19927:93;20016:3;19927:93;:::i;:::-;20045:2;20040:3;20036:12;20029:19;;19688:366;;;:::o;20060:419::-;20226:4;20264:2;20253:9;20249:18;20241:26;;20313:9;20307:4;20303:20;20299:1;20288:9;20284:17;20277:47;20341:131;20467:4;20341:131;:::i;:::-;20333:139;;20060:419;;;:::o;20485:180::-;20533:77;20530:1;20523:88;20630:4;20627:1;20620:15;20654:4;20651:1;20644:15;20671:348;20711:7;20734:20;20752:1;20734:20;:::i;:::-;20729:25;;20768:20;20786:1;20768:20;:::i;:::-;20763:25;;20956:1;20888:66;20884:74;20881:1;20878:81;20873:1;20866:9;20859:17;20855:105;20852:131;;;20963:18;;:::i;:::-;20852:131;21011:1;21008;21004:9;20993:20;;20671:348;;;;:::o;21025:180::-;21073:77;21070:1;21063:88;21170:4;21167:1;21160:15;21194:4;21191:1;21184:15;21211:185;21251:1;21268:20;21286:1;21268:20;:::i;:::-;21263:25;;21302:20;21320:1;21302:20;:::i;:::-;21297:25;;21341:1;21331:35;;21346:18;;:::i;:::-;21331:35;21388:1;21385;21381:9;21376:14;;21211:185;;;;:::o;21402:182::-;21542:34;21538:1;21530:6;21526:14;21519:58;21402:182;:::o;21590:366::-;21732:3;21753:67;21817:2;21812:3;21753:67;:::i;:::-;21746:74;;21829:93;21918:3;21829:93;:::i;:::-;21947:2;21942:3;21938:12;21931:19;;21590:366;;;:::o;21962:419::-;22128:4;22166:2;22155:9;22151:18;22143:26;;22215:9;22209:4;22205:20;22201:1;22190:9;22186:17;22179:47;22243:131;22369:4;22243:131;:::i;:::-;22235:139;;21962:419;;;:::o;22387:220::-;22527:34;22523:1;22515:6;22511:14;22504:58;22596:3;22591:2;22583:6;22579:15;22572:28;22387:220;:::o;22613:366::-;22755:3;22776:67;22840:2;22835:3;22776:67;:::i;:::-;22769:74;;22852:93;22941:3;22852:93;:::i;:::-;22970:2;22965:3;22961:12;22954:19;;22613:366;;;:::o;22985:419::-;23151:4;23189:2;23178:9;23174:18;23166:26;;23238:9;23232:4;23228:20;23224:1;23213:9;23209:17;23202:47;23266:131;23392:4;23266:131;:::i;:::-;23258:139;;22985:419;;;:::o;23410:165::-;23550:17;23546:1;23538:6;23534:14;23527:41;23410:165;:::o;23581:366::-;23723:3;23744:67;23808:2;23803:3;23744:67;:::i;:::-;23737:74;;23820:93;23909:3;23820:93;:::i;:::-;23938:2;23933:3;23929:12;23922:19;;23581:366;;;:::o;23953:419::-;24119:4;24157:2;24146:9;24142:18;24134:26;;24206:9;24200:4;24196:20;24192:1;24181:9;24177:17;24170:47;24234:131;24360:4;24234:131;:::i;:::-;24226:139;;23953:419;;;:::o;24378:235::-;24518:34;24514:1;24506:6;24502:14;24495:58;24587:18;24582:2;24574:6;24570:15;24563:43;24378:235;:::o;24619:366::-;24761:3;24782:67;24846:2;24841:3;24782:67;:::i;:::-;24775:74;;24858:93;24947:3;24858:93;:::i;:::-;24976:2;24971:3;24967:12;24960:19;;24619:366;;;:::o;24991:419::-;25157:4;25195:2;25184:9;25180:18;25172:26;;25244:9;25238:4;25234:20;25230:1;25219:9;25215:17;25208:47;25272:131;25398:4;25272:131;:::i;:::-;25264:139;;24991:419;;;:::o;25416:148::-;25518:11;25555:3;25540:18;;25416:148;;;;:::o;25594:317::-;25710:3;25731:89;25813:6;25808:3;25731:89;:::i;:::-;25724:96;;25830:43;25866:6;25861:3;25854:5;25830:43;:::i;:::-;25898:6;25893:3;25889:16;25882:23;;25594:317;;;;;:::o;25917:295::-;26059:3;26081:105;26182:3;26173:6;26165;26081:105;:::i;:::-;26074:112;;26203:3;26196:10;;25917:295;;;;;:::o;26242:304::-;26340:3;26361:71;26425:6;26420:3;26361:71;:::i;:::-;26354:78;;26442:43;26478:6;26473:3;26466:5;26442:43;:::i;:::-;26510:29;26532:6;26510:29;:::i;:::-;26505:3;26501:39;26494:46;;26242:304;;;;;:::o;26552:333::-;26675:4;26713:2;26702:9;26698:18;26690:26;;26762:9;26756:4;26752:20;26748:1;26737:9;26733:17;26726:47;26790:88;26873:4;26864:6;26856;26790:88;:::i;:::-;26782:96;;26552:333;;;;;:::o;26891:228::-;27031:34;27027:1;27019:6;27015:14;27008:58;27100:11;27095:2;27087:6;27083:15;27076:36;26891:228;:::o;27125:366::-;27267:3;27288:67;27352:2;27347:3;27288:67;:::i;:::-;27281:74;;27364:93;27453:3;27364:93;:::i;:::-;27482:2;27477:3;27473:12;27466:19;;27125:366;;;:::o;27497:419::-;27663:4;27701:2;27690:9;27686:18;27678:26;;27750:9;27744:4;27740:20;27736:1;27725:9;27721:17;27714:47;27778:131;27904:4;27778:131;:::i;:::-;27770:139;;27497:419;;;:::o;27922:229::-;28062:34;28058:1;28050:6;28046:14;28039:58;28131:12;28126:2;28118:6;28114:15;28107:37;27922:229;:::o;28157:366::-;28299:3;28320:67;28384:2;28379:3;28320:67;:::i;:::-;28313:74;;28396:93;28485:3;28396:93;:::i;:::-;28514:2;28509:3;28505:12;28498:19;;28157:366;;;:::o;28529:419::-;28695:4;28733:2;28722:9;28718:18;28710:26;;28782:9;28776:4;28772:20;28768:1;28757:9;28753:17;28746:47;28810:131;28936:4;28810:131;:::i;:::-;28802:139;;28529:419;;;:::o;28954:175::-;29094:27;29090:1;29082:6;29078:14;29071:51;28954:175;:::o;29135:366::-;29277:3;29298:67;29362:2;29357:3;29298:67;:::i;:::-;29291:74;;29374:93;29463:3;29374:93;:::i;:::-;29492:2;29487:3;29483:12;29476:19;;29135:366;;;:::o;29507:419::-;29673:4;29711:2;29700:9;29696:18;29688:26;;29760:9;29754:4;29750:20;29746:1;29735:9;29731:17;29724:47;29788:131;29914:4;29788:131;:::i;:::-;29780:139;;29507:419;;;:::o;29932:308::-;29994:4;30084:18;30076:6;30073:30;30070:56;;;30106:18;;:::i;:::-;30070:56;30144:29;30166:6;30144:29;:::i;:::-;30136:37;;30228:4;30222;30218:15;30210:23;;29932:308;;;:::o;30246:421::-;30335:5;30360:66;30376:49;30418:6;30376:49;:::i;:::-;30360:66;:::i;:::-;30351:75;;30449:6;30442:5;30435:21;30487:4;30480:5;30476:16;30525:3;30516:6;30511:3;30507:16;30504:25;30501:112;;;30532:79;;:::i;:::-;30501:112;30622:39;30654:6;30649:3;30644;30622:39;:::i;:::-;30341:326;30246:421;;;;;:::o;30687:355::-;30754:5;30803:3;30796:4;30788:6;30784:17;30780:27;30770:122;;30811:79;;:::i;:::-;30770:122;30921:6;30915:13;30946:90;31032:3;31024:6;31017:4;31009:6;31005:17;30946:90;:::i;:::-;30937:99;;30760:282;30687:355;;;;:::o;31048:524::-;31128:6;31177:2;31165:9;31156:7;31152:23;31148:32;31145:119;;;31183:79;;:::i;:::-;31145:119;31324:1;31313:9;31309:17;31303:24;31354:18;31346:6;31343:30;31340:117;;;31376:79;;:::i;:::-;31340:117;31481:74;31547:7;31538:6;31527:9;31523:22;31481:74;:::i;:::-;31471:84;;31274:291;31048:524;;;;:::o;31578:225::-;31718:34;31714:1;31706:6;31702:14;31695:58;31787:8;31782:2;31774:6;31770:15;31763:33;31578:225;:::o;31809:366::-;31951:3;31972:67;32036:2;32031:3;31972:67;:::i;:::-;31965:74;;32048:93;32137:3;32048:93;:::i;:::-;32166:2;32161:3;32157:12;32150:19;;31809:366;;;:::o;32181:419::-;32347:4;32385:2;32374:9;32370:18;32362:26;;32434:9;32428:4;32424:20;32420:1;32409:9;32405:17;32398:47;32462:131;32588:4;32462:131;:::i;:::-;32454:139;;32181:419;;;:::o;32606:231::-;32746:34;32742:1;32734:6;32730:14;32723:58;32815:14;32810:2;32802:6;32798:15;32791:39;32606:231;:::o;32843:366::-;32985:3;33006:67;33070:2;33065:3;33006:67;:::i;:::-;32999:74;;33082:93;33171:3;33082:93;:::i;:::-;33200:2;33195:3;33191:12;33184:19;;32843:366;;;:::o;33215:419::-;33381:4;33419:2;33408:9;33404:18;33396:26;;33468:9;33462:4;33458:20;33454:1;33443:9;33439:17;33432:47;33496:131;33622:4;33496:131;:::i;:::-;33488:139;;33215:419;;;:::o;33640:228::-;33780:34;33776:1;33768:6;33764:14;33757:58;33849:11;33844:2;33836:6;33832:15;33825:36;33640:228;:::o;33874:366::-;34016:3;34037:67;34101:2;34096:3;34037:67;:::i;:::-;34030:74;;34113:93;34202:3;34113:93;:::i;:::-;34231:2;34226:3;34222:12;34215:19;;33874:366;;;:::o;34246:419::-;34412:4;34450:2;34439:9;34435:18;34427:26;;34499:9;34493:4;34489:20;34485:1;34474:9;34470:17;34463:47;34527:131;34653:4;34527:131;:::i;:::-;34519:139;;34246:419;;;:::o;34671:223::-;34811:34;34807:1;34799:6;34795:14;34788:58;34880:6;34875:2;34867:6;34863:15;34856:31;34671:223;:::o;34900:366::-;35042:3;35063:67;35127:2;35122:3;35063:67;:::i;:::-;35056:74;;35139:93;35228:3;35139:93;:::i;:::-;35257:2;35252:3;35248:12;35241:19;;34900:366;;;:::o;35272:419::-;35438:4;35476:2;35465:9;35461:18;35453:26;;35525:9;35519:4;35515:20;35511:1;35500:9;35496:17;35489:47;35553:131;35679:4;35553:131;:::i;:::-;35545:139;;35272:419;;;:::o;35697:191::-;35737:4;35757:20;35775:1;35757:20;:::i;:::-;35752:25;;35791:20;35809:1;35791:20;:::i;:::-;35786:25;;35830:1;35827;35824:8;35821:34;;;35835:18;;:::i;:::-;35821:34;35880:1;35877;35873:9;35865:17;;35697:191;;;;:::o;35894:305::-;35934:3;35953:20;35971:1;35953:20;:::i;:::-;35948:25;;35987:20;36005:1;35987:20;:::i;:::-;35982:25;;36141:1;36073:66;36069:74;36066:1;36063:81;36060:107;;;36147:18;;:::i;:::-;36060:107;36191:1;36188;36184:9;36177:16;;35894:305;;;;:::o;36205:182::-;36345:34;36341:1;36333:6;36329:14;36322:58;36205:182;:::o;36393:366::-;36535:3;36556:67;36620:2;36615:3;36556:67;:::i;:::-;36549:74;;36632:93;36721:3;36632:93;:::i;:::-;36750:2;36745:3;36741:12;36734:19;;36393:366;;;:::o;36765:419::-;36931:4;36969:2;36958:9;36954:18;36946:26;;37018:9;37012:4;37008:20;37004:1;36993:9;36989:17;36982:47;37046:131;37172:4;37046:131;:::i;:::-;37038:139;;36765:419;;;:::o;37190:178::-;37330:30;37326:1;37318:6;37314:14;37307:54;37190:178;:::o;37374:366::-;37516:3;37537:67;37601:2;37596:3;37537:67;:::i;:::-;37530:74;;37613:93;37702:3;37613:93;:::i;:::-;37731:2;37726:3;37722:12;37715:19;;37374:366;;;:::o;37746:419::-;37912:4;37950:2;37939:9;37935:18;37927:26;;37999:9;37993:4;37989:20;37985:1;37974:9;37970:17;37963:47;38027:131;38153:4;38027:131;:::i;:::-;38019:139;;37746:419;;;:::o;38171:237::-;38311:34;38307:1;38299:6;38295:14;38288:58;38380:20;38375:2;38367:6;38363:15;38356:45;38171:237;:::o;38414:366::-;38556:3;38577:67;38641:2;38636:3;38577:67;:::i;:::-;38570:74;;38653:93;38742:3;38653:93;:::i;:::-;38771:2;38766:3;38762:12;38755:19;;38414:366;;;:::o;38786:419::-;38952:4;38990:2;38979:9;38975:18;38967:26;;39039:9;39033:4;39029:20;39025:1;39014:9;39010:17;39003:47;39067:131;39193:4;39067:131;:::i;:::-;39059:139;;38786:419;;;:::o;39211:98::-;39262:6;39296:5;39290:12;39280:22;;39211:98;;;:::o;39315:168::-;39398:11;39432:6;39427:3;39420:19;39472:4;39467:3;39463:14;39448:29;;39315:168;;;;:::o;39489:360::-;39575:3;39603:38;39635:5;39603:38;:::i;:::-;39657:70;39720:6;39715:3;39657:70;:::i;:::-;39650:77;;39736:52;39781:6;39776:3;39769:4;39762:5;39758:16;39736:52;:::i;:::-;39813:29;39835:6;39813:29;:::i;:::-;39808:3;39804:39;39797:46;;39579:270;39489:360;;;;:::o;39855:640::-;40050:4;40088:3;40077:9;40073:19;40065:27;;40102:71;40170:1;40159:9;40155:17;40146:6;40102:71;:::i;:::-;40183:72;40251:2;40240:9;40236:18;40227:6;40183:72;:::i;:::-;40265;40333:2;40322:9;40318:18;40309:6;40265:72;:::i;:::-;40384:9;40378:4;40374:20;40369:2;40358:9;40354:18;40347:48;40412:76;40483:4;40474:6;40412:76;:::i;:::-;40404:84;;39855:640;;;;;;;:::o;40501:141::-;40557:5;40588:6;40582:13;40573:22;;40604:32;40630:5;40604:32;:::i;:::-;40501:141;;;;:::o;40648:349::-;40717:6;40766:2;40754:9;40745:7;40741:23;40737:32;40734:119;;;40772:79;;:::i;:::-;40734:119;40892:1;40917:63;40972:7;40963:6;40952:9;40948:22;40917:63;:::i;:::-;40907:73;;40863:127;40648:349;;;;:::o
Swarm Source
ipfs://20df18358b5d1b0be9405d6be2cea674515713934440f2619d9a63c8aae3fa4a
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.