ERC-721
Overview
Max Total Supply
2,000 GEOM
Holders
474
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
2 GEOMLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
GeomesToken
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: UNLICENSED import '@openzeppelin/contracts/access/Ownable.sol'; import '@openzeppelin/contracts/utils/Strings.sol'; import '@openzeppelin/contracts/security/ReentrancyGuard.sol'; import '@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol'; pragma solidity ^0.8.0; contract GeomesToken is ERC721Enumerable, Ownable { uint256 public constant MAX = 2000; uint256 public constant price = 0.02 ether; mapping(uint256 => uint256) public creationDates; // will be set after the sale ends string public _generatorBaseURI; string private _metadataBaseURI; constructor() ERC721('Geomes', 'GEOM') { string memory chainIdSuffix = block.chainid == 1 ? '' : string(abi.encodePacked(Strings.toString(block.chainid), '/')); _metadataBaseURI = string( abi.encodePacked('https://codemakes.art/api/token/', chainIdSuffix) ); for (uint256 i = 1; i <= 20; i++) { creationDates[i] = block.number; _safeMint(msg.sender, i); } } function mint(uint256 count) public payable { require(totalSupply() < MAX, 'Sale has already ended'); require(count > 0 && count <= 20, 'Can mint 1..20'); require(totalSupply() + count <= MAX, 'Not enough left'); require(msg.value >= price * count, 'Not enough ether'); for (uint256 i = 0; i < count; i++) { uint256 mintIndex = totalSupply() + 1; creationDates[mintIndex] = block.number; _safeMint(msg.sender, mintIndex); } } function tokenHash(uint256 tokenId) public view returns (bytes32) { require(_exists(tokenId), 'nonexistent token'); return keccak256( abi.encodePacked(address(this), creationDates[tokenId], tokenId) ); } function tokenGeneratorURI(uint256 tokenId) public view returns (string memory) { require(_exists(tokenId), 'nonexistent token'); return string( abi.encodePacked( _generatorBaseURI, '?id=', Strings.toString(tokenId), '&hash=', Strings.toHexString(uint256(tokenHash(tokenId))) ) ); } function _baseURI() internal view virtual override returns (string memory) { return _metadataBaseURI; } function setGeneratorBaseURI(string memory uri) public onlyOwner { _generatorBaseURI = uri; } function setBaseURI(string memory baseURI) public onlyOwner { _metadataBaseURI = baseURI; } function withdrawAll() public payable onlyOwner { require(payable(msg.sender).send(address(this).balance)); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../utils/Context.sol"; /** * @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); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and make it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../ERC721.sol"; import "./IERC721Enumerable.sol"; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC721.sol"; import "./IERC721Receiver.sol"; import "./extensions/IERC721Metadata.sol"; import "../../utils/Address.sol"; import "../../utils/Context.sol"; import "../../utils/Strings.sol"; import "../../utils/introspection/ERC165.sol"; /** * @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.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 {} }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../../utils/introspection/IERC165.sol"; /** * @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; }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "../IERC721.sol"; /** * @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); }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @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); } } } }
// SPDX-License-Identifier: MIT pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @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; } }
// 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); }
{ "outputSelection": { "*": { "*": [ "evm.bytecode", "evm.deployedBytecode", "abi" ] } } }
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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_generatorBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"count","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","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":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setGeneratorBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenGeneratorURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b506040518060400160405280600681526020017f47656f6d657300000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f47454f4d0000000000000000000000000000000000000000000000000000000081525081600090805190602001906200009692919062000def565b508060019080519060200190620000af92919062000def565b505050620000d2620000c6620001bf60201b60201c565b620001c760201b60201c565b6000600146146200011a57620000f3466200028d60201b6200178b1760201c565b6040516020016200010591906200106c565b6040516020818303038152906040526200012b565b604051806020016040528060008152505b90508060405160200162000140919062001092565b604051602081830303815290604052600d90805190602001906200016692919062000def565b506000600190505b60148111620001b75743600b600083815260200190815260200160002081905550620001a133826200040760201b60201c565b8080620001ae906200137d565b9150506200016e565b50506200168f565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60606000821415620002d7576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905062000402565b600082905060005b600082146200030f578080620002f5906200137d565b915050600a8262000307919062001234565b9150620002df565b60008167ffffffffffffffff8111156200032e576200032d620014ee565b5b6040519080825280601f01601f191660200182016040528015620003615781602001600182028036833780820191505090505b5090505b60008514620003fb576001826200037d91906200126c565b9150600a856200038e9190620013cb565b60306200039c9190620011d7565b60f81b818381518110620003b557620003b4620014bf565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85620003f3919062001234565b945062000365565b8093505050505b919050565b620004298282604051806020016040528060008152506200042d60201b60201c565b5050565b6200043f83836200049b60201b60201c565b6200045460008484846200068160201b60201c565b62000496576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200048d906200110c565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200050e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005059062001172565b60405180910390fd5b6200051f816200083b60201b60201c565b1562000562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000559906200112e565b60405180910390fd5b6200057660008383620008a760201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620005c89190620011d7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006af8473ffffffffffffffffffffffffffffffffffffffff16620009ee60201b620018ec1760201c565b156200082e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006e1620001bf60201b60201c565b8786866040518563ffffffff1660e01b8152600401620007059493929190620010b8565b602060405180830381600087803b1580156200072057600080fd5b505af19250505080156200075457506040513d601f19601f8201168201806040525081019062000751919062000eb6565b60015b620007dd573d806000811462000787576040519150601f19603f3d011682016040523d82523d6000602084013e6200078c565b606091505b50600081511415620007d5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007cc906200110c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000833565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620008bf83838362000a0160201b620018ff1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156200090c57620009068162000a0660201b60201c565b62000954565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614620009535762000952838262000a4f60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620009a1576200099b8162000bcc60201b60201c565b620009e9565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620009e857620009e7828262000ca860201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000a698462000d3460201b62000e611760201c565b62000a7591906200126c565b905060006007600084815260200190815260200160002054905081811462000b5b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000be291906200126c565b905060006009600084815260200190815260200160002054905060006008838154811062000c155762000c14620014bf565b5b90600052602060002001549050806008838154811062000c3a5762000c39620014bf565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000c8c5762000c8b62001490565b5b6001900381819060005260206000200160009055905550505050565b600062000cc08362000d3460201b62000e611760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000da8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000d9f9062001150565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000dfd9062001347565b90600052602060002090601f01602090048101928262000e21576000855562000e6d565b82601f1062000e3c57805160ff191683800117855562000e6d565b8280016001018555821562000e6d579182015b8281111562000e6c57825182559160200191906001019062000e4f565b5b50905062000e7c919062000e80565b5090565b5b8082111562000e9b57600081600090555060010162000e81565b5090565b60008151905062000eb08162001675565b92915050565b60006020828403121562000ecf5762000ece6200151d565b5b600062000edf8482850162000e9f565b91505092915050565b62000ef381620012a7565b82525050565b600062000f068262001194565b62000f128185620011aa565b935062000f2481856020860162001311565b62000f2f8162001522565b840191505092915050565b600062000f47826200119f565b62000f538185620011cc565b935062000f6581856020860162001311565b80840191505092915050565b600062000f80603283620011bb565b915062000f8d8262001533565b604082019050919050565b600062000fa7601c83620011bb565b915062000fb48262001582565b602082019050919050565b600062000fce602a83620011bb565b915062000fdb82620015ab565b604082019050919050565b600062000ff5602083620011bb565b91506200100282620015fa565b602082019050919050565b60006200101c602083620011cc565b9150620010298262001623565b602082019050919050565b600062001043600183620011cc565b915062001050826200164c565b600182019050919050565b620010668162001307565b82525050565b60006200107a828462000f3a565b9150620010878262001034565b915081905092915050565b60006200109f826200100d565b9150620010ad828462000f3a565b915081905092915050565b6000608082019050620010cf600083018762000ee8565b620010de602083018662000ee8565b620010ed60408301856200105b565b818103606083015262001101818462000ef9565b905095945050505050565b60006020820190508181036000830152620011278162000f71565b9050919050565b60006020820190508181036000830152620011498162000f98565b9050919050565b600060208201905081810360008301526200116b8162000fbf565b9050919050565b600060208201905081810360008301526200118d8162000fe6565b9050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000620011e48262001307565b9150620011f18362001307565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562001229576200122862001403565b5b828201905092915050565b6000620012418262001307565b91506200124e8362001307565b92508262001261576200126062001432565b5b828204905092915050565b6000620012798262001307565b9150620012868362001307565b9250828210156200129c576200129b62001403565b5b828203905092915050565b6000620012b482620012e7565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200133157808201518184015260208101905062001314565b8381111562001341576000848401525b50505050565b600060028204905060018216806200136057607f821691505b6020821081141562001377576200137662001461565b5b50919050565b60006200138a8262001307565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620013c057620013bf62001403565b5b600182019050919050565b6000620013d88262001307565b9150620013e58362001307565b925082620013f857620013f762001432565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b6000601f19601f8301169050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f68747470733a2f2f636f64656d616b65732e6172742f6170692f746f6b656e2f600082015250565b7f2f00000000000000000000000000000000000000000000000000000000000000600082015250565b6200168081620012bb565b81146200168c57600080fd5b50565b614545806200169f6000396000f3fe6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063c8a0122611610064578063c8a012261461064a578063d49d518114610687578063e985e9c5146106b2578063f2fde38b146106ef576101c2565b8063a22cb4651461057e578063a3864397146105a7578063b88d4fde146105e4578063c87b56dd1461060d576101c2565b80638da5cb5b116100d15780638da5cb5b146104e157806395d89b411461050c578063a035b1fe14610537578063a0712d6814610562576101c2565b806370a0823114610483578063715018a6146104c0578063853828b6146104d7576101c2565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103b75780634f6ccce7146103e057806355f804b31461041d5780636352211e14610446576101c2565b806323b872dd146103145780632f745c591461033d57806337c885da1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630bbac4f21461029557806318160ddd146102be5780631d94f725146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612ed4565b610718565b6040516101fb91906135cd565b60405180910390f35b34801561021057600080fd5b50610219610792565b6040516102269190613603565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f77565b610824565b6040516102639190613566565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e94565b6108a9565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612f2e565b6109c1565b005b3480156102ca57600080fd5b506102d3610a57565b6040516102e09190613925565b60405180910390f35b3480156102f557600080fd5b506102fe610a64565b60405161030b9190613603565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612d7e565b610af2565b005b34801561034957600080fd5b50610364600480360381019061035f9190612e94565b610b52565b6040516103719190613925565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190612f77565b610bf7565b6040516103ae9190613603565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612d7e565b610c88565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612f77565b610ca8565b6040516104149190613925565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190612f2e565b610d19565b005b34801561045257600080fd5b5061046d60048036038101906104689190612f77565b610daf565b60405161047a9190613566565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612d11565b610e61565b6040516104b79190613925565b60405180910390f35b3480156104cc57600080fd5b506104d5610f19565b005b6104df610fa1565b005b3480156104ed57600080fd5b506104f661105d565b6040516105039190613566565b60405180910390f35b34801561051857600080fd5b50610521611087565b60405161052e9190613603565b60405180910390f35b34801561054357600080fd5b5061054c611119565b6040516105599190613925565b60405180910390f35b61057c60048036038101906105779190612f77565b611124565b005b34801561058a57600080fd5b506105a560048036038101906105a09190612e54565b6112c8565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612f77565b611449565b6040516105db91906135e8565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190612dd1565b6114d8565b005b34801561061957600080fd5b50610634600480360381019061062f9190612f77565b61153a565b6040516106419190613603565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612f77565b6115e1565b60405161067e9190613925565b60405180910390f35b34801561069357600080fd5b5061069c6115f9565b6040516106a99190613925565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612d3e565b6115ff565b6040516106e691906135cd565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190612d11565b611693565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b575061078a82611904565b5b9050919050565b6060600080546107a190613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546107cd90613c1e565b801561081a5780601f106107ef5761010080835404028352916020019161081a565b820191906000526020600020905b8154815290600101906020018083116107fd57829003601f168201915b5050505050905090565b600061082f826119e6565b61086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906137c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b482610daf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90613865565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610944611a52565b73ffffffffffffffffffffffffffffffffffffffff16148061097357506109728161096d611a52565b6115ff565b5b6109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990613745565b60405180910390fd5b6109bc8383611a5a565b505050565b6109c9611a52565b73ffffffffffffffffffffffffffffffffffffffff166109e761105d565b73ffffffffffffffffffffffffffffffffffffffff1614610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490613805565b60405180910390fd5b80600c9080519060200190610a53929190612b25565b5050565b6000600880549050905090565b600c8054610a7190613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613c1e565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b505050505081565b610b03610afd611a52565b82611b13565b610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906138a5565b60405180910390fd5b610b4d838383611bf1565b505050565b6000610b5d83610e61565b8210610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613665565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610c02826119e6565b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906137e5565b60405180910390fd5b600c610c4c8361178b565b610c60610c5885611449565b60001c611e4d565b604051602001610c729392919061351f565b6040516020818303038152906040529050919050565b610ca3838383604051806020016040528060008152506114d8565b505050565b6000610cb2610a57565b8210610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea906138e5565b60405180910390fd5b60088281548110610d0757610d06613de5565b5b90600052602060002001549050919050565b610d21611a52565b73ffffffffffffffffffffffffffffffffffffffff16610d3f61105d565b73ffffffffffffffffffffffffffffffffffffffff1614610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90613805565b60405180910390fd5b80600d9080519060200190610dab929190612b25565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90613785565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613765565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f21611a52565b73ffffffffffffffffffffffffffffffffffffffff16610f3f61105d565b73ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613805565b60405180910390fd5b610f9f6000611ed3565b565b610fa9611a52565b73ffffffffffffffffffffffffffffffffffffffff16610fc761105d565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490613805565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061105b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109690613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546110c290613c1e565b801561110f5780601f106110e45761010080835404028352916020019161110f565b820191906000526020600020905b8154815290600101906020018083116110f257829003601f168201915b5050505050905090565b66470de4df82000081565b6107d061112f610a57565b1061116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690613885565b60405180910390fd5b600081118015611180575060148111155b6111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690613905565b60405180910390fd5b6107d0816111cb610a57565b6111d59190613a1f565b1115611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906138c5565b60405180910390fd5b8066470de4df8200006112299190613aa6565b34101561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290613645565b60405180910390fd5b60005b818110156112c45760006001611282610a57565b61128c9190613a1f565b905043600b6000838152602001908152602001600020819055506112b03382611f99565b5080806112bc90613c81565b91505061126e565b5050565b6112d0611a52565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590613705565b60405180910390fd5b806005600061134b611a52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113f8611a52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161143d91906135cd565b60405180910390a35050565b6000611454826119e6565b611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a906137e5565b60405180910390fd5b30600b600084815260200190815260200160002054836040516020016114bb939291906134be565b604051602081830303815290604052805190602001209050919050565b6114e96114e3611a52565b83611b13565b611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f906138a5565b60405180910390fd5b61153484848484611fb7565b50505050565b6060611545826119e6565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90613845565b60405180910390fd5b600061158e612013565b905060008151116115ae57604051806020016040528060008152506115d9565b806115b88461178b565b6040516020016115c99291906134fb565b6040516020818303038152906040525b915050919050565b600b6020528060005260406000206000915090505481565b6107d081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61169b611a52565b73ffffffffffffffffffffffffffffffffffffffff166116b961105d565b73ffffffffffffffffffffffffffffffffffffffff161461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613805565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906136a5565b60405180910390fd5b61178881611ed3565b50565b606060008214156117d3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118e7565b600082905060005b600082146118055780806117ee90613c81565b915050600a826117fe9190613a75565b91506117db565b60008167ffffffffffffffff81111561182157611820613e14565b5b6040519080825280601f01601f1916602001820160405280156118535781602001600182028036833780820191505090505b5090505b600085146118e05760018261186c9190613b00565b9150600a8561187b9190613cf8565b60306118879190613a1f565b60f81b81838151811061189d5761189c613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118d99190613a75565b9450611857565b8093505050505b919050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119cf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119df57506119de826120a5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611acd83610daf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1e826119e6565b611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490613725565b60405180910390fd5b6000611b6883610daf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bd757508373ffffffffffffffffffffffffffffffffffffffff16611bbf84610824565b73ffffffffffffffffffffffffffffffffffffffff16145b80611be85750611be781856115ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c1182610daf565b73ffffffffffffffffffffffffffffffffffffffff1614611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90613825565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce906136e5565b60405180910390fd5b611ce283838361210f565b611ced600082611a5a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3d9190613b00565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d949190613a1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000821415611e95576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050611ece565b600082905060005b60008214611ebf578080611eb090613c81565b915050600882901c9150611e9d565b611ec98482612223565b925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb382826040518060200160405280600081525061245f565b5050565b611fc2848484611bf1565b611fce848484846124ba565b61200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613685565b60405180910390fd5b50505050565b6060600d805461202290613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461204e90613c1e565b801561209b5780601f106120705761010080835404028352916020019161209b565b820191906000526020600020905b81548152906001019060200180831161207e57829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211a8383836118ff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561215d5761215881612651565b61219c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219b5761219a838261269a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121df576121da81612807565b61221e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221d5761221c82826128d8565b5b5b505050565b6060600060028360026122369190613aa6565b6122409190613a1f565b67ffffffffffffffff81111561225957612258613e14565b5b6040519080825280601f01601f19166020018201604052801561228b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106122c3576122c2613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061232757612326613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026123679190613aa6565b6123719190613a1f565b90505b6001811115612411577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123b3576123b2613de5565b5b1a60f81b8282815181106123ca576123c9613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061240a90613bf4565b9050612374565b5060008414612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90613625565b60405180910390fd5b8091505092915050565b6124698383612957565b61247660008484846124ba565b6124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac90613685565b60405180910390fd5b505050565b60006124db8473ffffffffffffffffffffffffffffffffffffffff166118ec565b15612644578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612504611a52565b8786866040518563ffffffff1660e01b81526004016125269493929190613581565b602060405180830381600087803b15801561254057600080fd5b505af192505050801561257157506040513d601f19601f8201168201806040525081019061256e9190612f01565b60015b6125f4573d80600081146125a1576040519150601f19603f3d011682016040523d82523d6000602084013e6125a6565b606091505b506000815114156125ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e390613685565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612649565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126a784610e61565b6126b19190613b00565b9050600060076000848152602001908152602001600020549050818114612796576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061281b9190613b00565b905060006009600084815260200190815260200160002054905060006008838154811061284b5761284a613de5565b5b90600052602060002001549050806008838154811061286d5761286c613de5565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128bc576128bb613db6565b5b6001900381819060005260206000200160009055905550505050565b60006128e383610e61565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129be906137a5565b60405180910390fd5b6129d0816119e6565b15612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906136c5565b60405180910390fd5b612a1c6000838361210f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a6c9190613a1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b3190613c1e565b90600052602060002090601f016020900481019282612b535760008555612b9a565b82601f10612b6c57805160ff1916838001178555612b9a565b82800160010185558215612b9a579182015b82811115612b99578251825591602001919060010190612b7e565b5b509050612ba79190612bab565b5090565b5b80821115612bc4576000816000905550600101612bac565b5090565b6000612bdb612bd684613965565b613940565b905082815260208101848484011115612bf757612bf6613e48565b5b612c02848285613bb2565b509392505050565b6000612c1d612c1884613996565b613940565b905082815260208101848484011115612c3957612c38613e48565b5b612c44848285613bb2565b509392505050565b600081359050612c5b816144b3565b92915050565b600081359050612c70816144ca565b92915050565b600081359050612c85816144e1565b92915050565b600081519050612c9a816144e1565b92915050565b600082601f830112612cb557612cb4613e43565b5b8135612cc5848260208601612bc8565b91505092915050565b600082601f830112612ce357612ce2613e43565b5b8135612cf3848260208601612c0a565b91505092915050565b600081359050612d0b816144f8565b92915050565b600060208284031215612d2757612d26613e52565b5b6000612d3584828501612c4c565b91505092915050565b60008060408385031215612d5557612d54613e52565b5b6000612d6385828601612c4c565b9250506020612d7485828601612c4c565b9150509250929050565b600080600060608486031215612d9757612d96613e52565b5b6000612da586828701612c4c565b9350506020612db686828701612c4c565b9250506040612dc786828701612cfc565b9150509250925092565b60008060008060808587031215612deb57612dea613e52565b5b6000612df987828801612c4c565b9450506020612e0a87828801612c4c565b9350506040612e1b87828801612cfc565b925050606085013567ffffffffffffffff811115612e3c57612e3b613e4d565b5b612e4887828801612ca0565b91505092959194509250565b60008060408385031215612e6b57612e6a613e52565b5b6000612e7985828601612c4c565b9250506020612e8a85828601612c61565b9150509250929050565b60008060408385031215612eab57612eaa613e52565b5b6000612eb985828601612c4c565b9250506020612eca85828601612cfc565b9150509250929050565b600060208284031215612eea57612ee9613e52565b5b6000612ef884828501612c76565b91505092915050565b600060208284031215612f1757612f16613e52565b5b6000612f2584828501612c8b565b91505092915050565b600060208284031215612f4457612f43613e52565b5b600082013567ffffffffffffffff811115612f6257612f61613e4d565b5b612f6e84828501612cce565b91505092915050565b600060208284031215612f8d57612f8c613e52565b5b6000612f9b84828501612cfc565b91505092915050565b612fad81613b34565b82525050565b612fc4612fbf82613b34565b613cca565b82525050565b612fd381613b46565b82525050565b612fe281613b52565b82525050565b6000612ff3826139dc565b612ffd81856139f2565b935061300d818560208601613bc1565b61301681613e57565b840191505092915050565b600061302c826139e7565b6130368185613a03565b9350613046818560208601613bc1565b61304f81613e57565b840191505092915050565b6000613065826139e7565b61306f8185613a14565b935061307f818560208601613bc1565b80840191505092915050565b6000815461309881613c1e565b6130a28186613a14565b945060018216600081146130bd57600181146130ce57613101565b60ff19831686528186019350613101565b6130d7856139c7565b60005b838110156130f9578154818901526001820191506020810190506130da565b838801955050505b50505092915050565b6000613117602083613a03565b915061312282613e75565b602082019050919050565b600061313a601083613a03565b915061314582613e9e565b602082019050919050565b600061315d602b83613a03565b915061316882613ec7565b604082019050919050565b6000613180603283613a03565b915061318b82613f16565b604082019050919050565b60006131a3602683613a03565b91506131ae82613f65565b604082019050919050565b60006131c6601c83613a03565b91506131d182613fb4565b602082019050919050565b60006131e9602483613a03565b91506131f482613fdd565b604082019050919050565b600061320c601983613a03565b91506132178261402c565b602082019050919050565b600061322f602c83613a03565b915061323a82614055565b604082019050919050565b6000613252603883613a03565b915061325d826140a4565b604082019050919050565b6000613275602a83613a03565b9150613280826140f3565b604082019050919050565b6000613298602983613a03565b91506132a382614142565b604082019050919050565b60006132bb600483613a14565b91506132c682614191565b600482019050919050565b60006132de602083613a03565b91506132e9826141ba565b602082019050919050565b6000613301602c83613a03565b915061330c826141e3565b604082019050919050565b6000613324601183613a03565b915061332f82614232565b602082019050919050565b6000613347602083613a03565b91506133528261425b565b602082019050919050565b600061336a602983613a03565b915061337582614284565b604082019050919050565b600061338d602f83613a03565b9150613398826142d3565b604082019050919050565b60006133b0600683613a14565b91506133bb82614322565b600682019050919050565b60006133d3602183613a03565b91506133de8261434b565b604082019050919050565b60006133f6601683613a03565b91506134018261439a565b602082019050919050565b6000613419603183613a03565b9150613424826143c3565b604082019050919050565b600061343c600f83613a03565b915061344782614412565b602082019050919050565b600061345f602c83613a03565b915061346a8261443b565b604082019050919050565b6000613482600e83613a03565b915061348d8261448a565b602082019050919050565b6134a181613ba8565b82525050565b6134b86134b382613ba8565b613cee565b82525050565b60006134ca8286612fb3565b6014820191506134da82856134a7565b6020820191506134ea82846134a7565b602082019150819050949350505050565b6000613507828561305a565b9150613513828461305a565b91508190509392505050565b600061352b828661308b565b9150613536826132ae565b9150613542828561305a565b915061354d826133a3565b9150613559828461305a565b9150819050949350505050565b600060208201905061357b6000830184612fa4565b92915050565b60006080820190506135966000830187612fa4565b6135a36020830186612fa4565b6135b06040830185613498565b81810360608301526135c28184612fe8565b905095945050505050565b60006020820190506135e26000830184612fca565b92915050565b60006020820190506135fd6000830184612fd9565b92915050565b6000602082019050818103600083015261361d8184613021565b905092915050565b6000602082019050818103600083015261363e8161310a565b9050919050565b6000602082019050818103600083015261365e8161312d565b9050919050565b6000602082019050818103600083015261367e81613150565b9050919050565b6000602082019050818103600083015261369e81613173565b9050919050565b600060208201905081810360008301526136be81613196565b9050919050565b600060208201905081810360008301526136de816131b9565b9050919050565b600060208201905081810360008301526136fe816131dc565b9050919050565b6000602082019050818103600083015261371e816131ff565b9050919050565b6000602082019050818103600083015261373e81613222565b9050919050565b6000602082019050818103600083015261375e81613245565b9050919050565b6000602082019050818103600083015261377e81613268565b9050919050565b6000602082019050818103600083015261379e8161328b565b9050919050565b600060208201905081810360008301526137be816132d1565b9050919050565b600060208201905081810360008301526137de816132f4565b9050919050565b600060208201905081810360008301526137fe81613317565b9050919050565b6000602082019050818103600083015261381e8161333a565b9050919050565b6000602082019050818103600083015261383e8161335d565b9050919050565b6000602082019050818103600083015261385e81613380565b9050919050565b6000602082019050818103600083015261387e816133c6565b9050919050565b6000602082019050818103600083015261389e816133e9565b9050919050565b600060208201905081810360008301526138be8161340c565b9050919050565b600060208201905081810360008301526138de8161342f565b9050919050565b600060208201905081810360008301526138fe81613452565b9050919050565b6000602082019050818103600083015261391e81613475565b9050919050565b600060208201905061393a6000830184613498565b92915050565b600061394a61395b565b90506139568282613c50565b919050565b6000604051905090565b600067ffffffffffffffff8211156139805761397f613e14565b5b61398982613e57565b9050602081019050919050565b600067ffffffffffffffff8211156139b1576139b0613e14565b5b6139ba82613e57565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a2a82613ba8565b9150613a3583613ba8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a6a57613a69613d29565b5b828201905092915050565b6000613a8082613ba8565b9150613a8b83613ba8565b925082613a9b57613a9a613d58565b5b828204905092915050565b6000613ab182613ba8565b9150613abc83613ba8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613af557613af4613d29565b5b828202905092915050565b6000613b0b82613ba8565b9150613b1683613ba8565b925082821015613b2957613b28613d29565b5b828203905092915050565b6000613b3f82613b88565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bdf578082015181840152602081019050613bc4565b83811115613bee576000848401525b50505050565b6000613bff82613ba8565b91506000821415613c1357613c12613d29565b5b600182039050919050565b60006002820490506001821680613c3657607f821691505b60208210811415613c4a57613c49613d87565b5b50919050565b613c5982613e57565b810181811067ffffffffffffffff82111715613c7857613c77613e14565b5b80604052505050565b6000613c8c82613ba8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cbf57613cbe613d29565b5b600182019050919050565b6000613cd582613cdc565b9050919050565b6000613ce782613e68565b9050919050565b6000819050919050565b6000613d0382613ba8565b9150613d0e83613ba8565b925082613d1e57613d1d613d58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f3f69643d00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f26686173683d0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206c6566740000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e206d696e7420312e2e3230000000000000000000000000000000000000600082015250565b6144bc81613b34565b81146144c757600080fd5b50565b6144d381613b46565b81146144de57600080fd5b50565b6144ea81613b5c565b81146144f557600080fd5b50565b61450181613ba8565b811461450c57600080fd5b5056fea26469706673582212203330d1a02d27d7f1c677defa0f3053a9c1ae7338a515882bee56daf1975867a964736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101c25760003560e01c806370a08231116100f7578063a22cb46511610095578063c8a0122611610064578063c8a012261461064a578063d49d518114610687578063e985e9c5146106b2578063f2fde38b146106ef576101c2565b8063a22cb4651461057e578063a3864397146105a7578063b88d4fde146105e4578063c87b56dd1461060d576101c2565b80638da5cb5b116100d15780638da5cb5b146104e157806395d89b411461050c578063a035b1fe14610537578063a0712d6814610562576101c2565b806370a0823114610483578063715018a6146104c0578063853828b6146104d7576101c2565b806323b872dd1161016457806342842e0e1161013e57806342842e0e146103b75780634f6ccce7146103e057806355f804b31461041d5780636352211e14610446576101c2565b806323b872dd146103145780632f745c591461033d57806337c885da1461037a576101c2565b8063095ea7b3116101a0578063095ea7b31461026c5780630bbac4f21461029557806318160ddd146102be5780631d94f725146102e9576101c2565b806301ffc9a7146101c757806306fdde0314610204578063081812fc1461022f575b600080fd5b3480156101d357600080fd5b506101ee60048036038101906101e99190612ed4565b610718565b6040516101fb91906135cd565b60405180910390f35b34801561021057600080fd5b50610219610792565b6040516102269190613603565b60405180910390f35b34801561023b57600080fd5b5061025660048036038101906102519190612f77565b610824565b6040516102639190613566565b60405180910390f35b34801561027857600080fd5b50610293600480360381019061028e9190612e94565b6108a9565b005b3480156102a157600080fd5b506102bc60048036038101906102b79190612f2e565b6109c1565b005b3480156102ca57600080fd5b506102d3610a57565b6040516102e09190613925565b60405180910390f35b3480156102f557600080fd5b506102fe610a64565b60405161030b9190613603565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190612d7e565b610af2565b005b34801561034957600080fd5b50610364600480360381019061035f9190612e94565b610b52565b6040516103719190613925565b60405180910390f35b34801561038657600080fd5b506103a1600480360381019061039c9190612f77565b610bf7565b6040516103ae9190613603565b60405180910390f35b3480156103c357600080fd5b506103de60048036038101906103d99190612d7e565b610c88565b005b3480156103ec57600080fd5b5061040760048036038101906104029190612f77565b610ca8565b6040516104149190613925565b60405180910390f35b34801561042957600080fd5b50610444600480360381019061043f9190612f2e565b610d19565b005b34801561045257600080fd5b5061046d60048036038101906104689190612f77565b610daf565b60405161047a9190613566565b60405180910390f35b34801561048f57600080fd5b506104aa60048036038101906104a59190612d11565b610e61565b6040516104b79190613925565b60405180910390f35b3480156104cc57600080fd5b506104d5610f19565b005b6104df610fa1565b005b3480156104ed57600080fd5b506104f661105d565b6040516105039190613566565b60405180910390f35b34801561051857600080fd5b50610521611087565b60405161052e9190613603565b60405180910390f35b34801561054357600080fd5b5061054c611119565b6040516105599190613925565b60405180910390f35b61057c60048036038101906105779190612f77565b611124565b005b34801561058a57600080fd5b506105a560048036038101906105a09190612e54565b6112c8565b005b3480156105b357600080fd5b506105ce60048036038101906105c99190612f77565b611449565b6040516105db91906135e8565b60405180910390f35b3480156105f057600080fd5b5061060b60048036038101906106069190612dd1565b6114d8565b005b34801561061957600080fd5b50610634600480360381019061062f9190612f77565b61153a565b6040516106419190613603565b60405180910390f35b34801561065657600080fd5b50610671600480360381019061066c9190612f77565b6115e1565b60405161067e9190613925565b60405180910390f35b34801561069357600080fd5b5061069c6115f9565b6040516106a99190613925565b60405180910390f35b3480156106be57600080fd5b506106d960048036038101906106d49190612d3e565b6115ff565b6040516106e691906135cd565b60405180910390f35b3480156106fb57600080fd5b5061071660048036038101906107119190612d11565b611693565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061078b575061078a82611904565b5b9050919050565b6060600080546107a190613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546107cd90613c1e565b801561081a5780601f106107ef5761010080835404028352916020019161081a565b820191906000526020600020905b8154815290600101906020018083116107fd57829003601f168201915b5050505050905090565b600061082f826119e6565b61086e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610865906137c5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108b482610daf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610925576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091c90613865565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610944611a52565b73ffffffffffffffffffffffffffffffffffffffff16148061097357506109728161096d611a52565b6115ff565b5b6109b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a990613745565b60405180910390fd5b6109bc8383611a5a565b505050565b6109c9611a52565b73ffffffffffffffffffffffffffffffffffffffff166109e761105d565b73ffffffffffffffffffffffffffffffffffffffff1614610a3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3490613805565b60405180910390fd5b80600c9080519060200190610a53929190612b25565b5050565b6000600880549050905090565b600c8054610a7190613c1e565b80601f0160208091040260200160405190810160405280929190818152602001828054610a9d90613c1e565b8015610aea5780601f10610abf57610100808354040283529160200191610aea565b820191906000526020600020905b815481529060010190602001808311610acd57829003601f168201915b505050505081565b610b03610afd611a52565b82611b13565b610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b39906138a5565b60405180910390fd5b610b4d838383611bf1565b505050565b6000610b5d83610e61565b8210610b9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9590613665565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610c02826119e6565b610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c38906137e5565b60405180910390fd5b600c610c4c8361178b565b610c60610c5885611449565b60001c611e4d565b604051602001610c729392919061351f565b6040516020818303038152906040529050919050565b610ca3838383604051806020016040528060008152506114d8565b505050565b6000610cb2610a57565b8210610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea906138e5565b60405180910390fd5b60088281548110610d0757610d06613de5565b5b90600052602060002001549050919050565b610d21611a52565b73ffffffffffffffffffffffffffffffffffffffff16610d3f61105d565b73ffffffffffffffffffffffffffffffffffffffff1614610d95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8c90613805565b60405180910390fd5b80600d9080519060200190610dab929190612b25565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4f90613785565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ed2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec990613765565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f21611a52565b73ffffffffffffffffffffffffffffffffffffffff16610f3f61105d565b73ffffffffffffffffffffffffffffffffffffffff1614610f95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8c90613805565b60405180910390fd5b610f9f6000611ed3565b565b610fa9611a52565b73ffffffffffffffffffffffffffffffffffffffff16610fc761105d565b73ffffffffffffffffffffffffffffffffffffffff161461101d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101490613805565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061105b57600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461109690613c1e565b80601f01602080910402602001604051908101604052809291908181526020018280546110c290613c1e565b801561110f5780601f106110e45761010080835404028352916020019161110f565b820191906000526020600020905b8154815290600101906020018083116110f257829003601f168201915b5050505050905090565b66470de4df82000081565b6107d061112f610a57565b1061116f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116690613885565b60405180910390fd5b600081118015611180575060148111155b6111bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b690613905565b60405180910390fd5b6107d0816111cb610a57565b6111d59190613a1f565b1115611216576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120d906138c5565b60405180910390fd5b8066470de4df8200006112299190613aa6565b34101561126b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126290613645565b60405180910390fd5b60005b818110156112c45760006001611282610a57565b61128c9190613a1f565b905043600b6000838152602001908152602001600020819055506112b03382611f99565b5080806112bc90613c81565b91505061126e565b5050565b6112d0611a52565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133590613705565b60405180910390fd5b806005600061134b611a52565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113f8611a52565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161143d91906135cd565b60405180910390a35050565b6000611454826119e6565b611493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161148a906137e5565b60405180910390fd5b30600b600084815260200190815260200160002054836040516020016114bb939291906134be565b604051602081830303815290604052805190602001209050919050565b6114e96114e3611a52565b83611b13565b611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f906138a5565b60405180910390fd5b61153484848484611fb7565b50505050565b6060611545826119e6565b611584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161157b90613845565b60405180910390fd5b600061158e612013565b905060008151116115ae57604051806020016040528060008152506115d9565b806115b88461178b565b6040516020016115c99291906134fb565b6040516020818303038152906040525b915050919050565b600b6020528060005260406000206000915090505481565b6107d081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61169b611a52565b73ffffffffffffffffffffffffffffffffffffffff166116b961105d565b73ffffffffffffffffffffffffffffffffffffffff161461170f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170690613805565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561177f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611776906136a5565b60405180910390fd5b61178881611ed3565b50565b606060008214156117d3576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506118e7565b600082905060005b600082146118055780806117ee90613c81565b915050600a826117fe9190613a75565b91506117db565b60008167ffffffffffffffff81111561182157611820613e14565b5b6040519080825280601f01601f1916602001820160405280156118535781602001600182028036833780820191505090505b5090505b600085146118e05760018261186c9190613b00565b9150600a8561187b9190613cf8565b60306118879190613a1f565b60f81b81838151811061189d5761189c613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856118d99190613a75565b9450611857565b8093505050505b919050565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119cf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806119df57506119de826120a5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611acd83610daf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b1e826119e6565b611b5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5490613725565b60405180910390fd5b6000611b6883610daf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611bd757508373ffffffffffffffffffffffffffffffffffffffff16611bbf84610824565b73ffffffffffffffffffffffffffffffffffffffff16145b80611be85750611be781856115ff565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c1182610daf565b73ffffffffffffffffffffffffffffffffffffffff1614611c67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c5e90613825565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cce906136e5565b60405180910390fd5b611ce283838361210f565b611ced600082611a5a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d3d9190613b00565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d949190613a1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60606000821415611e95576040518060400160405280600481526020017f30783030000000000000000000000000000000000000000000000000000000008152509050611ece565b600082905060005b60008214611ebf578080611eb090613c81565b915050600882901c9150611e9d565b611ec98482612223565b925050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fb382826040518060200160405280600081525061245f565b5050565b611fc2848484611bf1565b611fce848484846124ba565b61200d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161200490613685565b60405180910390fd5b50505050565b6060600d805461202290613c1e565b80601f016020809104026020016040519081016040528092919081815260200182805461204e90613c1e565b801561209b5780601f106120705761010080835404028352916020019161209b565b820191906000526020600020905b81548152906001019060200180831161207e57829003601f168201915b5050505050905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211a8383836118ff565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561215d5761215881612651565b61219c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461219b5761219a838261269a565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121df576121da81612807565b61221e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461221d5761221c82826128d8565b5b5b505050565b6060600060028360026122369190613aa6565b6122409190613a1f565b67ffffffffffffffff81111561225957612258613e14565b5b6040519080825280601f01601f19166020018201604052801561228b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106122c3576122c2613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061232757612326613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026123679190613aa6565b6123719190613a1f565b90505b6001811115612411577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106123b3576123b2613de5565b5b1a60f81b8282815181106123ca576123c9613de5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061240a90613bf4565b9050612374565b5060008414612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161244c90613625565b60405180910390fd5b8091505092915050565b6124698383612957565b61247660008484846124ba565b6124b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124ac90613685565b60405180910390fd5b505050565b60006124db8473ffffffffffffffffffffffffffffffffffffffff166118ec565b15612644578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612504611a52565b8786866040518563ffffffff1660e01b81526004016125269493929190613581565b602060405180830381600087803b15801561254057600080fd5b505af192505050801561257157506040513d601f19601f8201168201806040525081019061256e9190612f01565b60015b6125f4573d80600081146125a1576040519150601f19603f3d011682016040523d82523d6000602084013e6125a6565b606091505b506000815114156125ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125e390613685565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612649565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016126a784610e61565b6126b19190613b00565b9050600060076000848152602001908152602001600020549050818114612796576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061281b9190613b00565b905060006009600084815260200190815260200160002054905060006008838154811061284b5761284a613de5565b5b90600052602060002001549050806008838154811061286d5761286c613de5565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806128bc576128bb613db6565b5b6001900381819060005260206000200160009055905550505050565b60006128e383610e61565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156129c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129be906137a5565b60405180910390fd5b6129d0816119e6565b15612a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a07906136c5565b60405180910390fd5b612a1c6000838361210f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a6c9190613a1f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612b3190613c1e565b90600052602060002090601f016020900481019282612b535760008555612b9a565b82601f10612b6c57805160ff1916838001178555612b9a565b82800160010185558215612b9a579182015b82811115612b99578251825591602001919060010190612b7e565b5b509050612ba79190612bab565b5090565b5b80821115612bc4576000816000905550600101612bac565b5090565b6000612bdb612bd684613965565b613940565b905082815260208101848484011115612bf757612bf6613e48565b5b612c02848285613bb2565b509392505050565b6000612c1d612c1884613996565b613940565b905082815260208101848484011115612c3957612c38613e48565b5b612c44848285613bb2565b509392505050565b600081359050612c5b816144b3565b92915050565b600081359050612c70816144ca565b92915050565b600081359050612c85816144e1565b92915050565b600081519050612c9a816144e1565b92915050565b600082601f830112612cb557612cb4613e43565b5b8135612cc5848260208601612bc8565b91505092915050565b600082601f830112612ce357612ce2613e43565b5b8135612cf3848260208601612c0a565b91505092915050565b600081359050612d0b816144f8565b92915050565b600060208284031215612d2757612d26613e52565b5b6000612d3584828501612c4c565b91505092915050565b60008060408385031215612d5557612d54613e52565b5b6000612d6385828601612c4c565b9250506020612d7485828601612c4c565b9150509250929050565b600080600060608486031215612d9757612d96613e52565b5b6000612da586828701612c4c565b9350506020612db686828701612c4c565b9250506040612dc786828701612cfc565b9150509250925092565b60008060008060808587031215612deb57612dea613e52565b5b6000612df987828801612c4c565b9450506020612e0a87828801612c4c565b9350506040612e1b87828801612cfc565b925050606085013567ffffffffffffffff811115612e3c57612e3b613e4d565b5b612e4887828801612ca0565b91505092959194509250565b60008060408385031215612e6b57612e6a613e52565b5b6000612e7985828601612c4c565b9250506020612e8a85828601612c61565b9150509250929050565b60008060408385031215612eab57612eaa613e52565b5b6000612eb985828601612c4c565b9250506020612eca85828601612cfc565b9150509250929050565b600060208284031215612eea57612ee9613e52565b5b6000612ef884828501612c76565b91505092915050565b600060208284031215612f1757612f16613e52565b5b6000612f2584828501612c8b565b91505092915050565b600060208284031215612f4457612f43613e52565b5b600082013567ffffffffffffffff811115612f6257612f61613e4d565b5b612f6e84828501612cce565b91505092915050565b600060208284031215612f8d57612f8c613e52565b5b6000612f9b84828501612cfc565b91505092915050565b612fad81613b34565b82525050565b612fc4612fbf82613b34565b613cca565b82525050565b612fd381613b46565b82525050565b612fe281613b52565b82525050565b6000612ff3826139dc565b612ffd81856139f2565b935061300d818560208601613bc1565b61301681613e57565b840191505092915050565b600061302c826139e7565b6130368185613a03565b9350613046818560208601613bc1565b61304f81613e57565b840191505092915050565b6000613065826139e7565b61306f8185613a14565b935061307f818560208601613bc1565b80840191505092915050565b6000815461309881613c1e565b6130a28186613a14565b945060018216600081146130bd57600181146130ce57613101565b60ff19831686528186019350613101565b6130d7856139c7565b60005b838110156130f9578154818901526001820191506020810190506130da565b838801955050505b50505092915050565b6000613117602083613a03565b915061312282613e75565b602082019050919050565b600061313a601083613a03565b915061314582613e9e565b602082019050919050565b600061315d602b83613a03565b915061316882613ec7565b604082019050919050565b6000613180603283613a03565b915061318b82613f16565b604082019050919050565b60006131a3602683613a03565b91506131ae82613f65565b604082019050919050565b60006131c6601c83613a03565b91506131d182613fb4565b602082019050919050565b60006131e9602483613a03565b91506131f482613fdd565b604082019050919050565b600061320c601983613a03565b91506132178261402c565b602082019050919050565b600061322f602c83613a03565b915061323a82614055565b604082019050919050565b6000613252603883613a03565b915061325d826140a4565b604082019050919050565b6000613275602a83613a03565b9150613280826140f3565b604082019050919050565b6000613298602983613a03565b91506132a382614142565b604082019050919050565b60006132bb600483613a14565b91506132c682614191565b600482019050919050565b60006132de602083613a03565b91506132e9826141ba565b602082019050919050565b6000613301602c83613a03565b915061330c826141e3565b604082019050919050565b6000613324601183613a03565b915061332f82614232565b602082019050919050565b6000613347602083613a03565b91506133528261425b565b602082019050919050565b600061336a602983613a03565b915061337582614284565b604082019050919050565b600061338d602f83613a03565b9150613398826142d3565b604082019050919050565b60006133b0600683613a14565b91506133bb82614322565b600682019050919050565b60006133d3602183613a03565b91506133de8261434b565b604082019050919050565b60006133f6601683613a03565b91506134018261439a565b602082019050919050565b6000613419603183613a03565b9150613424826143c3565b604082019050919050565b600061343c600f83613a03565b915061344782614412565b602082019050919050565b600061345f602c83613a03565b915061346a8261443b565b604082019050919050565b6000613482600e83613a03565b915061348d8261448a565b602082019050919050565b6134a181613ba8565b82525050565b6134b86134b382613ba8565b613cee565b82525050565b60006134ca8286612fb3565b6014820191506134da82856134a7565b6020820191506134ea82846134a7565b602082019150819050949350505050565b6000613507828561305a565b9150613513828461305a565b91508190509392505050565b600061352b828661308b565b9150613536826132ae565b9150613542828561305a565b915061354d826133a3565b9150613559828461305a565b9150819050949350505050565b600060208201905061357b6000830184612fa4565b92915050565b60006080820190506135966000830187612fa4565b6135a36020830186612fa4565b6135b06040830185613498565b81810360608301526135c28184612fe8565b905095945050505050565b60006020820190506135e26000830184612fca565b92915050565b60006020820190506135fd6000830184612fd9565b92915050565b6000602082019050818103600083015261361d8184613021565b905092915050565b6000602082019050818103600083015261363e8161310a565b9050919050565b6000602082019050818103600083015261365e8161312d565b9050919050565b6000602082019050818103600083015261367e81613150565b9050919050565b6000602082019050818103600083015261369e81613173565b9050919050565b600060208201905081810360008301526136be81613196565b9050919050565b600060208201905081810360008301526136de816131b9565b9050919050565b600060208201905081810360008301526136fe816131dc565b9050919050565b6000602082019050818103600083015261371e816131ff565b9050919050565b6000602082019050818103600083015261373e81613222565b9050919050565b6000602082019050818103600083015261375e81613245565b9050919050565b6000602082019050818103600083015261377e81613268565b9050919050565b6000602082019050818103600083015261379e8161328b565b9050919050565b600060208201905081810360008301526137be816132d1565b9050919050565b600060208201905081810360008301526137de816132f4565b9050919050565b600060208201905081810360008301526137fe81613317565b9050919050565b6000602082019050818103600083015261381e8161333a565b9050919050565b6000602082019050818103600083015261383e8161335d565b9050919050565b6000602082019050818103600083015261385e81613380565b9050919050565b6000602082019050818103600083015261387e816133c6565b9050919050565b6000602082019050818103600083015261389e816133e9565b9050919050565b600060208201905081810360008301526138be8161340c565b9050919050565b600060208201905081810360008301526138de8161342f565b9050919050565b600060208201905081810360008301526138fe81613452565b9050919050565b6000602082019050818103600083015261391e81613475565b9050919050565b600060208201905061393a6000830184613498565b92915050565b600061394a61395b565b90506139568282613c50565b919050565b6000604051905090565b600067ffffffffffffffff8211156139805761397f613e14565b5b61398982613e57565b9050602081019050919050565b600067ffffffffffffffff8211156139b1576139b0613e14565b5b6139ba82613e57565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613a2a82613ba8565b9150613a3583613ba8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a6a57613a69613d29565b5b828201905092915050565b6000613a8082613ba8565b9150613a8b83613ba8565b925082613a9b57613a9a613d58565b5b828204905092915050565b6000613ab182613ba8565b9150613abc83613ba8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613af557613af4613d29565b5b828202905092915050565b6000613b0b82613ba8565b9150613b1683613ba8565b925082821015613b2957613b28613d29565b5b828203905092915050565b6000613b3f82613b88565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613bdf578082015181840152602081019050613bc4565b83811115613bee576000848401525b50505050565b6000613bff82613ba8565b91506000821415613c1357613c12613d29565b5b600182039050919050565b60006002820490506001821680613c3657607f821691505b60208210811415613c4a57613c49613d87565b5b50919050565b613c5982613e57565b810181811067ffffffffffffffff82111715613c7857613c77613e14565b5b80604052505050565b6000613c8c82613ba8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613cbf57613cbe613d29565b5b600182019050919050565b6000613cd582613cdc565b9050919050565b6000613ce782613e68565b9050919050565b6000819050919050565b6000613d0382613ba8565b9150613d0e83613ba8565b925082613d1e57613d1d613d58565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4e6f7420656e6f75676820657468657200000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f3f69643d00000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f26686173683d0000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f53616c652068617320616c726561647920656e64656400000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f4e6f7420656e6f756768206c6566740000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f43616e206d696e7420312e2e3230000000000000000000000000000000000000600082015250565b6144bc81613b34565b81146144c757600080fd5b50565b6144d381613b46565b81146144de57600080fd5b50565b6144ea81613b5c565b81146144f557600080fd5b50565b61450181613ba8565b811461450c57600080fd5b5056fea26469706673582212203330d1a02d27d7f1c677defa0f3053a9c1ae7338a515882bee56daf1975867a964736f6c63430008070033
Deployed Bytecode Sourcemap
313:2527:13:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:222:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2414:98:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3925:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3463:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2497:105:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1535:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;552:31:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4789:330:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1211:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1884:486:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5185:179:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1718:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2608:103:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2117:235:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1855:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1605:92:0;;;;;;;;;;;;;:::i;:::-;;2717:121:13;;;:::i;:::-;;973:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2576:102:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;409:42:13;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1095:514;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4209:290:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1615:263:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5430:320:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2744:329;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;458:48:13;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;369:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4565:162:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1846:189:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;910:222:5;1012:4;1050:35;1035:50;;;:11;:50;;;;:90;;;;1089:36;1113:11;1089:23;:36::i;:::-;1035:90;1028:97;;910:222;;;:::o;2414:98:2:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;4028:16;4036:7;4028;:16::i;:::-;4020:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4111:15;:24;4127:7;4111:24;;;;;;;;;;;;;;;;;;;;;4104:31;;3925:217;;;:::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;3600:11;;:2;:11;;;;3592:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3697:5;3681:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3706:37;3723:5;3730:12;:10;:12::i;:::-;3706:16;:37::i;:::-;3681:62;3660:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;2497:105:13:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2592:3:13::1;2572:17;:23;;;;;;;;;;;;:::i;:::-;;2497:105:::0;:::o;1535:111:5:-;1596:7;1622:10;:17;;;;1615:24;;1535:111;:::o;552:31:13:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4789:330:2:-;4978:41;4997:12;:10;:12::i;:::-;5011:7;4978:18;:41::i;:::-;4970:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;:::-;4789:330;;;:::o;1211:253:5:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1431:12;:19;1444:5;1431:19;;;;;;;;;;;;;;;:26;1451:5;1431:26;;;;;;;;;;;;1424:33;;1211:253;;;;:::o;1884:486:13:-;1973:13;2010:16;2018:7;2010;:16::i;:::-;2002:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;2139:17;2206:25;2223:7;2206:16;:25::i;:::-;2283:48;2311:18;2321:7;2311:9;:18::i;:::-;2303:27;;2283:19;:48::i;:::-;2101:248;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2058:305;;1884:486;;;:::o;5185:179:2:-;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;:::-;5185:179;;;:::o;1718:230:5:-;1793:7;1828:30;:28;:30::i;:::-;1820:5;:38;1812:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;1924:10;1935:5;1924:17;;;;;;;;:::i;:::-;;;;;;;;;;1917:24;;1718:230;;;:::o;2608:103:13:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2697:7:13::1;2678:16;:26;;;;;;;;;;;;:::i;:::-;;2608:103:::0;:::o;2117:235:2:-;2189:7;2208:13;2224:7;:16;2232:7;2224:16;;;;;;;;;;;;;;;;;;;;;2208:32;;2275:1;2258:19;;:5;:19;;;;2250:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2340:5;2333:12;;;2117:235;;;:::o;1855:205::-;1927:7;1971:1;1954:19;;:5;:19;;;;1946:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2037:9;:16;2047:5;2037:16;;;;;;;;;;;;;;;;2030:23;;1855:205;;;:::o;1605:92:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;2717:121:13:-;1196:12:0;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2791:10:13::1;2783:24;;:47;2808:21;2783:47;;;;;;;;;;;;;;;;;;;;;;;2775:56;;;::::0;::::1;;2717:121::o:0;973:85:0:-;1019:7;1045:6;;;;;;;;;;;1038:13;;973:85;:::o;2576:102:2:-;2632:13;2664:7;2657:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2576:102;:::o;409:42:13:-;441:10;409:42;:::o;1095:514::-;399:4;1157:13;:11;:13::i;:::-;:19;1149:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1229:1;1221:5;:9;:24;;;;;1243:2;1234:5;:11;;1221:24;1213:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;399:4;1298:5;1282:13;:11;:13::i;:::-;:21;;;;:::i;:::-;:28;;1274:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;1369:5;441:10;1361:13;;;;:::i;:::-;1348:9;:26;;1340:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1411:9;1406:197;1430:5;1426:1;:9;1406:197;;;1456:17;1492:1;1476:13;:11;:13::i;:::-;:17;;;;:::i;:::-;1456:37;;1534:12;1507:13;:24;1521:9;1507:24;;;;;;;;;;;:39;;;;1560:32;1570:10;1582:9;1560;:32::i;:::-;1442:161;1437:3;;;;;:::i;:::-;;;;1406:197;;;;1095:514;:::o;4209:290:2:-;4323:12;:10;:12::i;:::-;4311:24;;:8;:24;;;;4303:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;4421:8;4376:18;:32;4395:12;:10;:12::i;:::-;4376:32;;;;;;;;;;;;;;;:42;4409:8;4376:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;4473:8;4444:48;;4459:12;:10;:12::i;:::-;4444:48;;;4483:8;4444:48;;;;;;:::i;:::-;;;;;;;;4209:290;;:::o;1615:263:13:-;1672:7;1699:16;1707:7;1699;:16::i;:::-;1691:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;1818:4;1825:13;:22;1839:7;1825:22;;;;;;;;;;;;1849:7;1793:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1766:105;;;;;;1747:124;;1615:263;;;:::o;5430:320:2:-;5599:41;5618:12;:10;:12::i;:::-;5632:7;5599:18;:41::i;:::-;5591:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;:::-;5430:320;;;;:::o;2744:329::-;2817:13;2850:16;2858:7;2850;:16::i;:::-;2842:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2929:21;2953:10;:8;:10::i;:::-;2929:34;;3004:1;2986:7;2980:21;:25;:86;;;;;;;;;;;;;;;;;3032:7;3041:18;:7;:16;:18::i;:::-;3015:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2980:86;2973:93;;;2744:329;;;:::o;458:48:13:-;;;;;;;;;;;;;;;;;:::o;369:34::-;399:4;369:34;:::o;4565:162:2:-;4662:4;4685:18;:25;4704:5;4685:25;;;;;;;;;;;;;;;:35;4711:8;4685:35;;;;;;;;;;;;;;;;;;;;;;;;;4678:42;;4565:162;;;;:::o;1846:189:0:-;1196:12;:10;:12::i;:::-;1185:23;;:7;:5;:7::i;:::-;:23;;;1177:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1954:1:::1;1934:22;;:8;:22;;;;1926:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2009:19;2019:8;2009:9;:19::i;:::-;1846:189:::0;:::o;275:703:10:-;331:13;557:1;548:5;:10;544:51;;;574:10;;;;;;;;;;;;;;;;;;;;;544:51;604:12;619:5;604:20;;634:14;658:75;673:1;665:4;:9;658:75;;690:8;;;;;:::i;:::-;;;;720:2;712:10;;;;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;742:39;;791:150;807:1;798:5;:10;791:150;;834:1;824:11;;;;;:::i;:::-;;;900:2;892:5;:10;;;;:::i;:::-;879:2;:24;;;;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;791:150;;;964:6;950:21;;;;;275:703;;;;:::o;718:377:8:-;778:4;981:12;1046:7;1034:20;1026:28;;1087:1;1080:4;:8;1073:15;;;718:377;;;:::o;13131:122:2:-;;;;:::o;1496:300::-;1598:4;1648:25;1633:40;;;:11;:40;;;;:104;;;;1704:33;1689:48;;;:11;:48;;;;1633:104;:156;;;;1753:36;1777:11;1753:23;:36::i;:::-;1633:156;1614:175;;1496:300;;;:::o;7222:125::-;7287:4;7338:1;7310:30;;:7;:16;7318:7;7310:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7303:37;;7222:125;;;:::o;587:96:9:-;640:7;666:10;659:17;;587:96;:::o;11073:171:2:-;11174:2;11147:15;:24;11163:7;11147:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11229:7;11225:2;11191:46;;11200:23;11215:7;11200:14;:23::i;:::-;11191:46;;;;;;;;;;;;11073:171;;:::o;7505:344::-;7598:4;7622:16;7630:7;7622;:16::i;:::-;7614:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;7754:16;;:7;:16;;;:51;;;;7798:7;7774:31;;:20;7786:7;7774:11;:20::i;:::-;:31;;;7754:51;:87;;;;7809:32;7826:5;7833:7;7809:16;:32::i;:::-;7754:87;7746:96;;;7505:344;;;;:::o;10402:560::-;10556:4;10529:31;;:23;10544:7;10529:14;:23::i;:::-;:31;;;10521:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10638:1;10624:16;;:2;:16;;;;10616:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;10852:1;10833:9;:15;10843:4;10833:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10880:1;10863:9;:13;10873:2;10863:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10910:2;10891:7;:16;10899:7;10891:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10947:7;10943:2;10928:27;;10937:4;10928:27;;;;;;;;;;;;10402:560;;;:::o;1083:329:10:-;1142:13;1180:1;1171:5;:10;1167:54;;;1197:13;;;;;;;;;;;;;;;;;;;;;1167:54;1230:12;1245:5;1230:20;;1260:14;1288:75;1303:1;1295:4;:9;1288:75;;1320:8;;;;;:::i;:::-;;;;1351:1;1342:10;;;;;1288:75;;;1379:26;1391:5;1398:6;1379:11;:26::i;:::-;1372:33;;;;1083:329;;;;:::o;2041:169:0:-;2096:16;2115:6;;;;;;;;;;;2096:25;;2140:8;2131:6;;:17;;;;;;;;;;;;;;;;;;2194:8;2163:40;;2184:8;2163:40;;;;;;;;;;;;2086:124;2041:169;:::o;8179:108:2:-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;:::-;8179:108;;:::o;6612:307::-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6612:307;;;;:::o;2376:115:13:-;2436:13;2468:16;2461:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2376:115;:::o;763:155:11:-;848:4;886:25;871:40;;;:11;:40;;;;864:47;;763:155;;;:::o;2544:572:5:-;2683:45;2710:4;2716:2;2720:7;2683:26;:45::i;:::-;2759:1;2743:18;;:4;:18;;;2739:183;;;2777:40;2809:7;2777:31;:40::i;:::-;2739:183;;;2846:2;2838:10;;:4;:10;;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;2834:88;2739:183;2949:1;2935:16;;:2;:16;;;2931:179;;;2967:45;3004:7;2967:36;:45::i;:::-;2931:179;;;3039:4;3033:10;;:2;:10;;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;:::-;3029:81;2931:179;2544:572;;;:::o;1535:441:10:-;1610:13;1635:19;1680:1;1671:6;1667:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1657:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1635:47;;1692:15;:6;1699:1;1692:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1717;:6;1724:1;1717:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1747:9;1772:1;1763:6;1759:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1747:26;;1742:132;1779:1;1775;:5;1742:132;;;1813:12;1834:3;1826:5;:11;1813:25;;;;;;;:::i;:::-;;;;;1801:6;1808:1;1801:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1862:1;1852:11;;;;;1782:3;;;;:::i;:::-;;;1742:132;;;;1900:1;1891:5;:10;1883:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;1962:6;1948:21;;;1535:441;;;;:::o;8508:311:2:-;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8508:311;;;:::o;11797:778::-;11947:4;11967:15;:2;:13;;;:15::i;:::-;11963:606;;;12018:2;12002:36;;;12039:12;:10;:12::i;:::-;12053:4;12059:7;12068:5;12002:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;11998:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12258:1;12241:6;:13;:18;12237:266;;;12283:60;;;;;;;;;;:::i;:::-;;;;;;;;12237:266;12455:6;12449:13;12440:6;12436:2;12432:15;12425:38;11998:519;12134:41;;;12124:51;;;:6;:51;;;;12117:58;;;;;11963:606;12554:4;12547:11;;11797:778;;;;;;;:::o;3822:161:5:-;3925:10;:17;;;;3898:15;:24;3914:7;3898:24;;;;;;;;;;;:44;;;;3952:10;3968:7;3952:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3822:161;:::o;4600:970::-;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4862:51;;4923:18;4944:17;:26;4962:7;4944:26;;;;;;;;;;;;4923:47;;5088:14;5074:10;:28;5070:323;;5118:19;5140:12;:18;5153:4;5140:18;;;;;;;;;;;;;;;:34;5159:14;5140:34;;;;;;;;;;;;5118:56;;5222:11;5189:12;:18;5202:4;5189:18;;;;;;;;;;;;;;;:30;5208:10;5189:30;;;;;;;;;;;:44;;;;5338:10;5305:17;:30;5323:11;5305:30;;;;;;;;;;;:43;;;;5104:289;5070:323;5486:17;:26;5504:7;5486:26;;;;;;;;;;;5479:33;;;5529:12;:18;5542:4;5529:18;;;;;;;;;;;;;;;:34;5548:14;5529:34;;;;;;;;;;;5522:41;;;4681:889;;4600:970;;:::o;5858:1061::-;6107:22;6152:1;6132:10;:17;;;;:21;;;;:::i;:::-;6107:46;;6163:18;6184:15;:24;6200:7;6184:24;;;;;;;;;;;;6163:45;;6530:19;6552:10;6563:14;6552:26;;;;;;;;:::i;:::-;;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6724:10;6693:15;:28;6709:11;6693:28;;;;;;;;;;;:41;;;;6862:15;:24;6878:7;6862:24;;;;;;;;;;;6855:31;;;6896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;5929:990;;;5858:1061;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;3494:37;;3568:7;3541:12;:16;3554:2;3541:16;;;;;;;;;;;;;;;:24;3558:6;3541:24;;;;;;;;;;;:34;;;;3614:6;3585:17;:26;3603:7;3585:26;;;;;;;;;;;:35;;;;3484:143;3410:217;;:::o;9141:372:2:-;9234:1;9220:16;;:2;:16;;;;9212:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9292:16;9300:7;9292;:16::i;:::-;9291:17;9283:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;9425:1;9408:9;:13;9418:2;9408:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9455:2;9436:7;:16;9444:7;9436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9498:7;9494:2;9473:33;;9490:1;9473:33;;;;;;;;;;;;9141:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:14:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:327::-;5678:6;5727:2;5715:9;5706:7;5702:23;5698:32;5695:119;;;5733:79;;:::i;:::-;5695:119;5853:1;5878:52;5922:7;5913:6;5902:9;5898:22;5878:52;:::i;:::-;5868:62;;5824:116;5620:327;;;;:::o;5953:349::-;6022:6;6071:2;6059:9;6050:7;6046:23;6042:32;6039:119;;;6077:79;;:::i;:::-;6039:119;6197:1;6222:63;6277:7;6268:6;6257:9;6253:22;6222:63;:::i;:::-;6212:73;;6168:127;5953:349;;;;:::o;6308:509::-;6377:6;6426:2;6414:9;6405:7;6401:23;6397:32;6394:119;;;6432:79;;:::i;:::-;6394:119;6580:1;6569:9;6565:17;6552:31;6610:18;6602:6;6599:30;6596:117;;;6632:79;;:::i;:::-;6596:117;6737:63;6792:7;6783:6;6772:9;6768:22;6737:63;:::i;:::-;6727:73;;6523:287;6308:509;;;;:::o;6823:329::-;6882:6;6931:2;6919:9;6910:7;6906:23;6902:32;6899:119;;;6937:79;;:::i;:::-;6899:119;7057:1;7082:53;7127:7;7118:6;7107:9;7103:22;7082:53;:::i;:::-;7072:63;;7028:117;6823:329;;;;:::o;7158:118::-;7245:24;7263:5;7245:24;:::i;:::-;7240:3;7233:37;7158:118;;:::o;7282:157::-;7387:45;7407:24;7425:5;7407:24;:::i;:::-;7387:45;:::i;:::-;7382:3;7375:58;7282:157;;:::o;7445:109::-;7526:21;7541:5;7526:21;:::i;:::-;7521:3;7514:34;7445:109;;:::o;7560:118::-;7647:24;7665:5;7647:24;:::i;:::-;7642:3;7635:37;7560:118;;:::o;7684:360::-;7770:3;7798:38;7830:5;7798:38;:::i;:::-;7852:70;7915:6;7910:3;7852:70;:::i;:::-;7845:77;;7931:52;7976:6;7971:3;7964:4;7957:5;7953:16;7931:52;:::i;:::-;8008:29;8030:6;8008:29;:::i;:::-;8003:3;7999:39;7992:46;;7774:270;7684:360;;;;:::o;8050:364::-;8138:3;8166:39;8199:5;8166:39;:::i;:::-;8221:71;8285:6;8280:3;8221:71;:::i;:::-;8214:78;;8301:52;8346:6;8341:3;8334:4;8327:5;8323:16;8301:52;:::i;:::-;8378:29;8400:6;8378:29;:::i;:::-;8373:3;8369:39;8362:46;;8142:272;8050:364;;;;:::o;8420:377::-;8526:3;8554:39;8587:5;8554:39;:::i;:::-;8609:89;8691:6;8686:3;8609:89;:::i;:::-;8602:96;;8707:52;8752:6;8747:3;8740:4;8733:5;8729:16;8707:52;:::i;:::-;8784:6;8779:3;8775:16;8768:23;;8530:267;8420:377;;;;:::o;8827:845::-;8930:3;8967:5;8961:12;8996:36;9022:9;8996:36;:::i;:::-;9048:89;9130:6;9125:3;9048:89;:::i;:::-;9041:96;;9168:1;9157:9;9153:17;9184:1;9179:137;;;;9330:1;9325:341;;;;9146:520;;9179:137;9263:4;9259:9;9248;9244:25;9239:3;9232:38;9299:6;9294:3;9290:16;9283:23;;9179:137;;9325:341;9392:38;9424:5;9392:38;:::i;:::-;9452:1;9466:154;9480:6;9477:1;9474:13;9466:154;;;9554:7;9548:14;9544:1;9539:3;9535:11;9528:35;9604:1;9595:7;9591:15;9580:26;;9502:4;9499:1;9495:12;9490:17;;9466:154;;;9649:6;9644:3;9640:16;9633:23;;9332:334;;9146:520;;8934:738;;8827:845;;;;:::o;9678:366::-;9820:3;9841:67;9905:2;9900:3;9841:67;:::i;:::-;9834:74;;9917:93;10006:3;9917:93;:::i;:::-;10035:2;10030:3;10026:12;10019:19;;9678:366;;;:::o;10050:::-;10192:3;10213:67;10277:2;10272:3;10213:67;:::i;:::-;10206:74;;10289:93;10378:3;10289:93;:::i;:::-;10407:2;10402:3;10398:12;10391:19;;10050:366;;;:::o;10422:::-;10564:3;10585:67;10649:2;10644:3;10585:67;:::i;:::-;10578:74;;10661:93;10750:3;10661:93;:::i;:::-;10779:2;10774:3;10770:12;10763:19;;10422:366;;;:::o;10794:::-;10936:3;10957:67;11021:2;11016:3;10957:67;:::i;:::-;10950:74;;11033:93;11122:3;11033:93;:::i;:::-;11151:2;11146:3;11142:12;11135:19;;10794:366;;;:::o;11166:::-;11308:3;11329:67;11393:2;11388:3;11329:67;:::i;:::-;11322:74;;11405:93;11494:3;11405:93;:::i;:::-;11523:2;11518:3;11514:12;11507:19;;11166:366;;;:::o;11538:::-;11680:3;11701:67;11765:2;11760:3;11701:67;:::i;:::-;11694:74;;11777:93;11866:3;11777:93;:::i;:::-;11895:2;11890:3;11886:12;11879:19;;11538:366;;;:::o;11910:::-;12052:3;12073:67;12137:2;12132:3;12073:67;:::i;:::-;12066:74;;12149:93;12238:3;12149:93;:::i;:::-;12267:2;12262:3;12258:12;12251:19;;11910:366;;;:::o;12282:::-;12424:3;12445:67;12509:2;12504:3;12445:67;:::i;:::-;12438:74;;12521:93;12610:3;12521:93;:::i;:::-;12639:2;12634:3;12630:12;12623:19;;12282:366;;;:::o;12654:::-;12796:3;12817:67;12881:2;12876:3;12817:67;:::i;:::-;12810:74;;12893:93;12982:3;12893:93;:::i;:::-;13011:2;13006:3;13002:12;12995:19;;12654:366;;;:::o;13026:::-;13168:3;13189:67;13253:2;13248:3;13189:67;:::i;:::-;13182:74;;13265:93;13354:3;13265:93;:::i;:::-;13383:2;13378:3;13374:12;13367:19;;13026:366;;;:::o;13398:::-;13540:3;13561:67;13625:2;13620:3;13561:67;:::i;:::-;13554:74;;13637:93;13726:3;13637:93;:::i;:::-;13755:2;13750:3;13746:12;13739:19;;13398:366;;;:::o;13770:::-;13912:3;13933:67;13997:2;13992:3;13933:67;:::i;:::-;13926:74;;14009:93;14098:3;14009:93;:::i;:::-;14127:2;14122:3;14118:12;14111:19;;13770:366;;;:::o;14142:400::-;14302:3;14323:84;14405:1;14400:3;14323:84;:::i;:::-;14316:91;;14416:93;14505:3;14416:93;:::i;:::-;14534:1;14529:3;14525:11;14518:18;;14142:400;;;:::o;14548:366::-;14690:3;14711:67;14775:2;14770:3;14711:67;:::i;:::-;14704:74;;14787:93;14876:3;14787:93;:::i;:::-;14905:2;14900:3;14896:12;14889:19;;14548:366;;;:::o;14920:::-;15062:3;15083:67;15147:2;15142:3;15083:67;:::i;:::-;15076:74;;15159:93;15248:3;15159:93;:::i;:::-;15277:2;15272:3;15268:12;15261:19;;14920:366;;;:::o;15292:::-;15434:3;15455:67;15519:2;15514:3;15455:67;:::i;:::-;15448:74;;15531:93;15620:3;15531:93;:::i;:::-;15649:2;15644:3;15640:12;15633:19;;15292:366;;;:::o;15664:::-;15806:3;15827:67;15891:2;15886:3;15827:67;:::i;:::-;15820:74;;15903:93;15992:3;15903:93;:::i;:::-;16021:2;16016:3;16012:12;16005:19;;15664:366;;;:::o;16036:::-;16178:3;16199:67;16263:2;16258:3;16199:67;:::i;:::-;16192:74;;16275:93;16364:3;16275:93;:::i;:::-;16393:2;16388:3;16384:12;16377:19;;16036:366;;;:::o;16408:::-;16550:3;16571:67;16635:2;16630:3;16571:67;:::i;:::-;16564:74;;16647:93;16736:3;16647:93;:::i;:::-;16765:2;16760:3;16756:12;16749:19;;16408:366;;;:::o;16780:400::-;16940:3;16961:84;17043:1;17038:3;16961:84;:::i;:::-;16954:91;;17054:93;17143:3;17054:93;:::i;:::-;17172:1;17167:3;17163:11;17156:18;;16780:400;;;:::o;17186:366::-;17328:3;17349:67;17413:2;17408:3;17349:67;:::i;:::-;17342:74;;17425:93;17514:3;17425:93;:::i;:::-;17543:2;17538:3;17534:12;17527:19;;17186:366;;;:::o;17558:::-;17700:3;17721:67;17785:2;17780:3;17721:67;:::i;:::-;17714:74;;17797:93;17886:3;17797:93;:::i;:::-;17915:2;17910:3;17906:12;17899:19;;17558:366;;;:::o;17930:::-;18072:3;18093:67;18157:2;18152:3;18093:67;:::i;:::-;18086:74;;18169:93;18258:3;18169:93;:::i;:::-;18287:2;18282:3;18278:12;18271:19;;17930:366;;;:::o;18302:::-;18444:3;18465:67;18529:2;18524:3;18465:67;:::i;:::-;18458:74;;18541:93;18630:3;18541:93;:::i;:::-;18659:2;18654:3;18650:12;18643:19;;18302:366;;;:::o;18674:::-;18816:3;18837:67;18901:2;18896:3;18837:67;:::i;:::-;18830:74;;18913:93;19002:3;18913:93;:::i;:::-;19031:2;19026:3;19022:12;19015:19;;18674:366;;;:::o;19046:::-;19188:3;19209:67;19273:2;19268:3;19209:67;:::i;:::-;19202:74;;19285:93;19374:3;19285:93;:::i;:::-;19403:2;19398:3;19394:12;19387:19;;19046:366;;;:::o;19418:118::-;19505:24;19523:5;19505:24;:::i;:::-;19500:3;19493:37;19418:118;;:::o;19542:157::-;19647:45;19667:24;19685:5;19667:24;:::i;:::-;19647:45;:::i;:::-;19642:3;19635:58;19542:157;;:::o;19705:538::-;19873:3;19888:75;19959:3;19950:6;19888:75;:::i;:::-;19988:2;19983:3;19979:12;19972:19;;20001:75;20072:3;20063:6;20001:75;:::i;:::-;20101:2;20096:3;20092:12;20085:19;;20114:75;20185:3;20176:6;20114:75;:::i;:::-;20214:2;20209:3;20205:12;20198:19;;20234:3;20227:10;;19705:538;;;;;;:::o;20249:435::-;20429:3;20451:95;20542:3;20533:6;20451:95;:::i;:::-;20444:102;;20563:95;20654:3;20645:6;20563:95;:::i;:::-;20556:102;;20675:3;20668:10;;20249:435;;;;;:::o;20690:1121::-;21117:3;21139:92;21227:3;21218:6;21139:92;:::i;:::-;21132:99;;21248:148;21392:3;21248:148;:::i;:::-;21241:155;;21413:95;21504:3;21495:6;21413:95;:::i;:::-;21406:102;;21525:148;21669:3;21525:148;:::i;:::-;21518:155;;21690:95;21781:3;21772:6;21690:95;:::i;:::-;21683:102;;21802:3;21795:10;;20690:1121;;;;;;:::o;21817:222::-;21910:4;21948:2;21937:9;21933:18;21925:26;;21961:71;22029:1;22018:9;22014:17;22005:6;21961:71;:::i;:::-;21817:222;;;;:::o;22045:640::-;22240:4;22278:3;22267:9;22263:19;22255:27;;22292:71;22360:1;22349:9;22345:17;22336:6;22292:71;:::i;:::-;22373:72;22441:2;22430:9;22426:18;22417:6;22373:72;:::i;:::-;22455;22523:2;22512:9;22508:18;22499:6;22455:72;:::i;:::-;22574:9;22568:4;22564:20;22559:2;22548:9;22544:18;22537:48;22602:76;22673:4;22664:6;22602:76;:::i;:::-;22594:84;;22045:640;;;;;;;:::o;22691:210::-;22778:4;22816:2;22805:9;22801:18;22793:26;;22829:65;22891:1;22880:9;22876:17;22867:6;22829:65;:::i;:::-;22691:210;;;;:::o;22907:222::-;23000:4;23038:2;23027:9;23023:18;23015:26;;23051:71;23119:1;23108:9;23104:17;23095:6;23051:71;:::i;:::-;22907:222;;;;:::o;23135:313::-;23248:4;23286:2;23275:9;23271:18;23263:26;;23335:9;23329:4;23325:20;23321:1;23310:9;23306:17;23299:47;23363:78;23436:4;23427:6;23363:78;:::i;:::-;23355:86;;23135:313;;;;:::o;23454:419::-;23620:4;23658:2;23647:9;23643:18;23635:26;;23707:9;23701:4;23697:20;23693:1;23682:9;23678:17;23671:47;23735:131;23861:4;23735:131;:::i;:::-;23727:139;;23454:419;;;:::o;23879:::-;24045:4;24083:2;24072:9;24068:18;24060:26;;24132:9;24126:4;24122:20;24118:1;24107:9;24103:17;24096:47;24160:131;24286:4;24160:131;:::i;:::-;24152:139;;23879:419;;;:::o;24304:::-;24470:4;24508:2;24497:9;24493:18;24485:26;;24557:9;24551:4;24547:20;24543:1;24532:9;24528:17;24521:47;24585:131;24711:4;24585:131;:::i;:::-;24577:139;;24304:419;;;:::o;24729:::-;24895:4;24933:2;24922:9;24918:18;24910:26;;24982:9;24976:4;24972:20;24968:1;24957:9;24953:17;24946:47;25010:131;25136:4;25010:131;:::i;:::-;25002:139;;24729:419;;;:::o;25154:::-;25320:4;25358:2;25347:9;25343:18;25335:26;;25407:9;25401:4;25397:20;25393:1;25382:9;25378:17;25371:47;25435:131;25561:4;25435:131;:::i;:::-;25427:139;;25154:419;;;:::o;25579:::-;25745:4;25783:2;25772:9;25768:18;25760:26;;25832:9;25826:4;25822:20;25818:1;25807:9;25803:17;25796:47;25860:131;25986:4;25860:131;:::i;:::-;25852:139;;25579:419;;;:::o;26004:::-;26170:4;26208:2;26197:9;26193:18;26185:26;;26257:9;26251:4;26247:20;26243:1;26232:9;26228:17;26221:47;26285:131;26411:4;26285:131;:::i;:::-;26277:139;;26004:419;;;:::o;26429:::-;26595:4;26633:2;26622:9;26618:18;26610:26;;26682:9;26676:4;26672:20;26668:1;26657:9;26653:17;26646:47;26710:131;26836:4;26710:131;:::i;:::-;26702:139;;26429:419;;;:::o;26854:::-;27020:4;27058:2;27047:9;27043:18;27035:26;;27107:9;27101:4;27097:20;27093:1;27082:9;27078:17;27071:47;27135:131;27261:4;27135:131;:::i;:::-;27127:139;;26854:419;;;:::o;27279:::-;27445:4;27483:2;27472:9;27468:18;27460:26;;27532:9;27526:4;27522:20;27518:1;27507:9;27503:17;27496:47;27560:131;27686:4;27560:131;:::i;:::-;27552:139;;27279:419;;;:::o;27704:::-;27870:4;27908:2;27897:9;27893:18;27885:26;;27957:9;27951:4;27947:20;27943:1;27932:9;27928:17;27921:47;27985:131;28111:4;27985:131;:::i;:::-;27977:139;;27704:419;;;:::o;28129:::-;28295:4;28333:2;28322:9;28318:18;28310:26;;28382:9;28376:4;28372:20;28368:1;28357:9;28353:17;28346:47;28410:131;28536:4;28410:131;:::i;:::-;28402:139;;28129:419;;;:::o;28554:::-;28720:4;28758:2;28747:9;28743:18;28735:26;;28807:9;28801:4;28797:20;28793:1;28782:9;28778:17;28771:47;28835:131;28961:4;28835:131;:::i;:::-;28827:139;;28554:419;;;:::o;28979:::-;29145:4;29183:2;29172:9;29168:18;29160:26;;29232:9;29226:4;29222:20;29218:1;29207:9;29203:17;29196:47;29260:131;29386:4;29260:131;:::i;:::-;29252:139;;28979:419;;;:::o;29404:::-;29570:4;29608:2;29597:9;29593:18;29585:26;;29657:9;29651:4;29647:20;29643:1;29632:9;29628:17;29621:47;29685:131;29811:4;29685:131;:::i;:::-;29677:139;;29404:419;;;:::o;29829:::-;29995:4;30033:2;30022:9;30018:18;30010:26;;30082:9;30076:4;30072:20;30068:1;30057:9;30053:17;30046:47;30110:131;30236:4;30110:131;:::i;:::-;30102:139;;29829:419;;;:::o;30254:::-;30420:4;30458:2;30447:9;30443:18;30435:26;;30507:9;30501:4;30497:20;30493:1;30482:9;30478:17;30471:47;30535:131;30661:4;30535:131;:::i;:::-;30527:139;;30254:419;;;:::o;30679:::-;30845:4;30883:2;30872:9;30868:18;30860:26;;30932:9;30926:4;30922:20;30918:1;30907:9;30903:17;30896:47;30960:131;31086:4;30960:131;:::i;:::-;30952:139;;30679:419;;;:::o;31104:::-;31270:4;31308:2;31297:9;31293:18;31285:26;;31357:9;31351:4;31347:20;31343:1;31332:9;31328:17;31321:47;31385:131;31511:4;31385:131;:::i;:::-;31377:139;;31104:419;;;:::o;31529:::-;31695:4;31733:2;31722:9;31718:18;31710:26;;31782:9;31776:4;31772:20;31768:1;31757:9;31753:17;31746:47;31810:131;31936:4;31810:131;:::i;:::-;31802:139;;31529:419;;;:::o;31954:::-;32120:4;32158:2;32147:9;32143:18;32135:26;;32207:9;32201:4;32197:20;32193:1;32182:9;32178:17;32171:47;32235:131;32361:4;32235:131;:::i;:::-;32227:139;;31954:419;;;:::o;32379:::-;32545:4;32583:2;32572:9;32568:18;32560:26;;32632:9;32626:4;32622:20;32618:1;32607:9;32603:17;32596:47;32660:131;32786:4;32660:131;:::i;:::-;32652:139;;32379:419;;;:::o;32804:::-;32970:4;33008:2;32997:9;32993:18;32985:26;;33057:9;33051:4;33047:20;33043:1;33032:9;33028:17;33021:47;33085:131;33211:4;33085:131;:::i;:::-;33077:139;;32804:419;;;:::o;33229:::-;33395:4;33433:2;33422:9;33418:18;33410:26;;33482:9;33476:4;33472:20;33468:1;33457:9;33453:17;33446:47;33510:131;33636:4;33510:131;:::i;:::-;33502:139;;33229:419;;;:::o;33654:222::-;33747:4;33785:2;33774:9;33770:18;33762:26;;33798:71;33866:1;33855:9;33851:17;33842:6;33798:71;:::i;:::-;33654:222;;;;:::o;33882:129::-;33916:6;33943:20;;:::i;:::-;33933:30;;33972:33;34000:4;33992:6;33972:33;:::i;:::-;33882:129;;;:::o;34017:75::-;34050:6;34083:2;34077:9;34067:19;;34017:75;:::o;34098:307::-;34159:4;34249:18;34241:6;34238:30;34235:56;;;34271:18;;:::i;:::-;34235:56;34309:29;34331:6;34309:29;:::i;:::-;34301:37;;34393:4;34387;34383:15;34375:23;;34098:307;;;:::o;34411:308::-;34473:4;34563:18;34555:6;34552:30;34549:56;;;34585:18;;:::i;:::-;34549:56;34623:29;34645:6;34623:29;:::i;:::-;34615:37;;34707:4;34701;34697:15;34689:23;;34411:308;;;:::o;34725:141::-;34774:4;34797:3;34789:11;;34820:3;34817:1;34810:14;34854:4;34851:1;34841:18;34833:26;;34725:141;;;:::o;34872:98::-;34923:6;34957:5;34951:12;34941:22;;34872:98;;;:::o;34976:99::-;35028:6;35062:5;35056:12;35046:22;;34976:99;;;:::o;35081:168::-;35164:11;35198:6;35193:3;35186:19;35238:4;35233:3;35229:14;35214:29;;35081:168;;;;:::o;35255:169::-;35339:11;35373:6;35368:3;35361:19;35413:4;35408:3;35404:14;35389:29;;35255:169;;;;:::o;35430:148::-;35532:11;35569:3;35554:18;;35430:148;;;;:::o;35584:305::-;35624:3;35643:20;35661:1;35643:20;:::i;:::-;35638:25;;35677:20;35695:1;35677:20;:::i;:::-;35672:25;;35831:1;35763:66;35759:74;35756:1;35753:81;35750:107;;;35837:18;;:::i;:::-;35750:107;35881:1;35878;35874:9;35867:16;;35584:305;;;;:::o;35895:185::-;35935:1;35952:20;35970:1;35952:20;:::i;:::-;35947:25;;35986:20;36004:1;35986:20;:::i;:::-;35981:25;;36025:1;36015:35;;36030:18;;:::i;:::-;36015:35;36072:1;36069;36065:9;36060:14;;35895:185;;;;:::o;36086:348::-;36126:7;36149:20;36167:1;36149:20;:::i;:::-;36144:25;;36183:20;36201:1;36183:20;:::i;:::-;36178:25;;36371:1;36303:66;36299:74;36296:1;36293:81;36288:1;36281:9;36274:17;36270:105;36267:131;;;36378:18;;:::i;:::-;36267:131;36426:1;36423;36419:9;36408:20;;36086:348;;;;:::o;36440:191::-;36480:4;36500:20;36518:1;36500:20;:::i;:::-;36495:25;;36534:20;36552:1;36534:20;:::i;:::-;36529:25;;36573:1;36570;36567:8;36564:34;;;36578:18;;:::i;:::-;36564:34;36623:1;36620;36616:9;36608:17;;36440:191;;;;:::o;36637:96::-;36674:7;36703:24;36721:5;36703:24;:::i;:::-;36692:35;;36637:96;;;:::o;36739:90::-;36773:7;36816:5;36809:13;36802:21;36791:32;;36739:90;;;:::o;36835:77::-;36872:7;36901:5;36890:16;;36835:77;;;:::o;36918:149::-;36954:7;36994:66;36987:5;36983:78;36972:89;;36918:149;;;:::o;37073:126::-;37110:7;37150:42;37143:5;37139:54;37128:65;;37073:126;;;:::o;37205:77::-;37242:7;37271:5;37260:16;;37205:77;;;:::o;37288:154::-;37372:6;37367:3;37362;37349:30;37434:1;37425:6;37420:3;37416:16;37409:27;37288:154;;;:::o;37448:307::-;37516:1;37526:113;37540:6;37537:1;37534:13;37526:113;;;37625:1;37620:3;37616:11;37610:18;37606:1;37601:3;37597:11;37590:39;37562:2;37559:1;37555:10;37550:15;;37526:113;;;37657:6;37654:1;37651:13;37648:101;;;37737:1;37728:6;37723:3;37719:16;37712:27;37648:101;37497:258;37448:307;;;:::o;37761:171::-;37800:3;37823:24;37841:5;37823:24;:::i;:::-;37814:33;;37869:4;37862:5;37859:15;37856:41;;;37877:18;;:::i;:::-;37856:41;37924:1;37917:5;37913:13;37906:20;;37761:171;;;:::o;37938:320::-;37982:6;38019:1;38013:4;38009:12;37999:22;;38066:1;38060:4;38056:12;38087:18;38077:81;;38143:4;38135:6;38131:17;38121:27;;38077:81;38205:2;38197:6;38194:14;38174:18;38171:38;38168:84;;;38224:18;;:::i;:::-;38168:84;37989:269;37938:320;;;:::o;38264:281::-;38347:27;38369:4;38347:27;:::i;:::-;38339:6;38335:40;38477:6;38465:10;38462:22;38441:18;38429:10;38426:34;38423:62;38420:88;;;38488:18;;:::i;:::-;38420:88;38528:10;38524:2;38517:22;38307:238;38264:281;;:::o;38551:233::-;38590:3;38613:24;38631:5;38613:24;:::i;:::-;38604:33;;38659:66;38652:5;38649:77;38646:103;;;38729:18;;:::i;:::-;38646:103;38776:1;38769:5;38765:13;38758:20;;38551:233;;;:::o;38790:100::-;38829:7;38858:26;38878:5;38858:26;:::i;:::-;38847:37;;38790:100;;;:::o;38896:94::-;38935:7;38964:20;38978:5;38964:20;:::i;:::-;38953:31;;38896:94;;;:::o;38996:79::-;39035:7;39064:5;39053:16;;38996:79;;;:::o;39081:176::-;39113:1;39130:20;39148:1;39130:20;:::i;:::-;39125:25;;39164:20;39182:1;39164:20;:::i;:::-;39159:25;;39203:1;39193:35;;39208:18;;:::i;:::-;39193:35;39249:1;39246;39242:9;39237:14;;39081:176;;;;:::o;39263:180::-;39311:77;39308:1;39301:88;39408:4;39405:1;39398:15;39432:4;39429:1;39422:15;39449:180;39497:77;39494:1;39487:88;39594:4;39591:1;39584:15;39618:4;39615:1;39608:15;39635:180;39683:77;39680:1;39673:88;39780:4;39777:1;39770:15;39804:4;39801:1;39794:15;39821:180;39869:77;39866:1;39859:88;39966:4;39963:1;39956:15;39990:4;39987:1;39980:15;40007:180;40055:77;40052:1;40045:88;40152:4;40149:1;40142:15;40176:4;40173:1;40166:15;40193:180;40241:77;40238:1;40231:88;40338:4;40335:1;40328:15;40362:4;40359:1;40352:15;40379:117;40488:1;40485;40478:12;40502:117;40611:1;40608;40601:12;40625:117;40734:1;40731;40724:12;40748:117;40857:1;40854;40847:12;40871:102;40912:6;40963:2;40959:7;40954:2;40947:5;40943:14;40939:28;40929:38;;40871:102;;;:::o;40979:94::-;41012:8;41060:5;41056:2;41052:14;41031:35;;40979:94;;;:::o;41079:182::-;41219:34;41215:1;41207:6;41203:14;41196:58;41079:182;:::o;41267:166::-;41407:18;41403:1;41395:6;41391:14;41384:42;41267:166;:::o;41439:230::-;41579:34;41575:1;41567:6;41563:14;41556:58;41648:13;41643:2;41635:6;41631:15;41624:38;41439:230;:::o;41675:237::-;41815:34;41811:1;41803:6;41799:14;41792:58;41884:20;41879:2;41871:6;41867:15;41860:45;41675:237;:::o;41918:225::-;42058:34;42054:1;42046:6;42042:14;42035:58;42127:8;42122:2;42114:6;42110:15;42103:33;41918:225;:::o;42149:178::-;42289:30;42285:1;42277:6;42273:14;42266:54;42149:178;:::o;42333:223::-;42473:34;42469:1;42461:6;42457:14;42450:58;42542:6;42537:2;42529:6;42525:15;42518:31;42333:223;:::o;42562:175::-;42702:27;42698:1;42690:6;42686:14;42679:51;42562:175;:::o;42743:231::-;42883:34;42879:1;42871:6;42867:14;42860:58;42952:14;42947:2;42939:6;42935:15;42928:39;42743:231;:::o;42980:243::-;43120:34;43116:1;43108:6;43104:14;43097:58;43189:26;43184:2;43176:6;43172:15;43165:51;42980:243;:::o;43229:229::-;43369:34;43365:1;43357:6;43353:14;43346:58;43438:12;43433:2;43425:6;43421:15;43414:37;43229:229;:::o;43464:228::-;43604:34;43600:1;43592:6;43588:14;43581:58;43673:11;43668:2;43660:6;43656:15;43649:36;43464:228;:::o;43698:154::-;43838:6;43834:1;43826:6;43822:14;43815:30;43698:154;:::o;43858:182::-;43998:34;43994:1;43986:6;43982:14;43975:58;43858:182;:::o;44046:231::-;44186:34;44182:1;44174:6;44170:14;44163:58;44255:14;44250:2;44242:6;44238:15;44231:39;44046:231;:::o;44283:167::-;44423:19;44419:1;44411:6;44407:14;44400:43;44283:167;:::o;44456:182::-;44596:34;44592:1;44584:6;44580:14;44573:58;44456:182;:::o;44644:228::-;44784:34;44780:1;44772:6;44768:14;44761:58;44853:11;44848:2;44840:6;44836:15;44829:36;44644:228;:::o;44878:234::-;45018:34;45014:1;45006:6;45002:14;44995:58;45087:17;45082:2;45074:6;45070:15;45063:42;44878:234;:::o;45118:156::-;45258:8;45254:1;45246:6;45242:14;45235:32;45118:156;:::o;45280:220::-;45420:34;45416:1;45408:6;45404:14;45397:58;45489:3;45484:2;45476:6;45472:15;45465:28;45280:220;:::o;45506:172::-;45646:24;45642:1;45634:6;45630:14;45623:48;45506:172;:::o;45684:236::-;45824:34;45820:1;45812:6;45808:14;45801:58;45893:19;45888:2;45880:6;45876:15;45869:44;45684:236;:::o;45926:165::-;46066:17;46062:1;46054:6;46050:14;46043:41;45926:165;:::o;46097:231::-;46237:34;46233:1;46225:6;46221:14;46214:58;46306:14;46301:2;46293:6;46289:15;46282:39;46097:231;:::o;46334:164::-;46474:16;46470:1;46462:6;46458:14;46451:40;46334:164;:::o;46504:122::-;46577:24;46595:5;46577:24;:::i;:::-;46570:5;46567:35;46557:63;;46616:1;46613;46606:12;46557:63;46504:122;:::o;46632:116::-;46702:21;46717:5;46702:21;:::i;:::-;46695:5;46692:32;46682:60;;46738:1;46735;46728:12;46682:60;46632:116;:::o;46754:120::-;46826:23;46843:5;46826:23;:::i;:::-;46819:5;46816:34;46806:62;;46864:1;46861;46854:12;46806:62;46754:120;:::o;46880:122::-;46953:24;46971:5;46953:24;:::i;:::-;46946:5;46943:35;46933:63;;46992:1;46989;46982:12;46933:63;46880:122;:::o
Swarm Source
ipfs://3330d1a02d27d7f1c677defa0f3053a9c1ae7338a515882bee56daf1975867a9
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.