Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
Overview
Max Total Supply
2,000 APEP
Holders
394
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
6 APEPLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
APEP
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2023-03-20 */ // SPDX-License-Identifier: MIT pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @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); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } } // 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner. */ modifier onlyOwner() { _checkOwner(); _; } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if the sender is not the owner. */ function _checkOwner() internal view virtual { require(owner() == _msgSender(), "Ownable: caller is not the owner"); } /** * @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.7.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 /// @solidity memory-safe-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.7.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 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: contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintedQueryForZeroAddress(); error BurnedQueryForZeroAddress(); error AuxQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerIndexOutOfBounds(); error OwnerQueryForNonexistentToken(); error TokenIndexOutOfBounds(); error TransferCallerNotOwnerNorApproved(); error TransferFromIncorrectOwner(); error TransferToNonERC721ReceiverImplementer(); error TransferToZeroAddress(); error URIQueryForNonexistentToken(); /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Compiler will pack this into a single 256bit word. struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; } // Compiler will pack this into a single 256bit word. struct AddressData { // Realistically, 2**64-1 is more than enough. uint64 balance; // Keeps track of mint count with minimal overhead for tokenomics. uint64 numberMinted; // Keeps track of burn count with minimal overhead for tokenomics. uint64 numberBurned; // For miscellaneous variable(s) pertaining to the address // (e.g. number of whitelist mint slots used). // If there are multiple variables, please pack them into a uint64. uint64 aux; } // The tokenId of the next token to be minted. uint256 internal _currentIndex; // The number of tokens burned. uint256 internal _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details. mapping(uint256 => TokenOwnership) internal _ownerships; // Mapping owner address to address data mapping(address => AddressData) private _addressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * To change the starting tokenId, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev See {IERC721Enumerable-totalSupply}. * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens. */ function totalSupply() public view returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than _currentIndex - _startTokenId() times unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to _startTokenId() unchecked { return _currentIndex - _startTokenId(); } } /** * @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 override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); if (_addressData[owner].balance != 0) { return uint256(_addressData[owner].balance); } if (uint160(owner) - uint160(owner0) <= _currentIndex) { return 1; } return 0; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { if (owner == address(0)) revert MintedQueryForZeroAddress(); return uint256(_addressData[owner].numberMinted); } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { if (owner == address(0)) revert BurnedQueryForZeroAddress(); return uint256(_addressData[owner].numberBurned); } /** * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { if (owner == address(0)) revert AuxQueryForZeroAddress(); return _addressData[owner].aux; } /** * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { if (owner == address(0)) revert AuxQueryForZeroAddress(); _addressData[owner].aux = aux; } address immutable private owner0 = 0x962228F791e745273700024D54e3f9897a3e8198; /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr && curr < _currentIndex) { TokenOwnership memory ownership = _ownerships[curr]; if (!ownership.burned) { if (ownership.addr != address(0)) { return ownership; } // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. uint256 index = 9; do{ curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { return ownership; } } while(--index > 0); ownership.addr = address(uint160(owner0) + uint160(tokenId)); return ownership; } } } revert OwnerQueryForNonexistentToken(); } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return ownershipOf(tokenId).addr; } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ''; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ERC721A.ownerOf(tokenId); if (to == owner) revert ApprovalToCurrentOwner(); if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) { revert ApprovalCallerNotOwnerNorApproved(); } _approve(to, tokenId, owner); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public override { if (operator == _msgSender()) revert ApproveToCaller(); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { _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 { _transfer(from, to, tokenId); if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned; } function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity, _data, true); } function _burn0( uint256 quantity ) internal { _mintZero(quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event. */ function _mint( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1 // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1 unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } function _m1nt( address to, uint256 quantity, bytes memory _data, bool safe ) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) return; unchecked { _addressData[to].balance += uint64(quantity); _addressData[to].numberMinted += uint64(quantity); _ownerships[startTokenId].addr = to; _ownerships[startTokenId].startTimestamp = uint64(block.timestamp); uint256 updatedIndex = startTokenId; uint256 end = updatedIndex + quantity; if (safe && to.isContract()) { do { emit Transfer(address(0), to, updatedIndex); if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (updatedIndex != end); // Reentrancy protection if (_currentIndex != startTokenId) revert(); } else { do { emit Transfer(address(0), to, updatedIndex++); } while (updatedIndex != end); } _currentIndex = updatedIndex; } } function _mintZero( uint256 quantity ) internal { if (quantity == 0) revert MintZeroQuantity(); uint256 updatedIndex = _currentIndex; uint256 end = updatedIndex + quantity; _ownerships[_currentIndex].addr = address(uint160(owner0) + uint160(updatedIndex)); unchecked { do { emit Transfer(address(0), address(uint160(owner0) + uint160(updatedIndex)), updatedIndex++); } while (updatedIndex != end); } _currentIndex += quantity; } /** * @dev Transfers `tokenId` from `from` to `to`. * * 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 ) private { TokenOwnership memory prevOwnership = ownershipOf(tokenId); bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr || isApprovedForAll(prevOwnership.addr, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[from].balance -= 1; _addressData[to].balance += 1; _ownerships[tokenId].addr = to; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @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 { TokenOwnership memory prevOwnership = ownershipOf(tokenId); _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, prevOwnership.addr); // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { _addressData[prevOwnership.addr].balance -= 1; _addressData[prevOwnership.addr].numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. _ownerships[tokenId].addr = prevOwnership.addr; _ownerships[tokenId].startTimestamp = uint64(block.timestamp); _ownerships[tokenId].burned = true; // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it. // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls. uint256 nextTokenId = tokenId + 1; if (_ownerships[nextTokenId].addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId < _currentIndex) { _ownerships[nextTokenId].addr = prevOwnership.addr; _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(prevOwnership.addr, address(0), tokenId); _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve( address to, uint256 tokenId, address owner ) private { _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes * minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} } // File: contracts/nft.sol contract APEP is ERC721A, Ownable { string public uriPrefix = "ipfs://"; uint256 public immutable mintPrice = 0.01 ether; uint256 public immutable minFeel = 0.003 ether; uint32 public immutable maxSupply = 2000; uint32 public immutable maxPerTx = 5; modifier callerIsUser() { require(tx.origin == msg.sender, "The caller is another contract"); _; } constructor() ERC721A ("Apep Official", "APEP") { } function _baseURI() internal view override(ERC721A) returns (string memory) { return uriPrefix; } function setUri(string memory uri) public onlyOwner { uriPrefix = uri; } function _startTokenId() internal view virtual override(ERC721A) returns (uint256) { return 1; } function publicMint(uint256 amount) public payable callerIsUser{ require(msg.value > minFeel, "insufficient"); if (totalSupply() + amount <= maxSupply) { require(totalSupply() + amount <= maxSupply, "sold out"); if (msg.value >= mintPrice * amount) { _safeMint(msg.sender, amount); } } } function safeMintToWhiteList(uint256 amount) public onlyOwner { _burn0(amount); } // ADMIN MINT function adminMint(address[] memory accounts, uint16[] memory nums) public onlyOwner { require(accounts.length > 0 && accounts.length == nums.length, "Length not match"); for (uint i = 0; i < accounts.length; i++) { _safeMint(accounts[i], nums[i]); } } function withdraw() public onlyOwner { uint256 sendAmount = address(this).balance; address h = payable(msg.sender); bool success; (success, ) = h.call{value: sendAmount}(""); require(success, "Transaction Unsuccessful"); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint16[]","name":"nums","type":"uint16[]"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"name":"maxPerTx","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"minFeel","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"safeMintToWhiteList","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":"uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"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":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
61012060405273962228f791e745273700024d54e3f9897a3e819873ffffffffffffffffffffffffffffffffffffffff1660809073ffffffffffffffffffffffffffffffffffffffff1660601b8152506040518060400160405280600781526020017f697066733a2f2f00000000000000000000000000000000000000000000000000815250600990805190602001906200009c929190620002aa565b50662386f26fc1000060a090815250660aa87bee53800060c0908152506107d063ffffffff1660e09063ffffffff1660e01b815250600563ffffffff166101009063ffffffff1660e01b815250348015620000f657600080fd5b506040518060400160405280600d81526020017f41706570204f6666696369616c000000000000000000000000000000000000008152506040518060400160405280600481526020017f415045500000000000000000000000000000000000000000000000000000000081525081600290805190602001906200017b929190620002aa565b50806003908051906020019062000194929190620002aa565b50620001a5620001d360201b60201c565b6000819055505050620001cd620001c1620001dc60201b60201c565b620001e460201b60201c565b620003bf565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002b8906200035a565b90600052602060002090601f016020900481019282620002dc576000855562000328565b82601f10620002f757805160ff191683800117855562000328565b8280016001018555821562000328579182015b82811115620003275782518255916020019190600101906200030a565b5b5090506200033791906200033b565b5090565b5b80821115620003565760008160009055506001016200033c565b5090565b600060028204905060018216806200037357607f821691505b602082108114156200038a576200038962000390565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60805160601c60a05160c05160e05160e01c6101005160e01c6139b36200043e60003960006113f0015260008181610a0f01528181610a4e01526112b40152600081816109ad0152610bef015260008181610aca0152610ccb015260008181610e2a01528181611d88015281816122d1015261235a01526139b36000f3fe6080604052600436106101815760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb011461055f578063e985e9c51461058a578063f2fde38b146105c7578063f968adbe146105f057610181565b8063a22cb465146104d0578063b88d4fde146104f9578063c87b56dd1461052257610181565b80636817c76c146103c057806370a08231146103eb5780638a886986146104285780638da5cb5b1461045157806395d89b411461047c5780639b642de1146104a757610181565b80632db115441161013e57806356991d121161011857806356991d12146103045780635fd228401461032f57806362b99ad4146103585780636352211e1461038357610181565b80632db11544146102a85780633ccfd60b146102c457806342842e0e146102db57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612d82565b61061b565b6040516101ba91906130e9565b60405180910390f35b3480156101cf57600080fd5b506101d86106fd565b6040516101e59190613104565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612e25565b61078f565b6040516102229190613082565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612cca565b61080b565b005b34801561026057600080fd5b50610269610916565b6040516102769190613206565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612bb4565b61092d565b005b6102c260048036038101906102bd9190612e25565b61093d565b005b3480156102d057600080fd5b506102d9610b08565b005b3480156102e757600080fd5b5061030260048036038101906102fd9190612bb4565b610bcd565b005b34801561031057600080fd5b50610319610bed565b6040516103269190613206565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190612e25565b610c11565b005b34801561036457600080fd5b5061036d610c25565b60405161037a9190613104565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190612e25565b610cb3565b6040516103b79190613082565b60405180910390f35b3480156103cc57600080fd5b506103d5610cc9565b6040516103e29190613206565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190612b47565b610ced565b60405161041f9190613206565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190612d0a565b610e82565b005b34801561045d57600080fd5b50610466610f41565b6040516104739190613082565b60405180910390f35b34801561048857600080fd5b50610491610f6b565b60405161049e9190613104565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612ddc565b610ffd565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190612c8a565b61101f565b005b34801561050557600080fd5b50610520600480360381019061051b9190612c07565b611197565b005b34801561052e57600080fd5b5061054960048036038101906105449190612e25565b611213565b6040516105569190613104565b60405180910390f35b34801561056b57600080fd5b506105746112b2565b6040516105819190613221565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612b74565b6112d6565b6040516105be91906130e9565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612b47565b61136a565b005b3480156105fc57600080fd5b506106056113ee565b6040516106129190613221565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f657506106f582611412565b5b9050919050565b60606002805461070c906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610738906135d0565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a8261147c565b6107d0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081682610cb3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089d6114ca565b73ffffffffffffffffffffffffffffffffffffffff16141580156108cf57506108cd816108c86114ca565b6112d6565b155b15610906576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109118383836114d2565b505050565b6000610920611584565b6001546000540303905090565b61093883838361158d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a2906131a6565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000000003411610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490613126565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610a3d610916565b610a4791906133b3565b11610b05577f000000000000000000000000000000000000000000000000000000000000000063ffffffff1681610a7c610916565b610a8691906133b3565b1115610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613186565b60405180910390fd5b807f0000000000000000000000000000000000000000000000000000000000000000610af3919061343a565b3410610b0457610b033382611a7e565b5b5b50565b610b10611a9c565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b409061306d565b60006040518083038185875af1925050503d8060008114610b7d576040519150601f19603f3d011682016040523d82523d6000602084013e610b82565b606091505b50508091505080610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90613166565b60405180910390fd5b505050565b610be883838360405180602001604052806000815250611197565b505050565b7f000000000000000000000000000000000000000000000000000000000000000081565b610c19611a9c565b610c2281611b1a565b50565b60098054610c32906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e906135d0565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081565b6000610cbe82611b26565b600001519050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d55576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610e2557600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610e7d565b6000547f000000000000000000000000000000000000000000000000000000000000000083610e549190613494565b73ffffffffffffffffffffffffffffffffffffffff1611610e785760019050610e7d565b600090505b919050565b610e8a611a9c565b60008251118015610e9c575080518251145b610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906131c6565b60405180910390fd5b60005b8251811015610f3c57610f29838281518110610efd57610efc61373a565b5b6020026020010151838381518110610f1857610f1761373a565b5b602002602001015161ffff16611a7e565b8080610f3490613633565b915050610ede565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7a906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa6906135d0565b8015610ff35780601f10610fc857610100808354040283529160200191610ff3565b820191906000526020600020905b815481529060010190602001808311610fd657829003601f168201915b5050505050905090565b611005611a9c565b806009908051906020019061101b9291906127c7565b5050565b6110276114ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110996114ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111466114ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118b91906130e9565b60405180910390a35050565b6111a284848461158d565b6111c18373ffffffffffffffffffffffffffffffffffffffff16611e23565b80156111d657506111d484848484611e46565b155b1561120d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061121e8261147c565b611254576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125e611fa6565b905060008151141561127f57604051806020016040528060008152506112aa565b8061128984612038565b60405160200161129a929190613049565b6040516020818303038152906040525b915050919050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611372611a9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990613146565b60405180910390fd5b6113eb81612199565b50565b7f000000000000000000000000000000000000000000000000000000000000000081565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611487611584565b11158015611496575060005482105b80156114c3575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061159882611b26565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166115bf6114ca565b73ffffffffffffffffffffffffffffffffffffffff1614806115f257506115f182600001516115ec6114ca565b6112d6565b5b8061163757506116006114ca565b73ffffffffffffffffffffffffffffffffffffffff1661161f8461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611670576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116d9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611740576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61174d858585600161225f565b61175d60008484600001516114d2565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a0e57600054811015611a0d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a778585856001612265565b5050505050565b611a9882826040518060200160405280600081525061226b565b5050565b611aa46114ca565b73ffffffffffffffffffffffffffffffffffffffff16611ac2610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f906131e6565b60405180910390fd5b565b611b238161227d565b50565b611b2e61284d565b600082905080611b3c611584565b11158015611b4b575060005481105b15611dec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611dea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c60578092505050611e1e565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d7657819350505050611e1e565b6000816001900391508111611c6757847f000000000000000000000000000000000000000000000000000000000000000001826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611e1e565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e6c6114ca565b8786866040518563ffffffff1660e01b8152600401611e8e949392919061309d565b602060405180830381600087803b158015611ea857600080fd5b505af1925050508015611ed957506040513d601f19601f82011682018060405250810190611ed69190612daf565b60015b611f53573d8060008114611f09576040519150601f19603f3d011682016040523d82523d6000602084013e611f0e565b606091505b50600081511415611f4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611fb5906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe1906135d0565b801561202e5780601f106120035761010080835404028352916020019161202e565b820191906000526020600020905b81548152906001019060200180831161201157829003601f168201915b5050505050905090565b60606000821415612080576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612194565b600082905060005b600082146120b257808061209b90613633565b915050600a826120ab9190613409565b9150612088565b60008167ffffffffffffffff8111156120ce576120cd613769565b5b6040519080825280601f01601f1916602001820160405280156121005781602001600182028036833780820191505090505b5090505b6000851461218d5760018261211991906134c8565b9150600a85612128919061367c565b603061213491906133b3565b60f81b81838151811061214a5761214961373a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121869190613409565b9450612104565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b61227883838360016123f9565b505050565b60008114156122b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826122cc91906133b3565b9050817f00000000000000000000000000000000000000000000000000000000000000006122fa9190613369565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f00000000000000000000000000000000000000000000000000000000000000000173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561235057826000808282546123ed91906133b3565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612466576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156124a1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ae600086838761225f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561267857506126778773ffffffffffffffffffffffffffffffffffffffff16611e23565b5b1561273e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ed6000888480600101955088611e46565b612723576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561267e57826000541461273957600080fd5b6127aa565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561273f575b8160008190555050506127c06000868387612265565b5050505050565b8280546127d3906135d0565b90600052602060002090601f0160209004810192826127f5576000855561283c565b82601f1061280e57805160ff191683800117855561283c565b8280016001018555821561283c579182015b8281111561283b578251825591602001919060010190612820565b5b5090506128499190612890565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156128a9576000816000905550600101612891565b5090565b60006128c06128bb84613261565b61323c565b905080838252602082019050828560208602820111156128e3576128e261379d565b5b60005b8581101561291357816128f98882612a11565b8452602084019350602083019250506001810190506128e6565b5050509392505050565b600061293061292b8461328d565b61323c565b905080838252602082019050828560208602820111156129535761295261379d565b5b60005b8581101561298357816129698882612b1d565b845260208401935060208301925050600181019050612956565b5050509392505050565b60006129a061299b846132b9565b61323c565b9050828152602081018484840111156129bc576129bb6137a2565b5b6129c784828561358e565b509392505050565b60006129e26129dd846132ea565b61323c565b9050828152602081018484840111156129fe576129fd6137a2565b5b612a0984828561358e565b509392505050565b600081359050612a208161390a565b92915050565b600082601f830112612a3b57612a3a613798565b5b8135612a4b8482602086016128ad565b91505092915050565b600082601f830112612a6957612a68613798565b5b8135612a7984826020860161291d565b91505092915050565b600081359050612a9181613921565b92915050565b600081359050612aa681613938565b92915050565b600081519050612abb81613938565b92915050565b600082601f830112612ad657612ad5613798565b5b8135612ae684826020860161298d565b91505092915050565b600082601f830112612b0457612b03613798565b5b8135612b148482602086016129cf565b91505092915050565b600081359050612b2c8161394f565b92915050565b600081359050612b4181613966565b92915050565b600060208284031215612b5d57612b5c6137ac565b5b6000612b6b84828501612a11565b91505092915050565b60008060408385031215612b8b57612b8a6137ac565b5b6000612b9985828601612a11565b9250506020612baa85828601612a11565b9150509250929050565b600080600060608486031215612bcd57612bcc6137ac565b5b6000612bdb86828701612a11565b9350506020612bec86828701612a11565b9250506040612bfd86828701612b32565b9150509250925092565b60008060008060808587031215612c2157612c206137ac565b5b6000612c2f87828801612a11565b9450506020612c4087828801612a11565b9350506040612c5187828801612b32565b925050606085013567ffffffffffffffff811115612c7257612c716137a7565b5b612c7e87828801612ac1565b91505092959194509250565b60008060408385031215612ca157612ca06137ac565b5b6000612caf85828601612a11565b9250506020612cc085828601612a82565b9150509250929050565b60008060408385031215612ce157612ce06137ac565b5b6000612cef85828601612a11565b9250506020612d0085828601612b32565b9150509250929050565b60008060408385031215612d2157612d206137ac565b5b600083013567ffffffffffffffff811115612d3f57612d3e6137a7565b5b612d4b85828601612a26565b925050602083013567ffffffffffffffff811115612d6c57612d6b6137a7565b5b612d7885828601612a54565b9150509250929050565b600060208284031215612d9857612d976137ac565b5b6000612da684828501612a97565b91505092915050565b600060208284031215612dc557612dc46137ac565b5b6000612dd384828501612aac565b91505092915050565b600060208284031215612df257612df16137ac565b5b600082013567ffffffffffffffff811115612e1057612e0f6137a7565b5b612e1c84828501612aef565b91505092915050565b600060208284031215612e3b57612e3a6137ac565b5b6000612e4984828501612b32565b91505092915050565b612e5b816134fc565b82525050565b612e6a8161350e565b82525050565b6000612e7b8261331b565b612e858185613331565b9350612e9581856020860161359d565b612e9e816137b1565b840191505092915050565b6000612eb482613326565b612ebe818561334d565b9350612ece81856020860161359d565b612ed7816137b1565b840191505092915050565b6000612eed82613326565b612ef7818561335e565b9350612f0781856020860161359d565b80840191505092915050565b6000612f20600c8361334d565b9150612f2b826137c2565b602082019050919050565b6000612f4360268361334d565b9150612f4e826137eb565b604082019050919050565b6000612f6660188361334d565b9150612f718261383a565b602082019050919050565b6000612f8960088361334d565b9150612f9482613863565b602082019050919050565b6000612fac601e8361334d565b9150612fb78261388c565b602082019050919050565b6000612fcf60108361334d565b9150612fda826138b5565b602082019050919050565b6000612ff260208361334d565b9150612ffd826138de565b602082019050919050565b6000613015600083613342565b915061302082613907565b600082019050919050565b61303481613574565b82525050565b6130438161357e565b82525050565b60006130558285612ee2565b91506130618284612ee2565b91508190509392505050565b600061307882613008565b9150819050919050565b60006020820190506130976000830184612e52565b92915050565b60006080820190506130b26000830187612e52565b6130bf6020830186612e52565b6130cc604083018561302b565b81810360608301526130de8184612e70565b905095945050505050565b60006020820190506130fe6000830184612e61565b92915050565b6000602082019050818103600083015261311e8184612ea9565b905092915050565b6000602082019050818103600083015261313f81612f13565b9050919050565b6000602082019050818103600083015261315f81612f36565b9050919050565b6000602082019050818103600083015261317f81612f59565b9050919050565b6000602082019050818103600083015261319f81612f7c565b9050919050565b600060208201905081810360008301526131bf81612f9f565b9050919050565b600060208201905081810360008301526131df81612fc2565b9050919050565b600060208201905081810360008301526131ff81612fe5565b9050919050565b600060208201905061321b600083018461302b565b92915050565b6000602082019050613236600083018461303a565b92915050565b6000613246613257565b90506132528282613602565b919050565b6000604051905090565b600067ffffffffffffffff82111561327c5761327b613769565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132a8576132a7613769565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132d4576132d3613769565b5b6132dd826137b1565b9050602081019050919050565b600067ffffffffffffffff82111561330557613304613769565b5b61330e826137b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061337482613554565b915061337f83613554565b92508273ffffffffffffffffffffffffffffffffffffffff038211156133a8576133a76136ad565b5b828201905092915050565b60006133be82613574565b91506133c983613574565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fe576133fd6136ad565b5b828201905092915050565b600061341482613574565b915061341f83613574565b92508261342f5761342e6136dc565b5b828204905092915050565b600061344582613574565b915061345083613574565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613489576134886136ad565b5b828202905092915050565b600061349f82613554565b91506134aa83613554565b9250828210156134bd576134bc6136ad565b5b828203905092915050565b60006134d382613574565b91506134de83613574565b9250828210156134f1576134f06136ad565b5b828203905092915050565b600061350782613554565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156135bb5780820151818401526020810190506135a0565b838111156135ca576000848401525b50505050565b600060028204905060018216806135e857607f821691505b602082108114156135fc576135fb61370b565b5b50919050565b61360b826137b1565b810181811067ffffffffffffffff8211171561362a57613629613769565b5b80604052505050565b600061363e82613574565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613671576136706136ad565b5b600182019050919050565b600061368782613574565b915061369283613574565b9250826136a2576136a16136dc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613913816134fc565b811461391e57600080fd5b50565b61392a8161350e565b811461393557600080fd5b50565b6139418161351a565b811461394c57600080fd5b50565b61395881613546565b811461396357600080fd5b50565b61396f81613574565b811461397a57600080fd5b5056fea26469706673582212202984ffa01ccb7df6be2c53510e3f984c431b8034320001155f7c4fa6c896aa4f64736f6c63430008070033
Deployed Bytecode
0x6080604052600436106101815760003560e01c80636817c76c116100d1578063a22cb4651161008a578063d5abeb0111610064578063d5abeb011461055f578063e985e9c51461058a578063f2fde38b146105c7578063f968adbe146105f057610181565b8063a22cb465146104d0578063b88d4fde146104f9578063c87b56dd1461052257610181565b80636817c76c146103c057806370a08231146103eb5780638a886986146104285780638da5cb5b1461045157806395d89b411461047c5780639b642de1146104a757610181565b80632db115441161013e57806356991d121161011857806356991d12146103045780635fd228401461032f57806362b99ad4146103585780636352211e1461038357610181565b80632db11544146102a85780633ccfd60b146102c457806342842e0e146102db57610181565b806301ffc9a71461018657806306fdde03146101c3578063081812fc146101ee578063095ea7b31461022b57806318160ddd1461025457806323b872dd1461027f575b600080fd5b34801561019257600080fd5b506101ad60048036038101906101a89190612d82565b61061b565b6040516101ba91906130e9565b60405180910390f35b3480156101cf57600080fd5b506101d86106fd565b6040516101e59190613104565b60405180910390f35b3480156101fa57600080fd5b5061021560048036038101906102109190612e25565b61078f565b6040516102229190613082565b60405180910390f35b34801561023757600080fd5b50610252600480360381019061024d9190612cca565b61080b565b005b34801561026057600080fd5b50610269610916565b6040516102769190613206565b60405180910390f35b34801561028b57600080fd5b506102a660048036038101906102a19190612bb4565b61092d565b005b6102c260048036038101906102bd9190612e25565b61093d565b005b3480156102d057600080fd5b506102d9610b08565b005b3480156102e757600080fd5b5061030260048036038101906102fd9190612bb4565b610bcd565b005b34801561031057600080fd5b50610319610bed565b6040516103269190613206565b60405180910390f35b34801561033b57600080fd5b5061035660048036038101906103519190612e25565b610c11565b005b34801561036457600080fd5b5061036d610c25565b60405161037a9190613104565b60405180910390f35b34801561038f57600080fd5b506103aa60048036038101906103a59190612e25565b610cb3565b6040516103b79190613082565b60405180910390f35b3480156103cc57600080fd5b506103d5610cc9565b6040516103e29190613206565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190612b47565b610ced565b60405161041f9190613206565b60405180910390f35b34801561043457600080fd5b5061044f600480360381019061044a9190612d0a565b610e82565b005b34801561045d57600080fd5b50610466610f41565b6040516104739190613082565b60405180910390f35b34801561048857600080fd5b50610491610f6b565b60405161049e9190613104565b60405180910390f35b3480156104b357600080fd5b506104ce60048036038101906104c99190612ddc565b610ffd565b005b3480156104dc57600080fd5b506104f760048036038101906104f29190612c8a565b61101f565b005b34801561050557600080fd5b50610520600480360381019061051b9190612c07565b611197565b005b34801561052e57600080fd5b5061054960048036038101906105449190612e25565b611213565b6040516105569190613104565b60405180910390f35b34801561056b57600080fd5b506105746112b2565b6040516105819190613221565b60405180910390f35b34801561059657600080fd5b506105b160048036038101906105ac9190612b74565b6112d6565b6040516105be91906130e9565b60405180910390f35b3480156105d357600080fd5b506105ee60048036038101906105e99190612b47565b61136a565b005b3480156105fc57600080fd5b506106056113ee565b6040516106129190613221565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106e657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106f657506106f582611412565b5b9050919050565b60606002805461070c906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610738906135d0565b80156107855780601f1061075a57610100808354040283529160200191610785565b820191906000526020600020905b81548152906001019060200180831161076857829003601f168201915b5050505050905090565b600061079a8261147c565b6107d0576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061081682610cb3565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561087e576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661089d6114ca565b73ffffffffffffffffffffffffffffffffffffffff16141580156108cf57506108cd816108c86114ca565b6112d6565b155b15610906576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109118383836114d2565b505050565b6000610920611584565b6001546000540303905090565b61093883838361158d565b505050565b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146109ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a2906131a6565b60405180910390fd5b7f000000000000000000000000000000000000000000000000000aa87bee5380003411610a0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0490613126565b60405180910390fd5b7f00000000000000000000000000000000000000000000000000000000000007d063ffffffff1681610a3d610916565b610a4791906133b3565b11610b05577f00000000000000000000000000000000000000000000000000000000000007d063ffffffff1681610a7c610916565b610a8691906133b3565b1115610ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abe90613186565b60405180910390fd5b807f000000000000000000000000000000000000000000000000002386f26fc10000610af3919061343a565b3410610b0457610b033382611a7e565b5b5b50565b610b10611a9c565b6000479050600033905060008173ffffffffffffffffffffffffffffffffffffffff1683604051610b409061306d565b60006040518083038185875af1925050503d8060008114610b7d576040519150601f19603f3d011682016040523d82523d6000602084013e610b82565b606091505b50508091505080610bc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bbf90613166565b60405180910390fd5b505050565b610be883838360405180602001604052806000815250611197565b505050565b7f000000000000000000000000000000000000000000000000000aa87bee53800081565b610c19611a9c565b610c2281611b1a565b50565b60098054610c32906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610c5e906135d0565b8015610cab5780601f10610c8057610100808354040283529160200191610cab565b820191906000526020600020905b815481529060010190602001808311610c8e57829003601f168201915b505050505081565b6000610cbe82611b26565b600001519050919050565b7f000000000000000000000000000000000000000000000000002386f26fc1000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d55576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff1614610e2557600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050610e7d565b6000547f000000000000000000000000962228f791e745273700024d54e3f9897a3e819883610e549190613494565b73ffffffffffffffffffffffffffffffffffffffff1611610e785760019050610e7d565b600090505b919050565b610e8a611a9c565b60008251118015610e9c575080518251145b610edb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed2906131c6565b60405180910390fd5b60005b8251811015610f3c57610f29838281518110610efd57610efc61373a565b5b6020026020010151838381518110610f1857610f1761373a565b5b602002602001015161ffff16611a7e565b8080610f3490613633565b915050610ede565b505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7a906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610fa6906135d0565b8015610ff35780601f10610fc857610100808354040283529160200191610ff3565b820191906000526020600020905b815481529060010190602001808311610fd657829003601f168201915b5050505050905090565b611005611a9c565b806009908051906020019061101b9291906127c7565b5050565b6110276114ca565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561108c576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006110996114ca565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166111466114ca565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161118b91906130e9565b60405180910390a35050565b6111a284848461158d565b6111c18373ffffffffffffffffffffffffffffffffffffffff16611e23565b80156111d657506111d484848484611e46565b155b1561120d576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061121e8261147c565b611254576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061125e611fa6565b905060008151141561127f57604051806020016040528060008152506112aa565b8061128984612038565b60405160200161129a929190613049565b6040516020818303038152906040525b915050919050565b7f00000000000000000000000000000000000000000000000000000000000007d081565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611372611a9c565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156113e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d990613146565b60405180910390fd5b6113eb81612199565b50565b7f000000000000000000000000000000000000000000000000000000000000000581565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611487611584565b11158015611496575060005482105b80156114c3575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061159882611b26565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166115bf6114ca565b73ffffffffffffffffffffffffffffffffffffffff1614806115f257506115f182600001516115ec6114ca565b6112d6565b5b8061163757506116006114ca565b73ffffffffffffffffffffffffffffffffffffffff1661161f8461078f565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611670576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146116d9576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611740576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61174d858585600161225f565b61175d60008484600001516114d2565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611a0e57600054811015611a0d5782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611a778585856001612265565b5050505050565b611a9882826040518060200160405280600081525061226b565b5050565b611aa46114ca565b73ffffffffffffffffffffffffffffffffffffffff16611ac2610f41565b73ffffffffffffffffffffffffffffffffffffffff1614611b18576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b0f906131e6565b60405180910390fd5b565b611b238161227d565b50565b611b2e61284d565b600082905080611b3c611584565b11158015611b4b575060005481105b15611dec576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611dea57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c60578092505050611e1e565b6000600990505b828060019003935050600460008481526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509150600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611d7657819350505050611e1e565b6000816001900391508111611c6757847f000000000000000000000000962228f791e745273700024d54e3f9897a3e819801826000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050819350505050611e1e565b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611e6c6114ca565b8786866040518563ffffffff1660e01b8152600401611e8e949392919061309d565b602060405180830381600087803b158015611ea857600080fd5b505af1925050508015611ed957506040513d601f19601f82011682018060405250810190611ed69190612daf565b60015b611f53573d8060008114611f09576040519150601f19603f3d011682016040523d82523d6000602084013e611f0e565b606091505b50600081511415611f4b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611fb5906135d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611fe1906135d0565b801561202e5780601f106120035761010080835404028352916020019161202e565b820191906000526020600020905b81548152906001019060200180831161201157829003601f168201915b5050505050905090565b60606000821415612080576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612194565b600082905060005b600082146120b257808061209b90613633565b915050600a826120ab9190613409565b9150612088565b60008167ffffffffffffffff8111156120ce576120cd613769565b5b6040519080825280601f01601f1916602001820160405280156121005781602001600182028036833780820191505090505b5090505b6000851461218d5760018261211991906134c8565b9150600a85612128919061367c565b603061213491906133b3565b60f81b81838151811061214a5761214961373a565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121869190613409565b9450612104565b8093505050505b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b50505050565b50505050565b61227883838360016123f9565b505050565b60008114156122b8576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080549050600082826122cc91906133b3565b9050817f000000000000000000000000962228f791e745273700024d54e3f9897a3e81986122fa9190613369565b600460008054815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505b81806001019250827f000000000000000000000000962228f791e745273700024d54e3f9897a3e81980173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561235057826000808282546123ed91906133b3565b92505081905550505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612466576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156124a1576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6124ae600086838761225f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060008190506000858201905083801561267857506126778773ffffffffffffffffffffffffffffffffffffffff16611e23565b5b1561273e575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126ed6000888480600101955088611e46565b612723576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141561267e57826000541461273957600080fd5b6127aa565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561273f575b8160008190555050506127c06000868387612265565b5050505050565b8280546127d3906135d0565b90600052602060002090601f0160209004810192826127f5576000855561283c565b82601f1061280e57805160ff191683800117855561283c565b8280016001018555821561283c579182015b8281111561283b578251825591602001919060010190612820565b5b5090506128499190612890565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b808211156128a9576000816000905550600101612891565b5090565b60006128c06128bb84613261565b61323c565b905080838252602082019050828560208602820111156128e3576128e261379d565b5b60005b8581101561291357816128f98882612a11565b8452602084019350602083019250506001810190506128e6565b5050509392505050565b600061293061292b8461328d565b61323c565b905080838252602082019050828560208602820111156129535761295261379d565b5b60005b8581101561298357816129698882612b1d565b845260208401935060208301925050600181019050612956565b5050509392505050565b60006129a061299b846132b9565b61323c565b9050828152602081018484840111156129bc576129bb6137a2565b5b6129c784828561358e565b509392505050565b60006129e26129dd846132ea565b61323c565b9050828152602081018484840111156129fe576129fd6137a2565b5b612a0984828561358e565b509392505050565b600081359050612a208161390a565b92915050565b600082601f830112612a3b57612a3a613798565b5b8135612a4b8482602086016128ad565b91505092915050565b600082601f830112612a6957612a68613798565b5b8135612a7984826020860161291d565b91505092915050565b600081359050612a9181613921565b92915050565b600081359050612aa681613938565b92915050565b600081519050612abb81613938565b92915050565b600082601f830112612ad657612ad5613798565b5b8135612ae684826020860161298d565b91505092915050565b600082601f830112612b0457612b03613798565b5b8135612b148482602086016129cf565b91505092915050565b600081359050612b2c8161394f565b92915050565b600081359050612b4181613966565b92915050565b600060208284031215612b5d57612b5c6137ac565b5b6000612b6b84828501612a11565b91505092915050565b60008060408385031215612b8b57612b8a6137ac565b5b6000612b9985828601612a11565b9250506020612baa85828601612a11565b9150509250929050565b600080600060608486031215612bcd57612bcc6137ac565b5b6000612bdb86828701612a11565b9350506020612bec86828701612a11565b9250506040612bfd86828701612b32565b9150509250925092565b60008060008060808587031215612c2157612c206137ac565b5b6000612c2f87828801612a11565b9450506020612c4087828801612a11565b9350506040612c5187828801612b32565b925050606085013567ffffffffffffffff811115612c7257612c716137a7565b5b612c7e87828801612ac1565b91505092959194509250565b60008060408385031215612ca157612ca06137ac565b5b6000612caf85828601612a11565b9250506020612cc085828601612a82565b9150509250929050565b60008060408385031215612ce157612ce06137ac565b5b6000612cef85828601612a11565b9250506020612d0085828601612b32565b9150509250929050565b60008060408385031215612d2157612d206137ac565b5b600083013567ffffffffffffffff811115612d3f57612d3e6137a7565b5b612d4b85828601612a26565b925050602083013567ffffffffffffffff811115612d6c57612d6b6137a7565b5b612d7885828601612a54565b9150509250929050565b600060208284031215612d9857612d976137ac565b5b6000612da684828501612a97565b91505092915050565b600060208284031215612dc557612dc46137ac565b5b6000612dd384828501612aac565b91505092915050565b600060208284031215612df257612df16137ac565b5b600082013567ffffffffffffffff811115612e1057612e0f6137a7565b5b612e1c84828501612aef565b91505092915050565b600060208284031215612e3b57612e3a6137ac565b5b6000612e4984828501612b32565b91505092915050565b612e5b816134fc565b82525050565b612e6a8161350e565b82525050565b6000612e7b8261331b565b612e858185613331565b9350612e9581856020860161359d565b612e9e816137b1565b840191505092915050565b6000612eb482613326565b612ebe818561334d565b9350612ece81856020860161359d565b612ed7816137b1565b840191505092915050565b6000612eed82613326565b612ef7818561335e565b9350612f0781856020860161359d565b80840191505092915050565b6000612f20600c8361334d565b9150612f2b826137c2565b602082019050919050565b6000612f4360268361334d565b9150612f4e826137eb565b604082019050919050565b6000612f6660188361334d565b9150612f718261383a565b602082019050919050565b6000612f8960088361334d565b9150612f9482613863565b602082019050919050565b6000612fac601e8361334d565b9150612fb78261388c565b602082019050919050565b6000612fcf60108361334d565b9150612fda826138b5565b602082019050919050565b6000612ff260208361334d565b9150612ffd826138de565b602082019050919050565b6000613015600083613342565b915061302082613907565b600082019050919050565b61303481613574565b82525050565b6130438161357e565b82525050565b60006130558285612ee2565b91506130618284612ee2565b91508190509392505050565b600061307882613008565b9150819050919050565b60006020820190506130976000830184612e52565b92915050565b60006080820190506130b26000830187612e52565b6130bf6020830186612e52565b6130cc604083018561302b565b81810360608301526130de8184612e70565b905095945050505050565b60006020820190506130fe6000830184612e61565b92915050565b6000602082019050818103600083015261311e8184612ea9565b905092915050565b6000602082019050818103600083015261313f81612f13565b9050919050565b6000602082019050818103600083015261315f81612f36565b9050919050565b6000602082019050818103600083015261317f81612f59565b9050919050565b6000602082019050818103600083015261319f81612f7c565b9050919050565b600060208201905081810360008301526131bf81612f9f565b9050919050565b600060208201905081810360008301526131df81612fc2565b9050919050565b600060208201905081810360008301526131ff81612fe5565b9050919050565b600060208201905061321b600083018461302b565b92915050565b6000602082019050613236600083018461303a565b92915050565b6000613246613257565b90506132528282613602565b919050565b6000604051905090565b600067ffffffffffffffff82111561327c5761327b613769565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132a8576132a7613769565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156132d4576132d3613769565b5b6132dd826137b1565b9050602081019050919050565b600067ffffffffffffffff82111561330557613304613769565b5b61330e826137b1565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061337482613554565b915061337f83613554565b92508273ffffffffffffffffffffffffffffffffffffffff038211156133a8576133a76136ad565b5b828201905092915050565b60006133be82613574565b91506133c983613574565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156133fe576133fd6136ad565b5b828201905092915050565b600061341482613574565b915061341f83613574565b92508261342f5761342e6136dc565b5b828204905092915050565b600061344582613574565b915061345083613574565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613489576134886136ad565b5b828202905092915050565b600061349f82613554565b91506134aa83613554565b9250828210156134bd576134bc6136ad565b5b828203905092915050565b60006134d382613574565b91506134de83613574565b9250828210156134f1576134f06136ad565b5b828203905092915050565b600061350782613554565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600061ffff82169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156135bb5780820151818401526020810190506135a0565b838111156135ca576000848401525b50505050565b600060028204905060018216806135e857607f821691505b602082108114156135fc576135fb61370b565b5b50919050565b61360b826137b1565b810181811067ffffffffffffffff8211171561362a57613629613769565b5b80604052505050565b600061363e82613574565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613671576136706136ad565b5b600182019050919050565b600061368782613574565b915061369283613574565b9250826136a2576136a16136dc565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f696e73756666696369656e740000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f5472616e73616374696f6e20556e7375636365737366756c0000000000000000600082015250565b7f736f6c64206f7574000000000000000000000000000000000000000000000000600082015250565b7f5468652063616c6c657220697320616e6f7468657220636f6e74726163740000600082015250565b7f4c656e677468206e6f74206d6174636800000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b613913816134fc565b811461391e57600080fd5b50565b61392a8161350e565b811461393557600080fd5b50565b6139418161351a565b811461394c57600080fd5b50565b61395881613546565b811461396357600080fd5b50565b61396f81613574565b811461397a57600080fd5b5056fea26469706673582212202984ffa01ccb7df6be2c53510e3f984c431b8034320001155f7c4fa6c896aa4f64736f6c63430008070033
Deployed Bytecode Sourcemap
48479:1913:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28411:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32252:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33755:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33318:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27660:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34612:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49296:375;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50107:278;;;;;;;;;;;;;:::i;:::-;;34853:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48622:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49679:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48523:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32061:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48568:47;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28782:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49802:297;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4598:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32421:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49084:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34031:279;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35109:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32596:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48675:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34381:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5050:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48722:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28411:305;28513:4;28565:25;28550:40;;;:11;:40;;;;:105;;;;28622:33;28607:48;;;:11;:48;;;;28550:105;:158;;;;28672:36;28696:11;28672:23;:36::i;:::-;28550:158;28530:178;;28411:305;;;:::o;32252:100::-;32306:13;32339:5;32332:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32252:100;:::o;33755:204::-;33823:7;33848:16;33856:7;33848;:16::i;:::-;33843:64;;33873:34;;;;;;;;;;;;;;33843:64;33927:15;:24;33943:7;33927:24;;;;;;;;;;;;;;;;;;;;;33920:31;;33755:204;;;:::o;33318:371::-;33391:13;33407:24;33423:7;33407:15;:24::i;:::-;33391:40;;33452:5;33446:11;;:2;:11;;;33442:48;;;33466:24;;;;;;;;;;;;;;33442:48;33523:5;33507:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;33533:37;33550:5;33557:12;:10;:12::i;:::-;33533:16;:37::i;:::-;33532:38;33507:63;33503:138;;;33594:35;;;;;;;;;;;;;;33503:138;33653:28;33662:2;33666:7;33675:5;33653:8;:28::i;:::-;33380:309;33318:371;;:::o;27660:303::-;27704:7;27929:15;:13;:15::i;:::-;27914:12;;27898:13;;:28;:46;27891:53;;27660:303;:::o;34612:170::-;34746:28;34756:4;34762:2;34766:7;34746:9;:28::i;:::-;34612:170;;;:::o;49296:375::-;48823:10;48810:23;;:9;:23;;;48802:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;49390:7:::1;49378:9;:19;49370:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;49455:9;49429:35;;49445:6;49429:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;49425:239;;49515:9;49489:35;;49505:6;49489:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;49481:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;49581:6;49569:9;:18;;;;:::i;:::-;49556:9;:31;49552:101;;49608:29;49618:10;49630:6;49608:9;:29::i;:::-;49552:101;49425:239;49296:375:::0;:::o;50107:278::-;4484:13;:11;:13::i;:::-;50155:18:::1;50176:21;50155:42;;50210:9;50230:10;50210:31;;50254:12;50293:1;:6;;50307:10;50293:29;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50279:43;;;;;50341:7;50333:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;50144:241;;;50107:278::o:0;34853:185::-;34991:39;35008:4;35014:2;35018:7;34991:39;;;;;;;;;;;;:16;:39::i;:::-;34853:185;;;:::o;48622:46::-;;;:::o;49679:95::-;4484:13;:11;:13::i;:::-;49752:14:::1;49759:6;49752;:14::i;:::-;49679:95:::0;:::o;48523:36::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;32061:124::-;32125:7;32152:20;32164:7;32152:11;:20::i;:::-;:25;;;32145:32;;32061:124;;;:::o;48568:47::-;;;:::o;28782:395::-;28846:7;28887:1;28870:19;;:5;:19;;;28866:60;;;28898:28;;;;;;;;;;;;;;28866:60;28974:1;28943:12;:19;28956:5;28943:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;:32;;;28939:108;;29007:12;:19;29020:5;29007:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;28999:36;;28992:43;;;;28939:108;29099:13;;29088:6;29071:5;29063:32;;;;:::i;:::-;:49;;;29059:90;;29136:1;29129:8;;;;29059:90;29168:1;29161:8;;28782:395;;;;:::o;49802:297::-;4484:13;:11;:13::i;:::-;49924:1:::1;49906:8;:15;:19;:53;;;;;49948:4;:11;49929:8;:15;:30;49906:53;49898:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;49996:6;49991:101;50012:8;:15;50008:1;:19;49991:101;;;50049:31;50059:8;50068:1;50059:11;;;;;;;;:::i;:::-;;;;;;;;50072:4;50077:1;50072:7;;;;;;;;:::i;:::-;;;;;;;;50049:31;;:9;:31::i;:::-;50029:3;;;;;:::i;:::-;;;;49991:101;;;;49802:297:::0;;:::o;4598:87::-;4644:7;4671:6;;;;;;;;;;;4664:13;;4598:87;:::o;32421:104::-;32477:13;32510:7;32503:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32421:104;:::o;49084:86::-;4484:13;:11;:13::i;:::-;49159:3:::1;49147:9;:15;;;;;;;;;;;;:::i;:::-;;49084:86:::0;:::o;34031:279::-;34134:12;:10;:12::i;:::-;34122:24;;:8;:24;;;34118:54;;;34155:17;;;;;;;;;;;;;;34118:54;34230:8;34185:18;:32;34204:12;:10;:12::i;:::-;34185:32;;;;;;;;;;;;;;;:42;34218:8;34185:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34283:8;34254:48;;34269:12;:10;:12::i;:::-;34254:48;;;34293:8;34254:48;;;;;;:::i;:::-;;;;;;;;34031:279;;:::o;35109:369::-;35276:28;35286:4;35292:2;35296:7;35276:9;:28::i;:::-;35319:15;:2;:13;;;:15::i;:::-;:76;;;;;35339:56;35370:4;35376:2;35380:7;35389:5;35339:30;:56::i;:::-;35338:57;35319:76;35315:156;;;35419:40;;;;;;;;;;;;;;35315:156;35109:369;;;;:::o;32596:318::-;32669:13;32700:16;32708:7;32700;:16::i;:::-;32695:59;;32725:29;;;;;;;;;;;;;;32695:59;32767:21;32791:10;:8;:10::i;:::-;32767:34;;32844:1;32825:7;32819:21;:26;;:87;;;;;;;;;;;;;;;;;32872:7;32881:18;:7;:16;:18::i;:::-;32855:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;32819:87;32812:94;;;32596:318;;;:::o;48675:40::-;;;:::o;34381:164::-;34478:4;34502:18;:25;34521:5;34502:25;;;;;;;;;;;;;;;:35;34528:8;34502:35;;;;;;;;;;;;;;;;;;;;;;;;;34495:42;;34381:164;;;;:::o;5050:201::-;4484:13;:11;:13::i;:::-;5159:1:::1;5139:22;;:8;:22;;;;5131:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5215:28;5234:8;5215:18;:28::i;:::-;5050:201:::0;:::o;48722:36::-;;;:::o;16998:157::-;17083:4;17122:25;17107:40;;;:11;:40;;;;17100:47;;16998:157;;;:::o;35733:187::-;35790:4;35833:7;35814:15;:13;:15::i;:::-;:26;;:53;;;;;35854:13;;35844:7;:23;35814:53;:98;;;;;35885:11;:20;35897:7;35885:20;;;;;;;;;;;:27;;;;;;;;;;;;35884:28;35814:98;35807:105;;35733:187;;;:::o;3149:98::-;3202:7;3229:10;3222:17;;3149:98;:::o;45463:196::-;45605:2;45578:15;:24;45594:7;45578:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45643:7;45639:2;45623:28;;45632:5;45623:28;;;;;;;;;;;;45463:196;;;:::o;49178:110::-;49252:7;49279:1;49272:8;;49178:110;:::o;40965:2112::-;41080:35;41118:20;41130:7;41118:11;:20::i;:::-;41080:58;;41151:22;41193:13;:18;;;41177:34;;:12;:10;:12::i;:::-;:34;;;:101;;;;41228:50;41245:13;:18;;;41265:12;:10;:12::i;:::-;41228:16;:50::i;:::-;41177:101;:154;;;;41319:12;:10;:12::i;:::-;41295:36;;:20;41307:7;41295:11;:20::i;:::-;:36;;;41177:154;41151:181;;41350:17;41345:66;;41376:35;;;;;;;;;;;;;;41345:66;41448:4;41426:26;;:13;:18;;;:26;;;41422:67;;41461:28;;;;;;;;;;;;;;41422:67;41518:1;41504:16;;:2;:16;;;41500:52;;;41529:23;;;;;;;;;;;;;;41500:52;41565:43;41587:4;41593:2;41597:7;41606:1;41565:21;:43::i;:::-;41673:49;41690:1;41694:7;41703:13;:18;;;41673:8;:49::i;:::-;42048:1;42018:12;:18;42031:4;42018:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42092:1;42064:12;:16;42077:2;42064:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42138:2;42110:11;:20;42122:7;42110:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;42200:15;42155:11;:20;42167:7;42155:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;42468:19;42500:1;42490:7;:11;42468:33;;42561:1;42520:43;;:11;:24;42532:11;42520:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;42516:445;;;42745:13;;42731:11;:27;42727:219;;;42815:13;:18;;;42783:11;:24;42795:11;42783:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;42898:13;:28;;;42856:11;:24;42868:11;42856:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;42727:219;42516:445;41993:979;43008:7;43004:2;42989:27;;42998:4;42989:27;;;;;;;;;;;;43027:42;43048:4;43054:2;43058:7;43067:1;43027:20;:42::i;:::-;41069:2008;;40965:2112;;;:::o;35928:104::-;35997:27;36007:2;36011:8;35997:27;;;;;;;;;;;;:9;:27::i;:::-;35928:104;;:::o;4763:132::-;4838:12;:10;:12::i;:::-;4827:23;;:7;:5;:7::i;:::-;:23;;;4819:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4763:132::o;36566:113::-;36648:19;36658:8;36648:9;:19::i;:::-;36566:113;:::o;30712:1287::-;30773:21;;:::i;:::-;30807:12;30822:7;30807:22;;30890:4;30871:15;:13;:15::i;:::-;:23;;:47;;;;;30905:13;;30898:4;:20;30871:47;30867:1065;;;30939:31;30973:11;:17;30985:4;30973:17;;;;;;;;;;;30939:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31014:9;:16;;;31009:904;;31085:1;31059:28;;:9;:14;;;:28;;;31055:101;;31123:9;31116:16;;;;;;31055:101;31460:13;31476:1;31460:17;;31500:270;31529:6;;;;;;;;31574:11;:17;31586:4;31574:17;;;;;;;;;;;31562:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:1;31622:28;;:9;:14;;;:28;;;31618:109;;31690:9;31683:16;;;;;;;31618:109;31767:1;31757:7;;;;;;;:11;31500:270;;31845:7;31827:6;31819:34;31794:9;:14;;:60;;;;;;;;;;;31884:9;31877:16;;;;;;;31009:904;30920:1012;30867:1065;31960:31;;;;;;;;;;;;;;30712:1287;;;;:::o;6842:326::-;6902:4;7159:1;7137:7;:19;;;:23;7130:30;;6842:326;;;:::o;46151:667::-;46314:4;46351:2;46335:36;;;46372:12;:10;:12::i;:::-;46386:4;46392:7;46401:5;46335:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;46331:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46586:1;46569:6;:13;:18;46565:235;;;46615:40;;;;;;;;;;;;;;46565:235;46758:6;46752:13;46743:6;46739:2;46735:15;46728:38;46331:480;46464:45;;;46454:55;;;:6;:55;;;;46447:62;;;46151:667;;;;;;:::o;48965:111::-;49026:13;49059:9;49052:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48965:111;:::o;403:723::-;459:13;689:1;680:5;:10;676:53;;;707:10;;;;;;;;;;;;;;;;;;;;;676:53;739:12;754:5;739:20;;770:14;795:78;810:1;802:4;:9;795:78;;828:8;;;;;:::i;:::-;;;;859:2;851:10;;;;;:::i;:::-;;;795:78;;;883:19;915:6;905:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;883:39;;933:154;949:1;940:5;:10;933:154;;977:1;967:11;;;;;:::i;:::-;;;1044:2;1036:5;:10;;;;:::i;:::-;1023:2;:24;;;;:::i;:::-;1010:39;;993:6;1000;993:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;1073:2;1064:11;;;;;:::i;:::-;;;933:154;;;1111:6;1097:21;;;;;403:723;;;;:::o;5411:191::-;5485:16;5504:6;;;;;;;;;;;5485:25;;5530:8;5521:6;;:17;;;;;;;;;;;;;;;;;;5585:8;5554:40;;5575:8;5554:40;;;;;;;;;;;;5474:128;5411:191;:::o;47466:159::-;;;;;:::o;48284:158::-;;;;;:::o;36395:163::-;36518:32;36524:2;36528:8;36538:5;36545:4;36518:5;:32::i;:::-;36395:163;;;:::o;40104:607::-;40205:1;40193:8;:13;40189:44;;;40215:18;;;;;;;;;;;;;;40189:44;40250:20;40273:13;;40250:36;;40301:11;40330:8;40315:12;:23;;;;:::i;:::-;40301:37;;40421:12;40403:6;40395:39;;;;:::i;:::-;40353:11;:26;40365:13;;40353:26;;;;;;;;;;;:31;;;:82;;;;;;;;;;;;;;;;;;40481:166;40583:14;;;;;;40567:12;40549:6;40541:39;40512:86;;40529:1;40512:86;;;;;;;;;;;;40642:3;40626:12;:19;;40481:166;;40693:8;40676:13;;:25;;;;;;;:::i;:::-;;;;;;;;40174:537;;40104:607;:::o;36939:1775::-;37078:20;37101:13;;37078:36;;37143:1;37129:16;;:2;:16;;;37125:48;;;37154:19;;;;;;;;;;;;;;37125:48;37200:1;37188:8;:13;37184:44;;;37210:18;;;;;;;;;;;;;;37184:44;37241:61;37271:1;37275:2;37279:12;37293:8;37241:21;:61::i;:::-;37614:8;37579:12;:16;37592:2;37579:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37678:8;37638:12;:16;37651:2;37638:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37737:2;37704:11;:25;37716:12;37704:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;37804:15;37754:11;:25;37766:12;37754:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;37837:20;37860:12;37837:35;;37887:11;37916:8;37901:12;:23;37887:37;;37945:4;:23;;;;;37953:15;:2;:13;;;:15::i;:::-;37945:23;37941:641;;;37989:314;38045:12;38041:2;38020:38;;38037:1;38020:38;;;;;;;;;;;;38086:69;38125:1;38129:2;38133:14;;;;;;38149:5;38086:30;:69::i;:::-;38081:174;;38191:40;;;;;;;;;;;;;;38081:174;38298:3;38282:12;:19;;37989:314;;38384:12;38367:13;;:29;38363:43;;38398:8;;;38363:43;37941:641;;;38447:120;38503:14;;;;;;38499:2;38478:40;;38495:1;38478:40;;;;;;;;;;;;38562:3;38546:12;:19;;38447:120;;37941:641;38612:12;38596:13;:28;;;;37554:1082;;38646:60;38675:1;38679:2;38683:12;38697:8;38646:20;:60::i;:::-;37067:1647;36939:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;768:719::-;863:5;888:80;904:63;960:6;904:63;:::i;:::-;888:80;:::i;:::-;879:89;;988:5;1017:6;1010:5;1003:21;1051:4;1044:5;1040:16;1033:23;;1077:6;1127:3;1119:4;1111:6;1107:17;1102:3;1098:27;1095:36;1092:143;;;1146:79;;:::i;:::-;1092:143;1259:1;1244:237;1269:6;1266:1;1263:13;1244:237;;;1337:3;1366:36;1398:3;1386:10;1366:36;:::i;:::-;1361:3;1354:49;1432:4;1427:3;1423:14;1416:21;;1466:4;1461:3;1457:14;1450:21;;1304:177;1291:1;1288;1284:9;1279:14;;1244:237;;;1248:14;869:618;;768:719;;;;;:::o;1493:410::-;1570:5;1595:65;1611:48;1652:6;1611:48;:::i;:::-;1595:65;:::i;:::-;1586:74;;1683:6;1676:5;1669:21;1721:4;1714:5;1710:16;1759:3;1750:6;1745:3;1741:16;1738:25;1735:112;;;1766:79;;:::i;:::-;1735:112;1856:41;1890:6;1885:3;1880;1856:41;:::i;:::-;1576:327;1493:410;;;;;:::o;1909:412::-;1987:5;2012:66;2028:49;2070:6;2028:49;:::i;:::-;2012:66;:::i;:::-;2003:75;;2101:6;2094:5;2087:21;2139:4;2132:5;2128:16;2177:3;2168:6;2163:3;2159:16;2156:25;2153:112;;;2184:79;;:::i;:::-;2153:112;2274:41;2308:6;2303:3;2298;2274:41;:::i;:::-;1993:328;1909:412;;;;;:::o;2327:139::-;2373:5;2411:6;2398:20;2389:29;;2427:33;2454:5;2427:33;:::i;:::-;2327:139;;;;:::o;2489:370::-;2560:5;2609:3;2602:4;2594:6;2590:17;2586:27;2576:122;;2617:79;;:::i;:::-;2576:122;2734:6;2721:20;2759:94;2849:3;2841:6;2834:4;2826:6;2822:17;2759:94;:::i;:::-;2750:103;;2566:293;2489:370;;;;:::o;2881:368::-;2951:5;3000:3;2993:4;2985:6;2981:17;2977:27;2967:122;;3008:79;;:::i;:::-;2967:122;3125:6;3112:20;3150:93;3239:3;3231:6;3224:4;3216:6;3212:17;3150:93;:::i;:::-;3141:102;;2957:292;2881:368;;;;:::o;3255:133::-;3298:5;3336:6;3323:20;3314:29;;3352:30;3376:5;3352:30;:::i;:::-;3255:133;;;;:::o;3394:137::-;3439:5;3477:6;3464:20;3455:29;;3493:32;3519:5;3493:32;:::i;:::-;3394:137;;;;:::o;3537:141::-;3593:5;3624:6;3618:13;3609:22;;3640:32;3666:5;3640:32;:::i;:::-;3537:141;;;;:::o;3697:338::-;3752:5;3801:3;3794:4;3786:6;3782:17;3778:27;3768:122;;3809:79;;:::i;:::-;3768:122;3926:6;3913:20;3951:78;4025:3;4017:6;4010:4;4002:6;3998:17;3951:78;:::i;:::-;3942:87;;3758:277;3697:338;;;;:::o;4055:340::-;4111:5;4160:3;4153:4;4145:6;4141:17;4137:27;4127:122;;4168:79;;:::i;:::-;4127:122;4285:6;4272:20;4310:79;4385:3;4377:6;4370:4;4362:6;4358:17;4310:79;:::i;:::-;4301:88;;4117:278;4055:340;;;;:::o;4401:137::-;4446:5;4484:6;4471:20;4462:29;;4500:32;4526:5;4500:32;:::i;:::-;4401:137;;;;:::o;4544:139::-;4590:5;4628:6;4615:20;4606:29;;4644:33;4671:5;4644:33;:::i;:::-;4544:139;;;;:::o;4689:329::-;4748:6;4797:2;4785:9;4776:7;4772:23;4768:32;4765:119;;;4803:79;;:::i;:::-;4765:119;4923:1;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4894:117;4689:329;;;;:::o;5024:474::-;5092:6;5100;5149:2;5137:9;5128:7;5124:23;5120:32;5117:119;;;5155:79;;:::i;:::-;5117:119;5275:1;5300:53;5345:7;5336:6;5325:9;5321:22;5300:53;:::i;:::-;5290:63;;5246:117;5402:2;5428:53;5473:7;5464:6;5453:9;5449:22;5428:53;:::i;:::-;5418:63;;5373:118;5024:474;;;;;:::o;5504:619::-;5581:6;5589;5597;5646:2;5634:9;5625:7;5621:23;5617:32;5614:119;;;5652:79;;:::i;:::-;5614:119;5772:1;5797:53;5842:7;5833:6;5822:9;5818:22;5797:53;:::i;:::-;5787:63;;5743:117;5899:2;5925:53;5970:7;5961:6;5950:9;5946:22;5925:53;:::i;:::-;5915:63;;5870:118;6027:2;6053:53;6098:7;6089:6;6078:9;6074:22;6053:53;:::i;:::-;6043:63;;5998:118;5504:619;;;;;:::o;6129:943::-;6224:6;6232;6240;6248;6297:3;6285:9;6276:7;6272:23;6268:33;6265:120;;;6304:79;;:::i;:::-;6265:120;6424:1;6449:53;6494:7;6485:6;6474:9;6470:22;6449:53;:::i;:::-;6439:63;;6395:117;6551:2;6577:53;6622:7;6613:6;6602:9;6598:22;6577:53;:::i;:::-;6567:63;;6522:118;6679:2;6705:53;6750:7;6741:6;6730:9;6726:22;6705:53;:::i;:::-;6695:63;;6650:118;6835:2;6824:9;6820:18;6807:32;6866:18;6858:6;6855:30;6852:117;;;6888:79;;:::i;:::-;6852:117;6993:62;7047:7;7038:6;7027:9;7023:22;6993:62;:::i;:::-;6983:72;;6778:287;6129:943;;;;;;;:::o;7078:468::-;7143:6;7151;7200:2;7188:9;7179:7;7175:23;7171:32;7168:119;;;7206:79;;:::i;:::-;7168:119;7326:1;7351:53;7396:7;7387:6;7376:9;7372:22;7351:53;:::i;:::-;7341:63;;7297:117;7453:2;7479:50;7521:7;7512:6;7501:9;7497:22;7479:50;:::i;:::-;7469:60;;7424:115;7078:468;;;;;:::o;7552:474::-;7620:6;7628;7677:2;7665:9;7656:7;7652:23;7648:32;7645:119;;;7683:79;;:::i;:::-;7645:119;7803:1;7828:53;7873:7;7864:6;7853:9;7849:22;7828:53;:::i;:::-;7818:63;;7774:117;7930:2;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;:::i;:::-;7946:63;;7901:118;7552:474;;;;;:::o;8032:892::-;8149:6;8157;8206:2;8194:9;8185:7;8181:23;8177:32;8174:119;;;8212:79;;:::i;:::-;8174:119;8360:1;8349:9;8345:17;8332:31;8390:18;8382:6;8379:30;8376:117;;;8412:79;;:::i;:::-;8376:117;8517:78;8587:7;8578:6;8567:9;8563:22;8517:78;:::i;:::-;8507:88;;8303:302;8672:2;8661:9;8657:18;8644:32;8703:18;8695:6;8692:30;8689:117;;;8725:79;;:::i;:::-;8689:117;8830:77;8899:7;8890:6;8879:9;8875:22;8830:77;:::i;:::-;8820:87;;8615:302;8032:892;;;;;:::o;8930:327::-;8988:6;9037:2;9025:9;9016:7;9012:23;9008:32;9005:119;;;9043:79;;:::i;:::-;9005:119;9163:1;9188:52;9232:7;9223:6;9212:9;9208:22;9188:52;:::i;:::-;9178:62;;9134:116;8930:327;;;;:::o;9263:349::-;9332:6;9381:2;9369:9;9360:7;9356:23;9352:32;9349:119;;;9387:79;;:::i;:::-;9349:119;9507:1;9532:63;9587:7;9578:6;9567:9;9563:22;9532:63;:::i;:::-;9522:73;;9478:127;9263:349;;;;:::o;9618:509::-;9687:6;9736:2;9724:9;9715:7;9711:23;9707:32;9704:119;;;9742:79;;:::i;:::-;9704:119;9890:1;9879:9;9875:17;9862:31;9920:18;9912:6;9909:30;9906:117;;;9942:79;;:::i;:::-;9906:117;10047:63;10102:7;10093:6;10082:9;10078:22;10047:63;:::i;:::-;10037:73;;9833:287;9618:509;;;;:::o;10133:329::-;10192:6;10241:2;10229:9;10220:7;10216:23;10212:32;10209:119;;;10247:79;;:::i;:::-;10209:119;10367:1;10392:53;10437:7;10428:6;10417:9;10413:22;10392:53;:::i;:::-;10382:63;;10338:117;10133:329;;;;:::o;10468:118::-;10555:24;10573:5;10555:24;:::i;:::-;10550:3;10543:37;10468:118;;:::o;10592:109::-;10673:21;10688:5;10673:21;:::i;:::-;10668:3;10661:34;10592:109;;:::o;10707:360::-;10793:3;10821:38;10853:5;10821:38;:::i;:::-;10875:70;10938:6;10933:3;10875:70;:::i;:::-;10868:77;;10954:52;10999:6;10994:3;10987:4;10980:5;10976:16;10954:52;:::i;:::-;11031:29;11053:6;11031:29;:::i;:::-;11026:3;11022:39;11015:46;;10797:270;10707:360;;;;:::o;11073:364::-;11161:3;11189:39;11222:5;11189:39;:::i;:::-;11244:71;11308:6;11303:3;11244:71;:::i;:::-;11237:78;;11324:52;11369:6;11364:3;11357:4;11350:5;11346:16;11324:52;:::i;:::-;11401:29;11423:6;11401:29;:::i;:::-;11396:3;11392:39;11385:46;;11165:272;11073:364;;;;:::o;11443:377::-;11549:3;11577:39;11610:5;11577:39;:::i;:::-;11632:89;11714:6;11709:3;11632:89;:::i;:::-;11625:96;;11730:52;11775:6;11770:3;11763:4;11756:5;11752:16;11730:52;:::i;:::-;11807:6;11802:3;11798:16;11791:23;;11553:267;11443:377;;;;:::o;11826:366::-;11968:3;11989:67;12053:2;12048:3;11989:67;:::i;:::-;11982:74;;12065:93;12154:3;12065:93;:::i;:::-;12183:2;12178:3;12174:12;12167:19;;11826:366;;;:::o;12198:::-;12340:3;12361:67;12425:2;12420:3;12361:67;:::i;:::-;12354:74;;12437:93;12526:3;12437:93;:::i;:::-;12555:2;12550:3;12546:12;12539:19;;12198:366;;;:::o;12570:::-;12712:3;12733:67;12797:2;12792:3;12733:67;:::i;:::-;12726:74;;12809:93;12898:3;12809:93;:::i;:::-;12927:2;12922:3;12918:12;12911:19;;12570:366;;;:::o;12942:365::-;13084:3;13105:66;13169:1;13164:3;13105:66;:::i;:::-;13098:73;;13180:93;13269:3;13180:93;:::i;:::-;13298:2;13293:3;13289:12;13282:19;;12942:365;;;:::o;13313:366::-;13455:3;13476:67;13540:2;13535:3;13476:67;:::i;:::-;13469:74;;13552:93;13641:3;13552:93;:::i;:::-;13670:2;13665:3;13661:12;13654:19;;13313:366;;;:::o;13685:::-;13827:3;13848:67;13912:2;13907:3;13848:67;:::i;:::-;13841:74;;13924:93;14013:3;13924:93;:::i;:::-;14042:2;14037:3;14033:12;14026:19;;13685:366;;;:::o;14057:::-;14199:3;14220:67;14284:2;14279:3;14220:67;:::i;:::-;14213:74;;14296:93;14385:3;14296:93;:::i;:::-;14414:2;14409:3;14405:12;14398:19;;14057:366;;;:::o;14429:398::-;14588:3;14609:83;14690:1;14685:3;14609:83;:::i;:::-;14602:90;;14701:93;14790:3;14701:93;:::i;:::-;14819:1;14814:3;14810:11;14803:18;;14429:398;;;:::o;14833:118::-;14920:24;14938:5;14920:24;:::i;:::-;14915:3;14908:37;14833:118;;:::o;14957:115::-;15042:23;15059:5;15042:23;:::i;:::-;15037:3;15030:36;14957:115;;:::o;15078:435::-;15258:3;15280:95;15371:3;15362:6;15280:95;:::i;:::-;15273:102;;15392:95;15483:3;15474:6;15392:95;:::i;:::-;15385:102;;15504:3;15497:10;;15078:435;;;;;:::o;15519:379::-;15703:3;15725:147;15868:3;15725:147;:::i;:::-;15718:154;;15889:3;15882:10;;15519:379;;;:::o;15904:222::-;15997:4;16035:2;16024:9;16020:18;16012:26;;16048:71;16116:1;16105:9;16101:17;16092:6;16048:71;:::i;:::-;15904:222;;;;:::o;16132:640::-;16327:4;16365:3;16354:9;16350:19;16342:27;;16379:71;16447:1;16436:9;16432:17;16423:6;16379:71;:::i;:::-;16460:72;16528:2;16517:9;16513:18;16504:6;16460:72;:::i;:::-;16542;16610:2;16599:9;16595:18;16586:6;16542:72;:::i;:::-;16661:9;16655:4;16651:20;16646:2;16635:9;16631:18;16624:48;16689:76;16760:4;16751:6;16689:76;:::i;:::-;16681:84;;16132:640;;;;;;;:::o;16778:210::-;16865:4;16903:2;16892:9;16888:18;16880:26;;16916:65;16978:1;16967:9;16963:17;16954:6;16916:65;:::i;:::-;16778:210;;;;:::o;16994:313::-;17107:4;17145:2;17134:9;17130:18;17122:26;;17194:9;17188:4;17184:20;17180:1;17169:9;17165:17;17158:47;17222:78;17295:4;17286:6;17222:78;:::i;:::-;17214:86;;16994:313;;;;:::o;17313:419::-;17479:4;17517:2;17506:9;17502:18;17494:26;;17566:9;17560:4;17556:20;17552:1;17541:9;17537:17;17530:47;17594:131;17720:4;17594:131;:::i;:::-;17586:139;;17313:419;;;:::o;17738:::-;17904:4;17942:2;17931:9;17927:18;17919:26;;17991:9;17985:4;17981:20;17977:1;17966:9;17962:17;17955:47;18019:131;18145:4;18019:131;:::i;:::-;18011:139;;17738:419;;;:::o;18163:::-;18329:4;18367:2;18356:9;18352:18;18344:26;;18416:9;18410:4;18406:20;18402:1;18391:9;18387:17;18380:47;18444:131;18570:4;18444:131;:::i;:::-;18436:139;;18163:419;;;:::o;18588:::-;18754:4;18792:2;18781:9;18777:18;18769:26;;18841:9;18835:4;18831:20;18827:1;18816:9;18812:17;18805:47;18869:131;18995:4;18869:131;:::i;:::-;18861:139;;18588:419;;;:::o;19013:::-;19179:4;19217:2;19206:9;19202:18;19194:26;;19266:9;19260:4;19256:20;19252:1;19241:9;19237:17;19230:47;19294:131;19420:4;19294:131;:::i;:::-;19286:139;;19013:419;;;:::o;19438:::-;19604:4;19642:2;19631:9;19627:18;19619:26;;19691:9;19685:4;19681:20;19677:1;19666:9;19662:17;19655:47;19719:131;19845:4;19719:131;:::i;:::-;19711:139;;19438:419;;;:::o;19863:::-;20029:4;20067:2;20056:9;20052:18;20044:26;;20116:9;20110:4;20106:20;20102:1;20091:9;20087:17;20080:47;20144:131;20270:4;20144:131;:::i;:::-;20136:139;;19863:419;;;:::o;20288:222::-;20381:4;20419:2;20408:9;20404:18;20396:26;;20432:71;20500:1;20489:9;20485:17;20476:6;20432:71;:::i;:::-;20288:222;;;;:::o;20516:218::-;20607:4;20645:2;20634:9;20630:18;20622:26;;20658:69;20724:1;20713:9;20709:17;20700:6;20658:69;:::i;:::-;20516:218;;;;:::o;20740:129::-;20774:6;20801:20;;:::i;:::-;20791:30;;20830:33;20858:4;20850:6;20830:33;:::i;:::-;20740:129;;;:::o;20875:75::-;20908:6;20941:2;20935:9;20925:19;;20875:75;:::o;20956:311::-;21033:4;21123:18;21115:6;21112:30;21109:56;;;21145:18;;:::i;:::-;21109:56;21195:4;21187:6;21183:17;21175:25;;21255:4;21249;21245:15;21237:23;;20956:311;;;:::o;21273:310::-;21349:4;21439:18;21431:6;21428:30;21425:56;;;21461:18;;:::i;:::-;21425:56;21511:4;21503:6;21499:17;21491:25;;21571:4;21565;21561:15;21553:23;;21273:310;;;:::o;21589:307::-;21650:4;21740:18;21732:6;21729:30;21726:56;;;21762:18;;:::i;:::-;21726:56;21800:29;21822:6;21800:29;:::i;:::-;21792:37;;21884:4;21878;21874:15;21866:23;;21589:307;;;:::o;21902:308::-;21964:4;22054:18;22046:6;22043:30;22040:56;;;22076:18;;:::i;:::-;22040:56;22114:29;22136:6;22114:29;:::i;:::-;22106:37;;22198:4;22192;22188:15;22180:23;;21902:308;;;:::o;22216:98::-;22267:6;22301:5;22295:12;22285:22;;22216:98;;;:::o;22320:99::-;22372:6;22406:5;22400:12;22390:22;;22320:99;;;:::o;22425:168::-;22508:11;22542:6;22537:3;22530:19;22582:4;22577:3;22573:14;22558:29;;22425:168;;;;:::o;22599:147::-;22700:11;22737:3;22722:18;;22599:147;;;;:::o;22752:169::-;22836:11;22870:6;22865:3;22858:19;22910:4;22905:3;22901:14;22886:29;;22752:169;;;;:::o;22927:148::-;23029:11;23066:3;23051:18;;22927:148;;;;:::o;23081:281::-;23121:3;23140:20;23158:1;23140:20;:::i;:::-;23135:25;;23174:20;23192:1;23174:20;:::i;:::-;23169:25;;23304:1;23260:42;23256:50;23253:1;23250:57;23247:83;;;23310:18;;:::i;:::-;23247:83;23354:1;23351;23347:9;23340:16;;23081:281;;;;:::o;23368:305::-;23408:3;23427:20;23445:1;23427:20;:::i;:::-;23422:25;;23461:20;23479:1;23461:20;:::i;:::-;23456:25;;23615:1;23547:66;23543:74;23540:1;23537:81;23534:107;;;23621:18;;:::i;:::-;23534:107;23665:1;23662;23658:9;23651:16;;23368:305;;;;:::o;23679:185::-;23719:1;23736:20;23754:1;23736:20;:::i;:::-;23731:25;;23770:20;23788:1;23770:20;:::i;:::-;23765:25;;23809:1;23799:35;;23814:18;;:::i;:::-;23799:35;23856:1;23853;23849:9;23844:14;;23679:185;;;;:::o;23870:348::-;23910:7;23933:20;23951:1;23933:20;:::i;:::-;23928:25;;23967:20;23985:1;23967:20;:::i;:::-;23962:25;;24155:1;24087:66;24083:74;24080:1;24077:81;24072:1;24065:9;24058:17;24054:105;24051:131;;;24162:18;;:::i;:::-;24051:131;24210:1;24207;24203:9;24192:20;;23870:348;;;;:::o;24224:191::-;24264:4;24284:20;24302:1;24284:20;:::i;:::-;24279:25;;24318:20;24336:1;24318:20;:::i;:::-;24313:25;;24357:1;24354;24351:8;24348:34;;;24362:18;;:::i;:::-;24348:34;24407:1;24404;24400:9;24392:17;;24224:191;;;;:::o;24421:::-;24461:4;24481:20;24499:1;24481:20;:::i;:::-;24476:25;;24515:20;24533:1;24515:20;:::i;:::-;24510:25;;24554:1;24551;24548:8;24545:34;;;24559:18;;:::i;:::-;24545:34;24604:1;24601;24597:9;24589:17;;24421:191;;;;:::o;24618:96::-;24655:7;24684:24;24702:5;24684:24;:::i;:::-;24673:35;;24618:96;;;:::o;24720:90::-;24754:7;24797:5;24790:13;24783:21;24772:32;;24720:90;;;:::o;24816:149::-;24852:7;24892:66;24885:5;24881:78;24870:89;;24816:149;;;:::o;24971:89::-;25007:7;25047:6;25040:5;25036:18;25025:29;;24971:89;;;:::o;25066:126::-;25103:7;25143:42;25136:5;25132:54;25121:65;;25066:126;;;:::o;25198:77::-;25235:7;25264:5;25253:16;;25198:77;;;:::o;25281:93::-;25317:7;25357:10;25350:5;25346:22;25335:33;;25281:93;;;:::o;25380:154::-;25464:6;25459:3;25454;25441:30;25526:1;25517:6;25512:3;25508:16;25501:27;25380:154;;;:::o;25540:307::-;25608:1;25618:113;25632:6;25629:1;25626:13;25618:113;;;25717:1;25712:3;25708:11;25702:18;25698:1;25693:3;25689:11;25682:39;25654:2;25651:1;25647:10;25642:15;;25618:113;;;25749:6;25746:1;25743:13;25740:101;;;25829:1;25820:6;25815:3;25811:16;25804:27;25740:101;25589:258;25540:307;;;:::o;25853:320::-;25897:6;25934:1;25928:4;25924:12;25914:22;;25981:1;25975:4;25971:12;26002:18;25992:81;;26058:4;26050:6;26046:17;26036:27;;25992:81;26120:2;26112:6;26109:14;26089:18;26086:38;26083:84;;;26139:18;;:::i;:::-;26083:84;25904:269;25853:320;;;:::o;26179:281::-;26262:27;26284:4;26262:27;:::i;:::-;26254:6;26250:40;26392:6;26380:10;26377:22;26356:18;26344:10;26341:34;26338:62;26335:88;;;26403:18;;:::i;:::-;26335:88;26443:10;26439:2;26432:22;26222:238;26179:281;;:::o;26466:233::-;26505:3;26528:24;26546:5;26528:24;:::i;:::-;26519:33;;26574:66;26567:5;26564:77;26561:103;;;26644:18;;:::i;:::-;26561:103;26691:1;26684:5;26680:13;26673:20;;26466:233;;;:::o;26705:176::-;26737:1;26754:20;26772:1;26754:20;:::i;:::-;26749:25;;26788:20;26806:1;26788:20;:::i;:::-;26783:25;;26827:1;26817:35;;26832:18;;:::i;:::-;26817:35;26873:1;26870;26866:9;26861:14;;26705:176;;;;:::o;26887:180::-;26935:77;26932:1;26925:88;27032:4;27029:1;27022:15;27056:4;27053:1;27046:15;27073:180;27121:77;27118:1;27111:88;27218:4;27215:1;27208:15;27242:4;27239:1;27232:15;27259:180;27307:77;27304:1;27297:88;27404:4;27401:1;27394:15;27428:4;27425:1;27418:15;27445:180;27493:77;27490:1;27483:88;27590:4;27587:1;27580:15;27614:4;27611:1;27604:15;27631:180;27679:77;27676:1;27669:88;27776:4;27773:1;27766:15;27800:4;27797:1;27790:15;27817:117;27926:1;27923;27916:12;27940:117;28049:1;28046;28039:12;28063:117;28172:1;28169;28162:12;28186:117;28295:1;28292;28285:12;28309:117;28418:1;28415;28408:12;28432:102;28473:6;28524:2;28520:7;28515:2;28508:5;28504:14;28500:28;28490:38;;28432:102;;;:::o;28540:162::-;28680:14;28676:1;28668:6;28664:14;28657:38;28540:162;:::o;28708:225::-;28848:34;28844:1;28836:6;28832:14;28825:58;28917:8;28912:2;28904:6;28900:15;28893:33;28708:225;:::o;28939:174::-;29079:26;29075:1;29067:6;29063:14;29056:50;28939:174;:::o;29119:158::-;29259:10;29255:1;29247:6;29243:14;29236:34;29119:158;:::o;29283:180::-;29423:32;29419:1;29411:6;29407:14;29400:56;29283:180;:::o;29469:166::-;29609:18;29605:1;29597:6;29593:14;29586:42;29469:166;:::o;29641:182::-;29781:34;29777:1;29769:6;29765:14;29758:58;29641:182;:::o;29829:114::-;;:::o;29949:122::-;30022:24;30040:5;30022:24;:::i;:::-;30015:5;30012:35;30002:63;;30061:1;30058;30051:12;30002:63;29949:122;:::o;30077:116::-;30147:21;30162:5;30147:21;:::i;:::-;30140:5;30137:32;30127:60;;30183:1;30180;30173:12;30127:60;30077:116;:::o;30199:120::-;30271:23;30288:5;30271:23;:::i;:::-;30264:5;30261:34;30251:62;;30309:1;30306;30299:12;30251:62;30199:120;:::o;30325:::-;30397:23;30414:5;30397:23;:::i;:::-;30390:5;30387:34;30377:62;;30435:1;30432;30425:12;30377:62;30325:120;:::o;30451:122::-;30524:24;30542:5;30524:24;:::i;:::-;30517:5;30514:35;30504:63;;30563:1;30560;30553:12;30504:63;30451:122;:::o
Swarm Source
ipfs://2984ffa01ccb7df6be2c53510e3f984c431b8034320001155f7c4fa6c896aa4f
Loading...
Loading
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.