Polygon Sponsored slots available. Book your slot here!
Contract Overview
[ Download CSV Export ]
Contract Name:
JPIGs
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at polygonscan.com on 2022-06-23 */ // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (utils/Counters.sol) pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/utils/Strings.sol // OpenZeppelin Contracts v4.4.1 (utils/Strings.sol) pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @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() { _transferOwnership(_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 { _transferOwnership(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"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol) pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } // File: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/token/ERC721/IERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol) pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol // OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol) pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol) pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); _afterTokenTransfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); _afterTokenTransfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); _afterTokenTransfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} /** * @dev Hook that is called after any transfer of tokens. This includes * minting and burning. * * Calling conditions: * * - when `from` and `to` are both non-zero. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _afterTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol // OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol) pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC20/IERC20.sol // OpenZeppelin Contracts (last updated v4.6.0) (token/ERC20/IERC20.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `to`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address to, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `from` to `to` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 amount ) external returns (bool); } // File: JPIGs.sol pragma solidity ^0.8.4; contract JPIGs is ERC721, ERC721Enumerable, Ownable { using Counters for Counters.Counter; IERC20 public tokenAddress; uint256 public MAX_TOKENS_PER_MINT = 10; // Maximum per transaction uint256 public immutable MAX_SUPPLY = 10000; // 10k supply uint256 public price = 1000 * 10 ** 18; string public baseURI = ""; Counters.Counter private _tokenIdCounter; constructor(address _tokenAddress) ERC721("JPIGs", "JPIG") { tokenAddress = IERC20(_tokenAddress); } function mint(uint256 _mintAmount) public payable { uint256 supply = totalSupply(); require(_mintAmount < MAX_TOKENS_PER_MINT + 1, "max transaction exceeded"); require(supply + _mintAmount < MAX_SUPPLY + 1, "max supply exceeded"); for (uint256 i = 0; i < _mintAmount; i++) { tokenAddress.transferFrom(msg.sender, address(this), price); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); _safeMint(msg.sender, tokenId); } } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) { super._beforeTokenTransfer(from, to, tokenId); } function tokenURI(uint256 _tokenId) override public view returns(string memory) { return string( abi.encodePacked( baseURI, Strings.toString(_tokenId), ".json" ) ); } function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) { return super.supportsInterface(interfaceId); } function _baseURI() internal view override(ERC721) virtual returns (string memory) { return baseURI; } function setBaseURI(string memory baseURI_) public onlyOwner { baseURI = baseURI_; } function setPrice(uint256 _newPrice) public onlyOwner { price = _newPrice * 10 ** 18; } function withdrawToken() public onlyOwner { tokenAddress.transfer(msg.sender, tokenAddress.balanceOf(address(this))); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"address","name":"_tokenAddress","type":"address"}],"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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"_mintAmount","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":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"tokenAddress","outputs":[{"internalType":"contract IERC20","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawToken","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60a0604052600a600c55612710608090815250683635c9adc5dea00000600d5560405180602001604052806000815250600e90805190602001906200004692919062000250565b503480156200005457600080fd5b50604051620043843803806200438483398181016040528101906200007a919062000317565b6040518060400160405280600581526020017f4a504947730000000000000000000000000000000000000000000000000000008152506040518060400160405280600481526020017f4a504947000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000fe92919062000250565b5080600190805190602001906200011792919062000250565b5050506200013a6200012e6200018260201b60201c565b6200018a60201b60201c565b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505062000401565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200025e906200037d565b90600052602060002090601f016020900481019282620002825760008555620002ce565b82601f106200029d57805160ff1916838001178555620002ce565b82800160010185558215620002ce579182015b82811115620002cd578251825591602001919060010190620002b0565b5b509050620002dd9190620002e1565b5090565b5b80821115620002fc576000816000905550600101620002e2565b5090565b6000815190506200031181620003e7565b92915050565b60006020828403121562000330576200032f620003e2565b5b6000620003408482850162000300565b91505092915050565b600062000356826200035d565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200039657607f821691505b60208210811415620003ad57620003ac620003b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003f28162000349565b8114620003fe57600080fd5b50565b608051613f606200042460003960008181610a0e0152610fbe0152613f606000f3fe6080604052600436106101b75760003560e01c806370a08231116100ec578063a0712d681161008a578063c87b56dd11610064578063c87b56dd146105ff578063ca628c781461063c578063e985e9c514610653578063f2fde38b14610690576101b7565b8063a0712d6814610591578063a22cb465146105ad578063b88d4fde146105d6576101b7565b806391b7f5ed116100c657806391b7f5ed146104e757806395d89b41146105105780639d76ea581461053b578063a035b1fe14610566576101b7565b806370a0823114610468578063715018a6146104a55780638da5cb5b146104bc576101b7565b806332cb6b0c116101595780634f6ccce7116101335780634f6ccce71461039a57806355f804b3146103d75780636352211e146104005780636c0360eb1461043d576101b7565b806332cb6b0c1461031b5780633377cd661461034657806342842e0e14610371576101b7565b8063095ea7b311610195578063095ea7b31461026157806318160ddd1461028a57806323b872dd146102b55780632f745c59146102de576101b7565b806301ffc9a7146101bc57806306fdde03146101f9578063081812fc14610224575b600080fd5b3480156101c857600080fd5b506101e360048036038101906101de9190612bd0565b6106b9565b6040516101f091906131dd565b60405180910390f35b34801561020557600080fd5b5061020e6106cb565b60405161021b9190613213565b60405180910390f35b34801561023057600080fd5b5061024b60048036038101906102469190612c73565b61075d565b6040516102589190613116565b60405180910390f35b34801561026d57600080fd5b5061028860048036038101906102839190612b63565b6107e2565b005b34801561029657600080fd5b5061029f6108fa565b6040516102ac9190613495565b60405180910390f35b3480156102c157600080fd5b506102dc60048036038101906102d79190612a4d565b610907565b005b3480156102ea57600080fd5b5061030560048036038101906103009190612b63565b610967565b6040516103129190613495565b60405180910390f35b34801561032757600080fd5b50610330610a0c565b60405161033d9190613495565b60405180910390f35b34801561035257600080fd5b5061035b610a30565b6040516103689190613495565b60405180910390f35b34801561037d57600080fd5b5061039860048036038101906103939190612a4d565b610a36565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612c73565b610a56565b6040516103ce9190613495565b60405180910390f35b3480156103e357600080fd5b506103fe60048036038101906103f99190612c2a565b610ac7565b005b34801561040c57600080fd5b5061042760048036038101906104229190612c73565b610b5d565b6040516104349190613116565b60405180910390f35b34801561044957600080fd5b50610452610c0f565b60405161045f9190613213565b60405180910390f35b34801561047457600080fd5b5061048f600480360381019061048a91906129e0565b610c9d565b60405161049c9190613495565b60405180910390f35b3480156104b157600080fd5b506104ba610d55565b005b3480156104c857600080fd5b506104d1610ddd565b6040516104de9190613116565b60405180910390f35b3480156104f357600080fd5b5061050e60048036038101906105099190612c73565b610e07565b005b34801561051c57600080fd5b50610525610ea0565b6040516105329190613213565b60405180910390f35b34801561054757600080fd5b50610550610f32565b60405161055d91906131f8565b60405180910390f35b34801561057257600080fd5b5061057b610f58565b6040516105889190613495565b60405180910390f35b6105ab60048036038101906105a69190612c73565b610f5e565b005b3480156105b957600080fd5b506105d460048036038101906105cf9190612b23565b61112d565b005b3480156105e257600080fd5b506105fd60048036038101906105f89190612aa0565b611143565b005b34801561060b57600080fd5b5061062660048036038101906106219190612c73565b6111a5565b6040516106339190613213565b60405180910390f35b34801561064857600080fd5b506106516111d9565b005b34801561065f57600080fd5b5061067a60048036038101906106759190612a0d565b6113b1565b60405161068791906131dd565b60405180910390f35b34801561069c57600080fd5b506106b760048036038101906106b291906129e0565b611445565b005b60006106c48261153d565b9050919050565b6060600080546106da90613790565b80601f016020809104026020016040519081016040528092919081815260200182805461070690613790565b80156107535780601f1061072857610100808354040283529160200191610753565b820191906000526020600020905b81548152906001019060200180831161073657829003601f168201915b5050505050905090565b6000610768826115b7565b6107a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079e906133f5565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107ed82610b5d565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085590613435565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661087d611623565b73ffffffffffffffffffffffffffffffffffffffff1614806108ac57506108ab816108a6611623565b6113b1565b5b6108eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e290613375565b60405180910390fd5b6108f5838361162b565b505050565b6000600880549050905090565b610918610912611623565b826116e4565b610957576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094e90613455565b60405180910390fd5b6109628383836117c2565b505050565b600061097283610c9d565b82106109b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109aa90613255565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b7f000000000000000000000000000000000000000000000000000000000000000081565b600c5481565b610a5183838360405180602001604052806000815250611143565b505050565b6000610a606108fa565b8210610aa1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9890613475565b60405180910390fd5b60088281548110610ab557610ab4613929565b5b90600052602060002001549050919050565b610acf611623565b73ffffffffffffffffffffffffffffffffffffffff16610aed610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610b43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3a90613415565b60405180910390fd5b80600e9080519060200190610b599291906127ca565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfd906133b5565b60405180910390fd5b80915050919050565b600e8054610c1c90613790565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4890613790565b8015610c955780601f10610c6a57610100808354040283529160200191610c95565b820191906000526020600020905b815481529060010190602001808311610c7857829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0590613395565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610d5d611623565b73ffffffffffffffffffffffffffffffffffffffff16610d7b610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610dd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc890613415565b60405180910390fd5b610ddb6000611a29565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b610e0f611623565b73ffffffffffffffffffffffffffffffffffffffff16610e2d610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614610e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7a90613415565b60405180910390fd5b670de0b6b3a764000081610e979190613616565b600d8190555050565b606060018054610eaf90613790565b80601f0160208091040260200160405190810160405280929190818152602001828054610edb90613790565b8015610f285780601f10610efd57610100808354040283529160200191610f28565b820191906000526020600020905b815481529060010190602001808311610f0b57829003601f168201915b5050505050905090565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600d5481565b6000610f686108fa565b90506001600c54610f79919061358f565b8210610fba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fb190613235565b60405180910390fd5b60017f0000000000000000000000000000000000000000000000000000000000000000610fe7919061358f565b8282610ff3919061358f565b10611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102a906132f5565b60405180910390fd5b60005b8281101561112857600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd3330600d546040518463ffffffff1660e01b815260040161109f93929190613131565b602060405180830381600087803b1580156110b957600080fd5b505af11580156110cd573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110f19190612ba3565b5060006110fe600f611aef565b905061110a600f611afd565b6111143382611b13565b508080611120906137f3565b915050611036565b505050565b61113f611138611623565b8383611b31565b5050565b61115461114e611623565b836116e4565b611193576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118a90613455565b60405180910390fd5b61119f84848484611c9e565b50505050565b6060600e6111b283611cfa565b6040516020016111c39291906130e7565b6040516020818303038152906040529050919050565b6111e1611623565b73ffffffffffffffffffffffffffffffffffffffff166111ff610ddd565b73ffffffffffffffffffffffffffffffffffffffff1614611255576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124c90613415565b60405180910390fd5b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663a9059cbb33600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231306040518263ffffffff1660e01b81526004016112ef9190613116565b60206040518083038186803b15801561130757600080fd5b505afa15801561131b573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061133f9190612ca0565b6040518363ffffffff1660e01b815260040161135c9291906131b4565b602060405180830381600087803b15801561137657600080fd5b505af115801561138a573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113ae9190612ba3565b50565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61144d611623565b73ffffffffffffffffffffffffffffffffffffffff1661146b610ddd565b73ffffffffffffffffffffffffffffffffffffffff16146114c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b890613415565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611531576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152890613295565b60405180910390fd5b61153a81611a29565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806115b057506115af82611e5b565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661169e83610b5d565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006116ef826115b7565b61172e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172590613355565b60405180910390fd5b600061173983610b5d565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061177b575061177a81856113b1565b5b806117b957508373ffffffffffffffffffffffffffffffffffffffff166117a18461075d565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166117e282610b5d565b73ffffffffffffffffffffffffffffffffffffffff1614611838576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161182f906132b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f90613315565b60405180910390fd5b6118b3838383611f3d565b6118be60008261162b565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461190e9190613670565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611965919061358f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a24838383611f4d565b505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600081600001549050919050565b6001816000016000828254019250508190555050565b611b2d828260405180602001604052806000815250611f52565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611ba0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9790613335565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611c9191906131dd565b60405180910390a3505050565b611ca98484846117c2565b611cb584848484611fad565b611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90613275565b60405180910390fd5b50505050565b60606000821415611d42576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611e56565b600082905060005b60008214611d74578080611d5d906137f3565b915050600a82611d6d91906135e5565b9150611d4a565b60008167ffffffffffffffff811115611d9057611d8f613958565b5b6040519080825280601f01601f191660200182016040528015611dc25781602001600182028036833780820191505090505b5090505b60008514611e4f57600182611ddb9190613670565b9150600a85611dea919061383c565b6030611df6919061358f565b60f81b818381518110611e0c57611e0b613929565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611e4891906135e5565b9450611dc6565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f2657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f365750611f3582612144565b5b9050919050565b611f488383836121ae565b505050565b505050565b611f5c83836122c2565b611f696000848484611fad565b611fa8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9f90613275565b60405180910390fd5b505050565b6000611fce8473ffffffffffffffffffffffffffffffffffffffff1661249c565b15612137578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ff7611623565b8786866040518563ffffffff1660e01b81526004016120199493929190613168565b602060405180830381600087803b15801561203357600080fd5b505af192505050801561206457506040513d601f19601f820116820180604052508101906120619190612bfd565b60015b6120e7573d8060008114612094576040519150601f19603f3d011682016040523d82523d6000602084013e612099565b606091505b506000815114156120df576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d690613275565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061213c565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121b98383836124bf565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121fc576121f7816124c4565b61223b565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461223a57612239838261250d565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561227e576122798161267a565b6122bd565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122bc576122bb828261274b565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612332576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612329906133d5565b60405180910390fd5b61233b816115b7565b1561237b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612372906132d5565b60405180910390fd5b61238760008383611f3d565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123d7919061358f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461249860008383611f4d565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161251a84610c9d565b6125249190613670565b9050600060076000848152602001908152602001600020549050818114612609576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061268e9190613670565b90506000600960008481526020019081526020016000205490506000600883815481106126be576126bd613929565b5b9060005260206000200154905080600883815481106126e0576126df613929565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061272f5761272e6138fa565b5b6001900381819060005260206000200160009055905550505050565b600061275683610c9d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546127d690613790565b90600052602060002090601f0160209004810192826127f8576000855561283f565b82601f1061281157805160ff191683800117855561283f565b8280016001018555821561283f579182015b8281111561283e578251825591602001919060010190612823565b5b50905061284c9190612850565b5090565b5b80821115612869576000816000905550600101612851565b5090565b600061288061287b846134d5565b6134b0565b90508281526020810184848401111561289c5761289b61398c565b5b6128a784828561374e565b509392505050565b60006128c26128bd84613506565b6134b0565b9050828152602081018484840111156128de576128dd61398c565b5b6128e984828561374e565b509392505050565b60008135905061290081613ece565b92915050565b60008135905061291581613ee5565b92915050565b60008151905061292a81613ee5565b92915050565b60008135905061293f81613efc565b92915050565b60008151905061295481613efc565b92915050565b600082601f83011261296f5761296e613987565b5b813561297f84826020860161286d565b91505092915050565b600082601f83011261299d5761299c613987565b5b81356129ad8482602086016128af565b91505092915050565b6000813590506129c581613f13565b92915050565b6000815190506129da81613f13565b92915050565b6000602082840312156129f6576129f5613996565b5b6000612a04848285016128f1565b91505092915050565b60008060408385031215612a2457612a23613996565b5b6000612a32858286016128f1565b9250506020612a43858286016128f1565b9150509250929050565b600080600060608486031215612a6657612a65613996565b5b6000612a74868287016128f1565b9350506020612a85868287016128f1565b9250506040612a96868287016129b6565b9150509250925092565b60008060008060808587031215612aba57612ab9613996565b5b6000612ac8878288016128f1565b9450506020612ad9878288016128f1565b9350506040612aea878288016129b6565b925050606085013567ffffffffffffffff811115612b0b57612b0a613991565b5b612b178782880161295a565b91505092959194509250565b60008060408385031215612b3a57612b39613996565b5b6000612b48858286016128f1565b9250506020612b5985828601612906565b9150509250929050565b60008060408385031215612b7a57612b79613996565b5b6000612b88858286016128f1565b9250506020612b99858286016129b6565b9150509250929050565b600060208284031215612bb957612bb8613996565b5b6000612bc78482850161291b565b91505092915050565b600060208284031215612be657612be5613996565b5b6000612bf484828501612930565b91505092915050565b600060208284031215612c1357612c12613996565b5b6000612c2184828501612945565b91505092915050565b600060208284031215612c4057612c3f613996565b5b600082013567ffffffffffffffff811115612c5e57612c5d613991565b5b612c6a84828501612988565b91505092915050565b600060208284031215612c8957612c88613996565b5b6000612c97848285016129b6565b91505092915050565b600060208284031215612cb657612cb5613996565b5b6000612cc4848285016129cb565b91505092915050565b612cd6816136a4565b82525050565b612ce5816136b6565b82525050565b6000612cf68261354c565b612d008185613562565b9350612d1081856020860161375d565b612d198161399b565b840191505092915050565b612d2d81613718565b82525050565b6000612d3e82613557565b612d488185613573565b9350612d5881856020860161375d565b612d618161399b565b840191505092915050565b6000612d7782613557565b612d818185613584565b9350612d9181856020860161375d565b80840191505092915050565b60008154612daa81613790565b612db48186613584565b94506001821660008114612dcf5760018114612de057612e13565b60ff19831686528186019350612e13565b612de985613537565b60005b83811015612e0b57815481890152600182019150602081019050612dec565b838801955050505b50505092915050565b6000612e29601883613573565b9150612e34826139ac565b602082019050919050565b6000612e4c602b83613573565b9150612e57826139d5565b604082019050919050565b6000612e6f603283613573565b9150612e7a82613a24565b604082019050919050565b6000612e92602683613573565b9150612e9d82613a73565b604082019050919050565b6000612eb5602583613573565b9150612ec082613ac2565b604082019050919050565b6000612ed8601c83613573565b9150612ee382613b11565b602082019050919050565b6000612efb601383613573565b9150612f0682613b3a565b602082019050919050565b6000612f1e602483613573565b9150612f2982613b63565b604082019050919050565b6000612f41601983613573565b9150612f4c82613bb2565b602082019050919050565b6000612f64602c83613573565b9150612f6f82613bdb565b604082019050919050565b6000612f87603883613573565b9150612f9282613c2a565b604082019050919050565b6000612faa602a83613573565b9150612fb582613c79565b604082019050919050565b6000612fcd602983613573565b9150612fd882613cc8565b604082019050919050565b6000612ff0602083613573565b9150612ffb82613d17565b602082019050919050565b6000613013602c83613573565b915061301e82613d40565b604082019050919050565b6000613036600583613584565b915061304182613d8f565b600582019050919050565b6000613059602083613573565b915061306482613db8565b602082019050919050565b600061307c602183613573565b915061308782613de1565b604082019050919050565b600061309f603183613573565b91506130aa82613e30565b604082019050919050565b60006130c2602c83613573565b91506130cd82613e7f565b604082019050919050565b6130e18161370e565b82525050565b60006130f38285612d9d565b91506130ff8284612d6c565b915061310a82613029565b91508190509392505050565b600060208201905061312b6000830184612ccd565b92915050565b60006060820190506131466000830186612ccd565b6131536020830185612ccd565b61316060408301846130d8565b949350505050565b600060808201905061317d6000830187612ccd565b61318a6020830186612ccd565b61319760408301856130d8565b81810360608301526131a98184612ceb565b905095945050505050565b60006040820190506131c96000830185612ccd565b6131d660208301846130d8565b9392505050565b60006020820190506131f26000830184612cdc565b92915050565b600060208201905061320d6000830184612d24565b92915050565b6000602082019050818103600083015261322d8184612d33565b905092915050565b6000602082019050818103600083015261324e81612e1c565b9050919050565b6000602082019050818103600083015261326e81612e3f565b9050919050565b6000602082019050818103600083015261328e81612e62565b9050919050565b600060208201905081810360008301526132ae81612e85565b9050919050565b600060208201905081810360008301526132ce81612ea8565b9050919050565b600060208201905081810360008301526132ee81612ecb565b9050919050565b6000602082019050818103600083015261330e81612eee565b9050919050565b6000602082019050818103600083015261332e81612f11565b9050919050565b6000602082019050818103600083015261334e81612f34565b9050919050565b6000602082019050818103600083015261336e81612f57565b9050919050565b6000602082019050818103600083015261338e81612f7a565b9050919050565b600060208201905081810360008301526133ae81612f9d565b9050919050565b600060208201905081810360008301526133ce81612fc0565b9050919050565b600060208201905081810360008301526133ee81612fe3565b9050919050565b6000602082019050818103600083015261340e81613006565b9050919050565b6000602082019050818103600083015261342e8161304c565b9050919050565b6000602082019050818103600083015261344e8161306f565b9050919050565b6000602082019050818103600083015261346e81613092565b9050919050565b6000602082019050818103600083015261348e816130b5565b9050919050565b60006020820190506134aa60008301846130d8565b92915050565b60006134ba6134cb565b90506134c682826137c2565b919050565b6000604051905090565b600067ffffffffffffffff8211156134f0576134ef613958565b5b6134f98261399b565b9050602081019050919050565b600067ffffffffffffffff82111561352157613520613958565b5b61352a8261399b565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061359a8261370e565b91506135a58361370e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135da576135d961386d565b5b828201905092915050565b60006135f08261370e565b91506135fb8361370e565b92508261360b5761360a61389c565b5b828204905092915050565b60006136218261370e565b915061362c8361370e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136655761366461386d565b5b828202905092915050565b600061367b8261370e565b91506136868361370e565b9250828210156136995761369861386d565b5b828203905092915050565b60006136af826136ee565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006137238261372a565b9050919050565b60006137358261373c565b9050919050565b6000613747826136ee565b9050919050565b82818337600083830152505050565b60005b8381101561377b578082015181840152602081019050613760565b8381111561378a576000848401525b50505050565b600060028204905060018216806137a857607f821691505b602082108114156137bc576137bb6138cb565b5b50919050565b6137cb8261399b565b810181811067ffffffffffffffff821117156137ea576137e9613958565b5b80604052505050565b60006137fe8261370e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156138315761383061386d565b5b600182019050919050565b60006138478261370e565b91506138528361370e565b9250826138625761386161389c565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f6d6178207472616e73616374696f6e2065786365656465640000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f6d617820737570706c7920657863656564656400000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b613ed7816136a4565b8114613ee257600080fd5b50565b613eee816136b6565b8114613ef957600080fd5b50565b613f05816136c2565b8114613f1057600080fd5b50565b613f1c8161370e565b8114613f2757600080fd5b5056fea264697066735822122052d12b16124f11f63141003e99b846edbae69723ad7d9d46ef0949913977397f64736f6c634300080700330000000000000000000000001599fe55cda767b1f631ee7d414b41f5d6de393d
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
0000000000000000000000001599fe55cda767b1f631ee7d414b41f5d6de393d
-----Decoded View---------------
Arg [0] : _tokenAddress (address): 0x1599fe55cda767b1f631ee7d414b41f5d6de393d
-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000001599fe55cda767b1f631ee7d414b41f5d6de393d
Deployed ByteCode Sourcemap
49906:2319:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51522:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27637:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29197:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28720:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41458:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29947:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41126:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50115:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50042:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30357:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41648:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51870:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27331:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50226:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27061:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6195:103;;;;;;;;;;;;;:::i;:::-;;5544:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51976:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27806:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50007:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50181:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50440:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29490:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30613:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51220:294;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52085:133;;;;;;;;;;;;;:::i;:::-;;29716:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6453:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51522:212;51661:4;51690:36;51714:11;51690:23;:36::i;:::-;51683:43;;51522:212;;;:::o;27637:100::-;27691:13;27724:5;27717:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27637:100;:::o;29197:221::-;29273:7;29301:16;29309:7;29301;:16::i;:::-;29293:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29386:15;:24;29402:7;29386:24;;;;;;;;;;;;;;;;;;;;;29379:31;;29197:221;;;:::o;28720:411::-;28801:13;28817:23;28832:7;28817:14;:23::i;:::-;28801:39;;28865:5;28859:11;;:2;:11;;;;28851:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;28959:5;28943:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;28968:37;28985:5;28992:12;:10;:12::i;:::-;28968:16;:37::i;:::-;28943:62;28921:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;29102:21;29111:2;29115:7;29102:8;:21::i;:::-;28790:341;28720:411;;:::o;41458:113::-;41519:7;41546:10;:17;;;;41539:24;;41458:113;:::o;29947:339::-;30142:41;30161:12;:10;:12::i;:::-;30175:7;30142:18;:41::i;:::-;30134:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30250:28;30260:4;30266:2;30270:7;30250:9;:28::i;:::-;29947:339;;;:::o;41126:256::-;41223:7;41259:23;41276:5;41259:16;:23::i;:::-;41251:5;:31;41243:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41348:12;:19;41361:5;41348:19;;;;;;;;;;;;;;;:26;41368:5;41348:26;;;;;;;;;;;;41341:33;;41126:256;;;;:::o;50115:43::-;;;:::o;50042:39::-;;;;:::o;30357:185::-;30495:39;30512:4;30518:2;30522:7;30495:39;;;;;;;;;;;;:16;:39::i;:::-;30357:185;;;:::o;41648:233::-;41723:7;41759:30;:28;:30::i;:::-;41751:5;:38;41743:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41856:10;41867:5;41856:17;;;;;;;;:::i;:::-;;;;;;;;;;41849:24;;41648:233;;;:::o;51870:98::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51952:8:::1;51942:7;:18;;;;;;;;;;;;:::i;:::-;;51870:98:::0;:::o;27331:239::-;27403:7;27423:13;27439:7;:16;27447:7;27439:16;;;;;;;;;;;;;;;;;;;;;27423:32;;27491:1;27474:19;;:5;:19;;;;27466:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27557:5;27550:12;;;27331:239;;;:::o;50226:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;27061:208::-;27133:7;27178:1;27161:19;;:5;:19;;;;27153:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27245:9;:16;27255:5;27245:16;;;;;;;;;;;;;;;;27238:23;;27061:208;;;:::o;6195:103::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6260:30:::1;6287:1;6260:18;:30::i;:::-;6195:103::o:0;5544:87::-;5590:7;5617:6;;;;;;;;;;;5610:13;;5544:87;:::o;51976:101::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52061:8:::1;52049:9;:20;;;;:::i;:::-;52041:5;:28;;;;51976:101:::0;:::o;27806:104::-;27862:13;27895:7;27888:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27806:104;:::o;50007:26::-;;;;;;;;;;;;;:::o;50181:38::-;;;;:::o;50440:556::-;50508:14;50525:13;:11;:13::i;:::-;50508:30;;50593:1;50571:19;;:23;;;;:::i;:::-;50557:11;:37;50549:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50678:1;50665:10;:14;;;;:::i;:::-;50651:11;50642:6;:20;;;;:::i;:::-;:37;50634:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;50721:9;50716:273;50740:11;50736:1;:15;50716:273;;;50773:12;;;;;;;;;;;:25;;;50799:10;50819:4;50826:5;;50773:59;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;50847:15;50865:25;:15;:23;:25::i;:::-;50847:43;;50905:27;:15;:25;:27::i;:::-;50947:30;50957:10;50969:7;50947:9;:30::i;:::-;50758:231;50753:3;;;;;:::i;:::-;;;;50716:273;;;;50490:506;50440:556;:::o;29490:155::-;29585:52;29604:12;:10;:12::i;:::-;29618:8;29628;29585:18;:52::i;:::-;29490:155;;:::o;30613:328::-;30788:41;30807:12;:10;:12::i;:::-;30821:7;30788:18;:41::i;:::-;30780:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30894:39;30908:4;30914:2;30918:7;30927:5;30894:13;:39::i;:::-;30613:328;;;;:::o;51220:294::-;51285:13;51386:7;51416:26;51433:8;51416:16;:26::i;:::-;51347:144;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51315:191;;51220:294;;;:::o;52085:133::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52138:12:::1;;;;;;;;;;;:21;;;52160:10;52172:12;;;;;;;;;;;:22;;;52203:4;52172:37;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;52138:72;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;52085:133::o:0;29716:164::-;29813:4;29837:18;:25;29856:5;29837:25;;;;;;;;;;;;;;;:35;29863:8;29837:35;;;;;;;;;;;;;;;;;;;;;;;;;29830:42;;29716:164;;;;:::o;6453:201::-;5775:12;:10;:12::i;:::-;5764:23;;:7;:5;:7::i;:::-;:23;;;5756:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6562:1:::1;6542:22;;:8;:22;;;;6534:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6618:28;6637:8;6618:18;:28::i;:::-;6453:201:::0;:::o;40818:224::-;40920:4;40959:35;40944:50;;;:11;:50;;;;:90;;;;40998:36;41022:11;40998:23;:36::i;:::-;40944:90;40937:97;;40818:224;;;:::o;32451:127::-;32516:4;32568:1;32540:30;;:7;:16;32548:7;32540:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32533:37;;32451:127;;;:::o;4268:98::-;4321:7;4348:10;4341:17;;4268:98;:::o;36597:174::-;36699:2;36672:15;:24;36688:7;36672:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36755:7;36751:2;36717:46;;36726:23;36741:7;36726:14;:23::i;:::-;36717:46;;;;;;;;;;;;36597:174;;:::o;32745:348::-;32838:4;32863:16;32871:7;32863;:16::i;:::-;32855:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32939:13;32955:23;32970:7;32955:14;:23::i;:::-;32939:39;;33008:5;32997:16;;:7;:16;;;:52;;;;33017:32;33034:5;33041:7;33017:16;:32::i;:::-;32997:52;:87;;;;33077:7;33053:31;;:20;33065:7;33053:11;:20::i;:::-;:31;;;32997:87;32989:96;;;32745:348;;;;:::o;35854:625::-;36013:4;35986:31;;:23;36001:7;35986:14;:23::i;:::-;:31;;;35978:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;36092:1;36078:16;;:2;:16;;;;36070:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36148:39;36169:4;36175:2;36179:7;36148:20;:39::i;:::-;36252:29;36269:1;36273:7;36252:8;:29::i;:::-;36313:1;36294:9;:15;36304:4;36294:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36342:1;36325:9;:13;36335:2;36325:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36373:2;36354:7;:16;36362:7;36354:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36412:7;36408:2;36393:27;;36402:4;36393:27;;;;;;;;;;;;36433:38;36453:4;36459:2;36463:7;36433:19;:38::i;:::-;35854:625;;;:::o;6814:191::-;6888:16;6907:6;;;;;;;;;;;6888:25;;6933:8;6924:6;;:17;;;;;;;;;;;;;;;;;;6988:8;6957:40;;6978:8;6957:40;;;;;;;;;;;;6877:128;6814:191;:::o;872:114::-;937:7;964;:14;;;957:21;;872:114;;;:::o;994:127::-;1101:1;1083:7;:14;;;:19;;;;;;;;;;;994:127;:::o;33435:110::-;33511:26;33521:2;33525:7;33511:26;;;;;;;;;;;;:9;:26::i;:::-;33435:110;;:::o;36913:315::-;37068:8;37059:17;;:5;:17;;;;37051:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;37155:8;37117:18;:25;37136:5;37117:25;;;;;;;;;;;;;;;:35;37143:8;37117:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;37201:8;37179:41;;37194:5;37179:41;;;37211:8;37179:41;;;;;;:::i;:::-;;;;;;;;36913:315;;;:::o;31823:::-;31980:28;31990:4;31996:2;32000:7;31980:9;:28::i;:::-;32027:48;32050:4;32056:2;32060:7;32069:5;32027:22;:48::i;:::-;32019:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;31823:315;;;;:::o;1830:723::-;1886:13;2116:1;2107:5;:10;2103:53;;;2134:10;;;;;;;;;;;;;;;;;;;;;2103:53;2166:12;2181:5;2166:20;;2197:14;2222:78;2237:1;2229:4;:9;2222:78;;2255:8;;;;;:::i;:::-;;;;2286:2;2278:10;;;;;:::i;:::-;;;2222:78;;;2310:19;2342:6;2332:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2310:39;;2360:154;2376:1;2367:5;:10;2360:154;;2404:1;2394:11;;;;;:::i;:::-;;;2471:2;2463:5;:10;;;;:::i;:::-;2450:2;:24;;;;:::i;:::-;2437:39;;2420:6;2427;2420:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2500:2;2491:11;;;;;:::i;:::-;;;2360:154;;;2538:6;2524:21;;;;;1830:723;;;;:::o;26692:305::-;26794:4;26846:25;26831:40;;;:11;:40;;;;:105;;;;26903:33;26888:48;;;:11;:48;;;;26831:105;:158;;;;26953:36;26977:11;26953:23;:36::i;:::-;26831:158;26811:178;;26692:305;;;:::o;51008:204::-;51159:45;51186:4;51192:2;51196:7;51159:26;:45::i;:::-;51008:204;;;:::o;39675:125::-;;;;:::o;33772:321::-;33902:18;33908:2;33912:7;33902:5;:18::i;:::-;33953:54;33984:1;33988:2;33992:7;34001:5;33953:22;:54::i;:::-;33931:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;33772:321;;;:::o;37793:799::-;37948:4;37969:15;:2;:13;;;:15::i;:::-;37965:620;;;38021:2;38005:36;;;38042:12;:10;:12::i;:::-;38056:4;38062:7;38071:5;38005:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38001:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38264:1;38247:6;:13;:18;38243:272;;;38290:60;;;;;;;;;;:::i;:::-;;;;;;;;38243:272;38465:6;38459:13;38450:6;38446:2;38442:15;38435:38;38001:529;38138:41;;;38128:51;;;:6;:51;;;;38121:58;;;;;37965:620;38569:4;38562:11;;37793:799;;;;;;;:::o;18351:157::-;18436:4;18475:25;18460:40;;;:11;:40;;;;18453:47;;18351:157;;;:::o;42494:589::-;42638:45;42665:4;42671:2;42675:7;42638:26;:45::i;:::-;42716:1;42700:18;;:4;:18;;;42696:187;;;42735:40;42767:7;42735:31;:40::i;:::-;42696:187;;;42805:2;42797:10;;:4;:10;;;42793:90;;42824:47;42857:4;42863:7;42824:32;:47::i;:::-;42793:90;42696:187;42911:1;42897:16;;:2;:16;;;42893:183;;;42930:45;42967:7;42930:36;:45::i;:::-;42893:183;;;43003:4;42997:10;;:2;:10;;;42993:83;;43024:40;43052:2;43056:7;43024:27;:40::i;:::-;42993:83;42893:183;42494:589;;;:::o;34429:439::-;34523:1;34509:16;;:2;:16;;;;34501:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34582:16;34590:7;34582;:16::i;:::-;34581:17;34573:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34644:45;34673:1;34677:2;34681:7;34644:20;:45::i;:::-;34719:1;34702:9;:13;34712:2;34702:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34750:2;34731:7;:16;34739:7;34731:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34795:7;34791:2;34770:33;;34787:1;34770:33;;;;;;;;;;;;34816:44;34844:1;34848:2;34852:7;34816:19;:44::i;:::-;34429:439;;:::o;8245:326::-;8305:4;8562:1;8540:7;:19;;;:23;8533:30;;8245:326;;;:::o;39164:126::-;;;;:::o;43806:164::-;43910:10;:17;;;;43883:15;:24;43899:7;43883:24;;;;;;;;;;;:44;;;;43938:10;43954:7;43938:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43806:164;:::o;44597:988::-;44863:22;44913:1;44888:22;44905:4;44888:16;:22::i;:::-;:26;;;;:::i;:::-;44863:51;;44925:18;44946:17;:26;44964:7;44946:26;;;;;;;;;;;;44925:47;;45093:14;45079:10;:28;45075:328;;45124:19;45146:12;:18;45159:4;45146:18;;;;;;;;;;;;;;;:34;45165:14;45146:34;;;;;;;;;;;;45124:56;;45230:11;45197:12;:18;45210:4;45197:18;;;;;;;;;;;;;;;:30;45216:10;45197:30;;;;;;;;;;;:44;;;;45347:10;45314:17;:30;45332:11;45314:30;;;;;;;;;;;:43;;;;45109:294;45075:328;45499:17;:26;45517:7;45499:26;;;;;;;;;;;45492:33;;;45543:12;:18;45556:4;45543:18;;;;;;;;;;;;;;;:34;45562:14;45543:34;;;;;;;;;;;45536:41;;;44678:907;;44597:988;;:::o;45880:1079::-;46133:22;46178:1;46158:10;:17;;;;:21;;;;:::i;:::-;46133:46;;46190:18;46211:15;:24;46227:7;46211:24;;;;;;;;;;;;46190:45;;46562:19;46584:10;46595:14;46584:26;;;;;;;;:::i;:::-;;;;;;;;;;46562:48;;46648:11;46623:10;46634;46623:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;46759:10;46728:15;:28;46744:11;46728:28;;;;;;;;;;;:41;;;;46900:15;:24;46916:7;46900:24;;;;;;;;;;;46893:31;;;46935:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45951:1008;;;45880:1079;:::o;43384:221::-;43469:14;43486:20;43503:2;43486:16;:20::i;:::-;43469:37;;43544:7;43517:12;:16;43530:2;43517:16;;;;;;;;;;;;;;;:24;43534:6;43517:24;;;;;;;;;;;:34;;;;43591:6;43562:17;:26;43580:7;43562:26;;;;;;;;;;;:35;;;;43458:147;43384:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249: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::-;1179:5;1210:6;1204:13;1195:22;;1226:30;1250:5;1226:30;:::i;:::-;1125:137;;;;:::o;1268:::-;1313:5;1351:6;1338:20;1329:29;;1367:32;1393:5;1367:32;:::i;:::-;1268:137;;;;:::o;1411:141::-;1467:5;1498:6;1492:13;1483:22;;1514:32;1540:5;1514:32;:::i;:::-;1411:141;;;;:::o;1571:338::-;1626:5;1675:3;1668:4;1660:6;1656:17;1652:27;1642:122;;1683:79;;:::i;:::-;1642:122;1800:6;1787:20;1825:78;1899:3;1891:6;1884:4;1876:6;1872:17;1825:78;:::i;:::-;1816:87;;1632:277;1571:338;;;;:::o;1929:340::-;1985:5;2034:3;2027:4;2019:6;2015:17;2011:27;2001:122;;2042:79;;:::i;:::-;2001:122;2159:6;2146:20;2184:79;2259:3;2251:6;2244:4;2236:6;2232:17;2184:79;:::i;:::-;2175:88;;1991:278;1929:340;;;;:::o;2275:139::-;2321:5;2359:6;2346:20;2337:29;;2375:33;2402:5;2375:33;:::i;:::-;2275:139;;;;:::o;2420:143::-;2477:5;2508:6;2502:13;2493:22;;2524:33;2551:5;2524:33;:::i;:::-;2420:143;;;;:::o;2569:329::-;2628:6;2677:2;2665:9;2656:7;2652:23;2648:32;2645:119;;;2683:79;;:::i;:::-;2645:119;2803:1;2828:53;2873:7;2864:6;2853:9;2849:22;2828:53;:::i;:::-;2818:63;;2774:117;2569:329;;;;:::o;2904:474::-;2972:6;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;2904:474;;;;;:::o;3384:619::-;3461:6;3469;3477;3526:2;3514:9;3505:7;3501:23;3497:32;3494:119;;;3532:79;;:::i;:::-;3494:119;3652:1;3677:53;3722:7;3713:6;3702:9;3698:22;3677:53;:::i;:::-;3667:63;;3623:117;3779:2;3805:53;3850:7;3841:6;3830:9;3826:22;3805:53;:::i;:::-;3795:63;;3750:118;3907:2;3933:53;3978:7;3969:6;3958:9;3954:22;3933:53;:::i;:::-;3923:63;;3878:118;3384:619;;;;;:::o;4009:943::-;4104:6;4112;4120;4128;4177:3;4165:9;4156:7;4152:23;4148:33;4145:120;;;4184:79;;:::i;:::-;4145:120;4304:1;4329:53;4374:7;4365:6;4354:9;4350:22;4329:53;:::i;:::-;4319:63;;4275:117;4431:2;4457:53;4502:7;4493:6;4482:9;4478:22;4457:53;:::i;:::-;4447:63;;4402:118;4559:2;4585:53;4630:7;4621:6;4610:9;4606:22;4585:53;:::i;:::-;4575:63;;4530:118;4715:2;4704:9;4700:18;4687:32;4746:18;4738:6;4735:30;4732:117;;;4768:79;;:::i;:::-;4732:117;4873:62;4927:7;4918:6;4907:9;4903:22;4873:62;:::i;:::-;4863:72;;4658:287;4009:943;;;;;;;:::o;4958:468::-;5023:6;5031;5080:2;5068:9;5059:7;5055:23;5051:32;5048:119;;;5086:79;;:::i;:::-;5048:119;5206:1;5231:53;5276:7;5267:6;5256:9;5252:22;5231:53;:::i;:::-;5221:63;;5177:117;5333:2;5359:50;5401:7;5392:6;5381:9;5377:22;5359:50;:::i;:::-;5349:60;;5304:115;4958:468;;;;;:::o;5432:474::-;5500:6;5508;5557:2;5545:9;5536:7;5532:23;5528:32;5525:119;;;5563:79;;:::i;:::-;5525:119;5683:1;5708:53;5753:7;5744:6;5733:9;5729:22;5708:53;:::i;:::-;5698:63;;5654:117;5810:2;5836:53;5881:7;5872:6;5861:9;5857:22;5836:53;:::i;:::-;5826:63;;5781:118;5432:474;;;;;:::o;5912:345::-;5979:6;6028:2;6016:9;6007:7;6003:23;5999:32;5996:119;;;6034:79;;:::i;:::-;5996:119;6154:1;6179:61;6232:7;6223:6;6212:9;6208:22;6179:61;:::i;:::-;6169:71;;6125:125;5912:345;;;;:::o;6263:327::-;6321:6;6370:2;6358:9;6349:7;6345:23;6341:32;6338:119;;;6376:79;;:::i;:::-;6338:119;6496:1;6521:52;6565:7;6556:6;6545:9;6541:22;6521:52;:::i;:::-;6511:62;;6467:116;6263:327;;;;:::o;6596:349::-;6665:6;6714:2;6702:9;6693:7;6689:23;6685:32;6682:119;;;6720:79;;:::i;:::-;6682:119;6840:1;6865:63;6920:7;6911:6;6900:9;6896:22;6865:63;:::i;:::-;6855:73;;6811:127;6596:349;;;;:::o;6951:509::-;7020:6;7069:2;7057:9;7048:7;7044:23;7040:32;7037:119;;;7075:79;;:::i;:::-;7037:119;7223:1;7212:9;7208:17;7195:31;7253:18;7245:6;7242:30;7239:117;;;7275:79;;:::i;:::-;7239:117;7380:63;7435:7;7426:6;7415:9;7411:22;7380:63;:::i;:::-;7370:73;;7166:287;6951:509;;;;:::o;7466:329::-;7525:6;7574:2;7562:9;7553:7;7549:23;7545:32;7542:119;;;7580:79;;:::i;:::-;7542:119;7700:1;7725:53;7770:7;7761:6;7750:9;7746:22;7725:53;:::i;:::-;7715:63;;7671:117;7466:329;;;;:::o;7801:351::-;7871:6;7920:2;7908:9;7899:7;7895:23;7891:32;7888:119;;;7926:79;;:::i;:::-;7888:119;8046:1;8071:64;8127:7;8118:6;8107:9;8103:22;8071:64;:::i;:::-;8061:74;;8017:128;7801:351;;;;:::o;8158:118::-;8245:24;8263:5;8245:24;:::i;:::-;8240:3;8233:37;8158:118;;:::o;8282:109::-;8363:21;8378:5;8363:21;:::i;:::-;8358:3;8351:34;8282:109;;:::o;8397:360::-;8483:3;8511:38;8543:5;8511:38;:::i;:::-;8565:70;8628:6;8623:3;8565:70;:::i;:::-;8558:77;;8644:52;8689:6;8684:3;8677:4;8670:5;8666:16;8644:52;:::i;:::-;8721:29;8743:6;8721:29;:::i;:::-;8716:3;8712:39;8705:46;;8487:270;8397:360;;;;:::o;8763:161::-;8865:52;8911:5;8865:52;:::i;:::-;8860:3;8853:65;8763:161;;:::o;8930:364::-;9018:3;9046:39;9079:5;9046:39;:::i;:::-;9101:71;9165:6;9160:3;9101:71;:::i;:::-;9094:78;;9181:52;9226:6;9221:3;9214:4;9207:5;9203:16;9181:52;:::i;:::-;9258:29;9280:6;9258:29;:::i;:::-;9253:3;9249:39;9242:46;;9022:272;8930:364;;;;:::o;9300:377::-;9406:3;9434:39;9467:5;9434:39;:::i;:::-;9489:89;9571:6;9566:3;9489:89;:::i;:::-;9482:96;;9587:52;9632:6;9627:3;9620:4;9613:5;9609:16;9587:52;:::i;:::-;9664:6;9659:3;9655:16;9648:23;;9410:267;9300:377;;;;:::o;9707:845::-;9810:3;9847:5;9841:12;9876:36;9902:9;9876:36;:::i;:::-;9928:89;10010:6;10005:3;9928:89;:::i;:::-;9921:96;;10048:1;10037:9;10033:17;10064:1;10059:137;;;;10210:1;10205:341;;;;10026:520;;10059:137;10143:4;10139:9;10128;10124:25;10119:3;10112:38;10179:6;10174:3;10170:16;10163:23;;10059:137;;10205:341;10272:38;10304:5;10272:38;:::i;:::-;10332:1;10346:154;10360:6;10357:1;10354:13;10346:154;;;10434:7;10428:14;10424:1;10419:3;10415:11;10408:35;10484:1;10475:7;10471:15;10460:26;;10382:4;10379:1;10375:12;10370:17;;10346:154;;;10529:6;10524:3;10520:16;10513:23;;10212:334;;10026:520;;9814:738;;9707:845;;;;:::o;10558:366::-;10700:3;10721:67;10785:2;10780:3;10721:67;:::i;:::-;10714:74;;10797:93;10886:3;10797:93;:::i;:::-;10915:2;10910:3;10906:12;10899:19;;10558:366;;;:::o;10930:::-;11072:3;11093:67;11157:2;11152:3;11093:67;:::i;:::-;11086:74;;11169:93;11258:3;11169:93;:::i;:::-;11287:2;11282:3;11278:12;11271:19;;10930:366;;;:::o;11302:::-;11444:3;11465:67;11529:2;11524:3;11465:67;:::i;:::-;11458:74;;11541:93;11630:3;11541:93;:::i;:::-;11659:2;11654:3;11650:12;11643:19;;11302:366;;;:::o;11674:::-;11816:3;11837:67;11901:2;11896:3;11837:67;:::i;:::-;11830:74;;11913:93;12002:3;11913:93;:::i;:::-;12031:2;12026:3;12022:12;12015:19;;11674:366;;;:::o;12046:::-;12188:3;12209:67;12273:2;12268:3;12209:67;:::i;:::-;12202:74;;12285:93;12374:3;12285:93;:::i;:::-;12403:2;12398:3;12394:12;12387:19;;12046:366;;;:::o;12418:::-;12560:3;12581:67;12645:2;12640:3;12581:67;:::i;:::-;12574:74;;12657:93;12746:3;12657:93;:::i;:::-;12775:2;12770:3;12766:12;12759:19;;12418:366;;;:::o;12790:::-;12932:3;12953:67;13017:2;13012:3;12953:67;:::i;:::-;12946:74;;13029:93;13118:3;13029:93;:::i;:::-;13147:2;13142:3;13138:12;13131:19;;12790:366;;;:::o;13162:::-;13304:3;13325:67;13389:2;13384:3;13325:67;:::i;:::-;13318:74;;13401:93;13490:3;13401:93;:::i;:::-;13519:2;13514:3;13510:12;13503:19;;13162:366;;;:::o;13534:::-;13676:3;13697:67;13761:2;13756:3;13697:67;:::i;:::-;13690:74;;13773:93;13862:3;13773:93;:::i;:::-;13891:2;13886:3;13882:12;13875:19;;13534:366;;;:::o;13906:::-;14048:3;14069:67;14133:2;14128:3;14069:67;:::i;:::-;14062:74;;14145:93;14234:3;14145:93;:::i;:::-;14263:2;14258:3;14254:12;14247:19;;13906:366;;;:::o;14278:::-;14420:3;14441:67;14505:2;14500:3;14441:67;:::i;:::-;14434:74;;14517:93;14606:3;14517:93;:::i;:::-;14635:2;14630:3;14626:12;14619:19;;14278:366;;;:::o;14650:::-;14792:3;14813:67;14877:2;14872:3;14813:67;:::i;:::-;14806:74;;14889:93;14978:3;14889:93;:::i;:::-;15007:2;15002:3;14998:12;14991:19;;14650:366;;;:::o;15022:::-;15164:3;15185:67;15249:2;15244:3;15185:67;:::i;:::-;15178:74;;15261:93;15350:3;15261:93;:::i;:::-;15379:2;15374:3;15370:12;15363:19;;15022:366;;;:::o;15394:::-;15536:3;15557:67;15621:2;15616:3;15557:67;:::i;:::-;15550:74;;15633:93;15722:3;15633:93;:::i;:::-;15751:2;15746:3;15742:12;15735:19;;15394:366;;;:::o;15766:::-;15908:3;15929:67;15993:2;15988:3;15929:67;:::i;:::-;15922:74;;16005:93;16094:3;16005:93;:::i;:::-;16123:2;16118:3;16114:12;16107:19;;15766:366;;;:::o;16138:400::-;16298:3;16319:84;16401:1;16396:3;16319:84;:::i;:::-;16312:91;;16412:93;16501:3;16412:93;:::i;:::-;16530:1;16525:3;16521:11;16514:18;;16138:400;;;:::o;16544:366::-;16686:3;16707:67;16771:2;16766:3;16707:67;:::i;:::-;16700:74;;16783:93;16872:3;16783:93;:::i;:::-;16901:2;16896:3;16892:12;16885:19;;16544:366;;;:::o;16916:::-;17058:3;17079:67;17143:2;17138:3;17079:67;:::i;:::-;17072:74;;17155:93;17244:3;17155:93;:::i;:::-;17273:2;17268:3;17264:12;17257:19;;16916:366;;;:::o;17288:::-;17430:3;17451:67;17515:2;17510:3;17451:67;:::i;:::-;17444:74;;17527:93;17616:3;17527:93;:::i;:::-;17645:2;17640:3;17636:12;17629:19;;17288:366;;;:::o;17660:::-;17802:3;17823:67;17887:2;17882:3;17823:67;:::i;:::-;17816:74;;17899:93;17988:3;17899:93;:::i;:::-;18017:2;18012:3;18008:12;18001:19;;17660:366;;;:::o;18032:118::-;18119:24;18137:5;18119:24;:::i;:::-;18114:3;18107:37;18032:118;;:::o;18156:695::-;18434:3;18456:92;18544:3;18535:6;18456:92;:::i;:::-;18449:99;;18565:95;18656:3;18647:6;18565:95;:::i;:::-;18558:102;;18677:148;18821:3;18677:148;:::i;:::-;18670:155;;18842:3;18835:10;;18156:695;;;;;:::o;18857:222::-;18950:4;18988:2;18977:9;18973:18;18965:26;;19001:71;19069:1;19058:9;19054:17;19045:6;19001:71;:::i;:::-;18857:222;;;;:::o;19085:442::-;19234:4;19272:2;19261:9;19257:18;19249:26;;19285:71;19353:1;19342:9;19338:17;19329:6;19285:71;:::i;:::-;19366:72;19434:2;19423:9;19419:18;19410:6;19366:72;:::i;:::-;19448;19516:2;19505:9;19501:18;19492:6;19448:72;:::i;:::-;19085:442;;;;;;:::o;19533:640::-;19728:4;19766:3;19755:9;19751:19;19743:27;;19780:71;19848:1;19837:9;19833:17;19824:6;19780:71;:::i;:::-;19861:72;19929:2;19918:9;19914:18;19905:6;19861:72;:::i;:::-;19943;20011:2;20000:9;19996:18;19987:6;19943:72;:::i;:::-;20062:9;20056:4;20052:20;20047:2;20036:9;20032:18;20025:48;20090:76;20161:4;20152:6;20090:76;:::i;:::-;20082:84;;19533:640;;;;;;;:::o;20179:332::-;20300:4;20338:2;20327:9;20323:18;20315:26;;20351:71;20419:1;20408:9;20404:17;20395:6;20351:71;:::i;:::-;20432:72;20500:2;20489:9;20485:18;20476:6;20432:72;:::i;:::-;20179:332;;;;;:::o;20517:210::-;20604:4;20642:2;20631:9;20627:18;20619:26;;20655:65;20717:1;20706:9;20702:17;20693:6;20655:65;:::i;:::-;20517:210;;;;:::o;20733:252::-;20841:4;20879:2;20868:9;20864:18;20856:26;;20892:86;20975:1;20964:9;20960:17;20951:6;20892:86;:::i;:::-;20733:252;;;;:::o;20991:313::-;21104:4;21142:2;21131:9;21127:18;21119:26;;21191:9;21185:4;21181:20;21177:1;21166:9;21162:17;21155:47;21219:78;21292:4;21283:6;21219:78;:::i;:::-;21211:86;;20991:313;;;;:::o;21310:419::-;21476:4;21514:2;21503:9;21499:18;21491:26;;21563:9;21557:4;21553:20;21549:1;21538:9;21534:17;21527:47;21591:131;21717:4;21591:131;:::i;:::-;21583:139;;21310:419;;;:::o;21735:::-;21901:4;21939:2;21928:9;21924:18;21916:26;;21988:9;21982:4;21978:20;21974:1;21963:9;21959:17;21952:47;22016:131;22142:4;22016:131;:::i;:::-;22008:139;;21735:419;;;:::o;22160:::-;22326:4;22364:2;22353:9;22349:18;22341:26;;22413:9;22407:4;22403:20;22399:1;22388:9;22384:17;22377:47;22441:131;22567:4;22441:131;:::i;:::-;22433:139;;22160:419;;;:::o;22585:::-;22751:4;22789:2;22778:9;22774:18;22766:26;;22838:9;22832:4;22828:20;22824:1;22813:9;22809:17;22802:47;22866:131;22992:4;22866:131;:::i;:::-;22858:139;;22585:419;;;:::o;23010:::-;23176:4;23214:2;23203:9;23199:18;23191:26;;23263:9;23257:4;23253:20;23249:1;23238:9;23234:17;23227:47;23291:131;23417:4;23291:131;:::i;:::-;23283:139;;23010:419;;;:::o;23435:::-;23601:4;23639:2;23628:9;23624:18;23616:26;;23688:9;23682:4;23678:20;23674:1;23663:9;23659:17;23652:47;23716:131;23842:4;23716:131;:::i;:::-;23708:139;;23435:419;;;:::o;23860:::-;24026:4;24064:2;24053:9;24049:18;24041:26;;24113:9;24107:4;24103:20;24099:1;24088:9;24084:17;24077:47;24141:131;24267:4;24141:131;:::i;:::-;24133:139;;23860:419;;;:::o;24285:::-;24451:4;24489:2;24478:9;24474:18;24466:26;;24538:9;24532:4;24528:20;24524:1;24513:9;24509:17;24502:47;24566:131;24692:4;24566:131;:::i;:::-;24558:139;;24285:419;;;:::o;24710:::-;24876:4;24914:2;24903:9;24899:18;24891:26;;24963:9;24957:4;24953:20;24949:1;24938:9;24934:17;24927:47;24991:131;25117:4;24991:131;:::i;:::-;24983:139;;24710:419;;;:::o;25135:::-;25301:4;25339:2;25328:9;25324:18;25316:26;;25388:9;25382:4;25378:20;25374:1;25363:9;25359:17;25352:47;25416:131;25542:4;25416:131;:::i;:::-;25408:139;;25135:419;;;:::o;25560:::-;25726:4;25764:2;25753:9;25749:18;25741:26;;25813:9;25807:4;25803:20;25799:1;25788:9;25784:17;25777:47;25841:131;25967:4;25841:131;:::i;:::-;25833:139;;25560:419;;;:::o;25985:::-;26151:4;26189:2;26178:9;26174:18;26166:26;;26238:9;26232:4;26228:20;26224:1;26213:9;26209:17;26202:47;26266:131;26392:4;26266:131;:::i;:::-;26258:139;;25985:419;;;:::o;26410:::-;26576:4;26614:2;26603:9;26599:18;26591:26;;26663:9;26657:4;26653:20;26649:1;26638:9;26634:17;26627:47;26691:131;26817:4;26691:131;:::i;:::-;26683:139;;26410:419;;;:::o;26835:::-;27001:4;27039:2;27028:9;27024:18;27016:26;;27088:9;27082:4;27078:20;27074:1;27063:9;27059:17;27052:47;27116:131;27242:4;27116:131;:::i;:::-;27108:139;;26835:419;;;:::o;27260:::-;27426:4;27464:2;27453:9;27449:18;27441:26;;27513:9;27507:4;27503:20;27499:1;27488:9;27484:17;27477:47;27541:131;27667:4;27541:131;:::i;:::-;27533:139;;27260:419;;;:::o;27685:::-;27851:4;27889:2;27878:9;27874:18;27866:26;;27938:9;27932:4;27928:20;27924:1;27913:9;27909:17;27902:47;27966:131;28092:4;27966:131;:::i;:::-;27958:139;;27685:419;;;:::o;28110:::-;28276:4;28314:2;28303:9;28299:18;28291:26;;28363:9;28357:4;28353:20;28349:1;28338:9;28334:17;28327:47;28391:131;28517:4;28391:131;:::i;:::-;28383:139;;28110:419;;;:::o;28535:::-;28701:4;28739:2;28728:9;28724:18;28716:26;;28788:9;28782:4;28778:20;28774:1;28763:9;28759:17;28752:47;28816:131;28942:4;28816:131;:::i;:::-;28808:139;;28535:419;;;:::o;28960:::-;29126:4;29164:2;29153:9;29149:18;29141:26;;29213:9;29207:4;29203:20;29199:1;29188:9;29184:17;29177:47;29241:131;29367:4;29241:131;:::i;:::-;29233:139;;28960:419;;;:::o;29385:222::-;29478:4;29516:2;29505:9;29501:18;29493:26;;29529:71;29597:1;29586:9;29582:17;29573:6;29529:71;:::i;:::-;29385:222;;;;:::o;29613:129::-;29647:6;29674:20;;:::i;:::-;29664:30;;29703:33;29731:4;29723:6;29703:33;:::i;:::-;29613:129;;;:::o;29748:75::-;29781:6;29814:2;29808:9;29798:19;;29748:75;:::o;29829:307::-;29890:4;29980:18;29972:6;29969:30;29966:56;;;30002:18;;:::i;:::-;29966:56;30040:29;30062:6;30040:29;:::i;:::-;30032:37;;30124:4;30118;30114:15;30106:23;;29829:307;;;:::o;30142:308::-;30204:4;30294:18;30286:6;30283:30;30280:56;;;30316:18;;:::i;:::-;30280:56;30354:29;30376:6;30354:29;:::i;:::-;30346:37;;30438:4;30432;30428:15;30420:23;;30142:308;;;:::o;30456:141::-;30505:4;30528:3;30520:11;;30551:3;30548:1;30541:14;30585:4;30582:1;30572:18;30564:26;;30456:141;;;:::o;30603:98::-;30654:6;30688:5;30682:12;30672:22;;30603:98;;;:::o;30707:99::-;30759:6;30793:5;30787:12;30777:22;;30707:99;;;:::o;30812:168::-;30895:11;30929:6;30924:3;30917:19;30969:4;30964:3;30960:14;30945:29;;30812:168;;;;:::o;30986:169::-;31070:11;31104:6;31099:3;31092:19;31144:4;31139:3;31135:14;31120:29;;30986:169;;;;:::o;31161:148::-;31263:11;31300:3;31285:18;;31161:148;;;;:::o;31315:305::-;31355:3;31374:20;31392:1;31374:20;:::i;:::-;31369:25;;31408:20;31426:1;31408:20;:::i;:::-;31403:25;;31562:1;31494:66;31490:74;31487:1;31484:81;31481:107;;;31568:18;;:::i;:::-;31481:107;31612:1;31609;31605:9;31598:16;;31315:305;;;;:::o;31626:185::-;31666:1;31683:20;31701:1;31683:20;:::i;:::-;31678:25;;31717:20;31735:1;31717:20;:::i;:::-;31712:25;;31756:1;31746:35;;31761:18;;:::i;:::-;31746:35;31803:1;31800;31796:9;31791:14;;31626:185;;;;:::o;31817:348::-;31857:7;31880:20;31898:1;31880:20;:::i;:::-;31875:25;;31914:20;31932:1;31914:20;:::i;:::-;31909:25;;32102:1;32034:66;32030:74;32027:1;32024:81;32019:1;32012:9;32005:17;32001:105;31998:131;;;32109:18;;:::i;:::-;31998:131;32157:1;32154;32150:9;32139:20;;31817:348;;;;:::o;32171:191::-;32211:4;32231:20;32249:1;32231:20;:::i;:::-;32226:25;;32265:20;32283:1;32265:20;:::i;:::-;32260:25;;32304:1;32301;32298:8;32295:34;;;32309:18;;:::i;:::-;32295:34;32354:1;32351;32347:9;32339:17;;32171:191;;;;:::o;32368:96::-;32405:7;32434:24;32452:5;32434:24;:::i;:::-;32423:35;;32368:96;;;:::o;32470:90::-;32504:7;32547:5;32540:13;32533:21;32522:32;;32470:90;;;:::o;32566:149::-;32602:7;32642:66;32635:5;32631:78;32620:89;;32566:149;;;:::o;32721:126::-;32758:7;32798:42;32791:5;32787:54;32776:65;;32721:126;;;:::o;32853:77::-;32890:7;32919:5;32908:16;;32853:77;;;:::o;32936:141::-;33001:9;33034:37;33065:5;33034:37;:::i;:::-;33021:50;;32936:141;;;:::o;33083:126::-;33133:9;33166:37;33197:5;33166:37;:::i;:::-;33153:50;;33083:126;;;:::o;33215:113::-;33265:9;33298:24;33316:5;33298:24;:::i;:::-;33285:37;;33215:113;;;:::o;33334:154::-;33418:6;33413:3;33408;33395:30;33480:1;33471:6;33466:3;33462:16;33455:27;33334:154;;;:::o;33494:307::-;33562:1;33572:113;33586:6;33583:1;33580:13;33572:113;;;33671:1;33666:3;33662:11;33656:18;33652:1;33647:3;33643:11;33636:39;33608:2;33605:1;33601:10;33596:15;;33572:113;;;33703:6;33700:1;33697:13;33694:101;;;33783:1;33774:6;33769:3;33765:16;33758:27;33694:101;33543:258;33494:307;;;:::o;33807:320::-;33851:6;33888:1;33882:4;33878:12;33868:22;;33935:1;33929:4;33925:12;33956:18;33946:81;;34012:4;34004:6;34000:17;33990:27;;33946:81;34074:2;34066:6;34063:14;34043:18;34040:38;34037:84;;;34093:18;;:::i;:::-;34037:84;33858:269;33807:320;;;:::o;34133:281::-;34216:27;34238:4;34216:27;:::i;:::-;34208:6;34204:40;34346:6;34334:10;34331:22;34310:18;34298:10;34295:34;34292:62;34289:88;;;34357:18;;:::i;:::-;34289:88;34397:10;34393:2;34386:22;34176:238;34133:281;;:::o;34420:233::-;34459:3;34482:24;34500:5;34482:24;:::i;:::-;34473:33;;34528:66;34521:5;34518:77;34515:103;;;34598:18;;:::i;:::-;34515:103;34645:1;34638:5;34634:13;34627:20;;34420:233;;;:::o;34659:176::-;34691:1;34708:20;34726:1;34708:20;:::i;:::-;34703:25;;34742:20;34760:1;34742:20;:::i;:::-;34737:25;;34781:1;34771:35;;34786:18;;:::i;:::-;34771:35;34827:1;34824;34820:9;34815:14;;34659:176;;;;:::o;34841:180::-;34889:77;34886:1;34879:88;34986:4;34983:1;34976:15;35010:4;35007:1;35000:15;35027:180;35075:77;35072:1;35065:88;35172:4;35169:1;35162:15;35196:4;35193:1;35186:15;35213:180;35261:77;35258:1;35251:88;35358:4;35355:1;35348:15;35382:4;35379:1;35372:15;35399:180;35447:77;35444:1;35437:88;35544:4;35541:1;35534:15;35568:4;35565:1;35558:15;35585:180;35633:77;35630:1;35623:88;35730:4;35727:1;35720:15;35754:4;35751:1;35744:15;35771:180;35819:77;35816:1;35809:88;35916:4;35913:1;35906:15;35940:4;35937:1;35930:15;35957:117;36066:1;36063;36056:12;36080:117;36189:1;36186;36179:12;36203:117;36312:1;36309;36302:12;36326:117;36435:1;36432;36425:12;36449:102;36490:6;36541:2;36537:7;36532:2;36525:5;36521:14;36517:28;36507:38;;36449:102;;;:::o;36557:174::-;36697:26;36693:1;36685:6;36681:14;36674:50;36557:174;:::o;36737:230::-;36877:34;36873:1;36865:6;36861:14;36854:58;36946:13;36941:2;36933:6;36929:15;36922:38;36737:230;:::o;36973:237::-;37113:34;37109:1;37101:6;37097:14;37090:58;37182:20;37177:2;37169:6;37165:15;37158:45;36973:237;:::o;37216:225::-;37356:34;37352:1;37344:6;37340:14;37333:58;37425:8;37420:2;37412:6;37408:15;37401:33;37216:225;:::o;37447:224::-;37587:34;37583:1;37575:6;37571:14;37564:58;37656:7;37651:2;37643:6;37639:15;37632:32;37447:224;:::o;37677:178::-;37817:30;37813:1;37805:6;37801:14;37794:54;37677:178;:::o;37861:169::-;38001:21;37997:1;37989:6;37985:14;37978:45;37861:169;:::o;38036:223::-;38176:34;38172:1;38164:6;38160:14;38153:58;38245:6;38240:2;38232:6;38228:15;38221:31;38036:223;:::o;38265:175::-;38405:27;38401:1;38393:6;38389:14;38382:51;38265:175;:::o;38446:231::-;38586:34;38582:1;38574:6;38570:14;38563:58;38655:14;38650:2;38642:6;38638:15;38631:39;38446:231;:::o;38683:243::-;38823:34;38819:1;38811:6;38807:14;38800:58;38892:26;38887:2;38879:6;38875:15;38868:51;38683:243;:::o;38932:229::-;39072:34;39068:1;39060:6;39056:14;39049:58;39141:12;39136:2;39128:6;39124:15;39117:37;38932:229;:::o;39167:228::-;39307:34;39303:1;39295:6;39291:14;39284:58;39376:11;39371:2;39363:6;39359:15;39352:36;39167:228;:::o;39401:182::-;39541:34;39537:1;39529:6;39525:14;39518:58;39401:182;:::o;39589:231::-;39729:34;39725:1;39717:6;39713:14;39706:58;39798:14;39793:2;39785:6;39781:15;39774:39;39589:231;:::o;39826:155::-;39966:7;39962:1;39954:6;39950:14;39943:31;39826:155;:::o;39987:182::-;40127:34;40123:1;40115:6;40111:14;40104:58;39987:182;:::o;40175:220::-;40315:34;40311:1;40303:6;40299:14;40292:58;40384:3;40379:2;40371:6;40367:15;40360:28;40175:220;:::o;40401:236::-;40541:34;40537:1;40529:6;40525:14;40518:58;40610:19;40605:2;40597:6;40593:15;40586:44;40401:236;:::o;40643:231::-;40783:34;40779:1;40771:6;40767:14;40760:58;40852:14;40847:2;40839:6;40835:15;40828:39;40643:231;:::o;40880:122::-;40953:24;40971:5;40953:24;:::i;:::-;40946:5;40943:35;40933:63;;40992:1;40989;40982:12;40933:63;40880:122;:::o;41008:116::-;41078:21;41093:5;41078:21;:::i;:::-;41071:5;41068:32;41058:60;;41114:1;41111;41104:12;41058:60;41008:116;:::o;41130:120::-;41202:23;41219:5;41202:23;:::i;:::-;41195:5;41192:34;41182:62;;41240:1;41237;41230:12;41182:62;41130:120;:::o;41256:122::-;41329:24;41347:5;41329:24;:::i;:::-;41322:5;41319:35;41309:63;;41368:1;41365;41358:12;41309:63;41256:122;:::o
Swarm Source
ipfs://52d12b16124f11f63141003e99b846edbae69723ad7d9d46ef0949913977397f
Age | Block | Fee Address | BC Fee Address | Voting Power | Jailed | Incoming |
---|
Make sure to use the "Vote Down" button for any spammy posts, and the "Vote Up" for interesting conversations.