ERC-721
Overview
Max Total Supply
3,782 WAGTY
Holders
504
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 WAGTYLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
WAGTY
Compiler Version
v0.8.13+commit.abaa5c0e
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-14 */ // SPDX-License-Identifier: CC0 pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _HEX_SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/utils/Context.sol // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } // File: @openzeppelin/contracts/access/Ownable.sol // OpenZeppelin Contracts v4.4.1 (access/Ownable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor() { _transferOwnership(_msgSender()); } /** * @dev Returns the address of the current owner. */ function owner() public view virtual returns (address) { return _owner; } /** * @dev Throws if called by any account other than the owner. */ modifier onlyOwner() { require(owner() == _msgSender(), "Ownable: caller is not the owner"); _; } /** * @dev Leaves the contract without owner. It will not be possible to call * `onlyOwner` functions anymore. Can only be called by the current owner. * * NOTE: Renouncing ownership will leave the contract without an owner, * thereby removing any functionality that is only available to the owner. */ function renounceOwnership() public virtual onlyOwner { _transferOwnership(address(0)); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Can only be called by the current owner. */ function transferOwnership(address newOwner) public virtual onlyOwner { require(newOwner != address(0), "Ownable: new owner is the zero address"); _transferOwnership(newOwner); } /** * @dev Transfers ownership of the contract to a new account (`newOwner`). * Internal function without access restriction. */ function _transferOwnership(address newOwner) internal virtual { address oldOwner = _owner; _owner = newOwner; emit OwnershipTransferred(oldOwner, newOwner); } } // File: @openzeppelin/contracts/utils/Address.sol // OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol) pragma solidity ^0.8.1; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== * * [IMPORTANT] * ==== * You shouldn't rely on `isContract` to protect against flash loan attacks! * * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract * constructor. * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize/address.code.length, which returns 0 // for contracts in construction, since the code is only stored at the end // of the constructor execution. return account.code.length > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol // OpenZeppelin Contracts v4.4.1 (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 `IERC721.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 v4.4.1 (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`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // 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: https://github.com/chiru-labs/ERC721A/blob/v3.1.0/contracts/ERC721A.sol // Creator: Chiru Labs pragma solidity ^0.8.4; error ApprovalCallerNotOwnerNorApproved(); error ApprovalQueryForNonexistentToken(); error ApproveToCaller(); error ApprovalToCurrentOwner(); error BalanceQueryForZeroAddress(); error MintToZeroAddress(); error MintZeroQuantity(); error OwnerQueryForNonexistentToken(); 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 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(); return uint256(_addressData[owner].balance); } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { 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) { 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) { 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 { _addressData[owner].aux = aux; } /** * 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. while (true) { curr--; ownership = _ownerships[curr]; if (ownership.addr != address(0)) { 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 virtual 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); } /** * @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); } /** * @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); if (prevOwnership.addr != from) revert TransferFromIncorrectOwner(); bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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; TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = to; currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev This is equivalent to _burn(tokenId, false) */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { TokenOwnership memory prevOwnership = _ownershipOf(tokenId); address from = prevOwnership.addr; if (approvalCheck) { bool isApprovedOrOwner = (_msgSender() == from || isApprovedForAll(from, _msgSender()) || getApproved(tokenId) == _msgSender()); if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner _approve(address(0), tokenId, from); // 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 storage addressData = _addressData[from]; addressData.balance -= 1; addressData.numberBurned += 1; // Keep track of who burned the token, and the timestamp of burning. TokenOwnership storage currSlot = _ownerships[tokenId]; currSlot.addr = from; currSlot.startTimestamp = uint64(block.timestamp); currSlot.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; TokenOwnership storage nextSlot = _ownerships[nextTokenId]; if (nextSlot.addr == address(0)) { // This will suffice for checking _exists(nextTokenId), // as a burned slot cannot contain the zero address. if (nextTokenId != _currentIndex) { nextSlot.addr = from; nextSlot.startTimestamp = prevOwnership.startTimestamp; } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, 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: contract.sol pragma solidity 0.8.13; contract WAGTY is ERC721A, Ownable { uint16 public constant MAX_SUPPLY = 6666; uint8 public constant MAX_PER_WALLET = 6; function contractURI() public view returns (string memory) { return "https://jsonkeeper.com/b/9YMK"; } bool private revealed = false; string private baseUri = "https://wagty.mypinata.cloud/ipfs/Qmc3A8BbZxY4EmFsAW3nF8jjJLVYs2awxj8tkhtVupGkbr/"; uint96 private royaltyBasisPoints = 1000; constructor() ERC721A("We all Are Glitch to Try", "WAGTY") {} function soldOut() external view returns (bool) { return totalSupply() == MAX_SUPPLY; } function numberMinted(address owner) external view returns (uint256) { return _numberMinted(owner); } function mint(uint256 _quantity) external { require(_quantity > 0, "INCORRECT_QUANTITY"); require(_numberMinted(msg.sender) + _quantity <= MAX_PER_WALLET, "INCORRECT_QUANTITY"); require(totalSupply() + _quantity <= MAX_SUPPLY, "SALE_MAXED"); _safeMint(msg.sender, _quantity); } function devMint(uint256 _quantity) external onlyOwner { require(_quantity > 0, "INCORRECT_QUANTITY"); require(totalSupply() + _quantity <= MAX_SUPPLY, "SALE_MAXED"); _safeMint(msg.sender, _quantity); } function _startTokenId() internal view virtual override returns (uint256) { return 1; } function setBaseUri(string calldata _baseUri) external onlyOwner { baseUri = _baseUri; } function reveal(string calldata _baseUri) external onlyOwner { revealed = true; baseUri = _baseUri; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory filename = revealed ? Strings.toString(tokenId) : "hidden"; return bytes(baseUri).length != 0 ? string(abi.encodePacked(baseUri, filename, ".json")) : ''; } function setRoyalty(uint96 _royaltyBasisPoints) external onlyOwner { royaltyBasisPoints = _royaltyBasisPoints; } function royaltyInfo(uint256 _tokenId, uint256 _salePrice) external view returns (address receiver, uint256 royaltyAmount) { require(_exists(_tokenId), "Cannot query non-existent token"); return (owner(), (_salePrice * royaltyBasisPoints) / 1000); } }
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":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"royaltyAmount","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_baseUri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_royaltyBasisPoints","type":"uint96"}],"name":"setRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"soldOut","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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"}]
Contract Creation Code
60806040526000600860146101000a81548160ff0219169083151502179055506040518060800160405280605181526020016200387060519139600990805190602001906200005092919062000245565b506103e8600a60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055503480156200009157600080fd5b506040518060400160405280601881526020017f576520616c6c2041726520476c6974636820746f2054727900000000000000008152506040518060400160405280600581526020017f574147545900000000000000000000000000000000000000000000000000000081525081600290805190602001906200011692919062000245565b5080600390805190602001906200012f92919062000245565b50620001406200016e60201b60201c565b6000819055505050620001686200015c6200017760201b60201c565b6200017f60201b60201c565b62000359565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002539062000324565b90600052602060002090601f016020900481019282620002775760008555620002c3565b82601f106200029257805160ff1916838001178555620002c3565b82800160010185558215620002c3579182015b82811115620002c2578251825591602001919060010190620002a5565b5b509050620002d29190620002d6565b5090565b5b80821115620002f1576000816000905550600101620002d7565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200033d57607f821691505b602082108103620003535762000352620002f5565b5b50919050565b61350780620003696000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063dc33e68111610071578063dc33e681146104de578063e8a3d4851461050e578063e985e9c51461052c578063f2fde38b1461055c576101c4565b8063b88d4fde14610476578063c87b56dd14610492578063cac92669146104c2576101c4565b806395d89b41116100d357806395d89b4114610404578063a0712d6814610422578063a0bcfc7f1461043e578063a22cb4651461045a576101c4565b8063715018a6146103be578063893da6c9146103c85780638da5cb5b146103e6576101c4565b80632a55205a1161016657806342842e0e1161014057806342842e0e146103265780634c261247146103425780636352211e1461035e57806370a082311461038e576101c4565b80632a55205a146102bb57806332cb6b0c146102ec578063375a069a1461030a576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780630f2cdd6c1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612699565b610578565b6040516101f091906126e1565b60405180910390f35b61020161065a565b60405161020e9190612795565b60405180910390f35b610231600480360381019061022c91906127ed565b6106ec565b60405161023e919061285b565b60405180910390f35b610261600480360381019061025c91906128a2565b610768565b005b61026b610872565b60405161027891906128fe565b60405180910390f35b610289610877565b6040516102969190612928565b60405180910390f35b6102b960048036038101906102b49190612943565b61088e565b005b6102d560048036038101906102d09190612996565b61089e565b6040516102e39291906129d6565b60405180910390f35b6102f461093d565b6040516103019190612a1c565b60405180910390f35b610324600480360381019061031f91906127ed565b610943565b005b610340600480360381019061033b9190612943565b610a6a565b005b61035c60048036038101906103579190612a9c565b610a8a565b005b610378600480360381019061037391906127ed565b610b37565b604051610385919061285b565b60405180910390f35b6103a860048036038101906103a39190612ae9565b610b4d565b6040516103b59190612928565b60405180910390f35b6103c6610c1c565b005b6103d0610ca4565b6040516103dd91906126e1565b60405180910390f35b6103ee610cbb565b6040516103fb919061285b565b60405180910390f35b61040c610ce5565b6040516104199190612795565b60405180910390f35b61043c600480360381019061043791906127ed565b610d77565b005b61045860048036038101906104539190612a9c565b610e7c565b005b610474600480360381019061046f9190612b42565b610f0e565b005b610490600480360381019061048b9190612cb2565b611085565b005b6104ac60048036038101906104a791906127ed565b611101565b6040516104b99190612795565b60405180910390f35b6104dc60048036038101906104d79190612d79565b6111f6565b005b6104f860048036038101906104f39190612ae9565b6112a6565b6040516105059190612928565b60405180910390f35b6105166112b8565b6040516105239190612795565b60405180910390f35b61054660048036038101906105419190612da6565b6112f5565b60405161055391906126e1565b60405180910390f35b61057660048036038101906105719190612ae9565b611389565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610653575061065282611480565b5b9050919050565b60606002805461066990612e15565b80601f016020809104026020016040519081016040528092919081815260200182805461069590612e15565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f7826114ea565b61072d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077382610b37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107da576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f9611538565b73ffffffffffffffffffffffffffffffffffffffff161415801561082b575061082981610824611538565b6112f5565b155b15610862576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61086d838383611540565b505050565b600681565b60006108816115f2565b6001546000540303905090565b6108998383836115fb565b505050565b6000806108aa846114ea565b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090612e92565b60405180910390fd5b6108f1610cbb565b6103e8600a60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856109289190612ee1565b6109329190612f6a565b915091509250929050565b611a0a81565b61094b611538565b73ffffffffffffffffffffffffffffffffffffffff16610969610cbb565b73ffffffffffffffffffffffffffffffffffffffff16146109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612fe7565b60405180910390fd5b60008111610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613053565b60405180910390fd5b611a0a61ffff1681610a12610877565b610a1c9190613073565b1115610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613115565b60405180910390fd5b610a673382611aaf565b50565b610a8583838360405180602001604052806000815250611085565b505050565b610a92611538565b73ffffffffffffffffffffffffffffffffffffffff16610ab0610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90612fe7565b60405180910390fd5b6001600860146101000a81548160ff021916908315150217905550818160099190610b32929190612547565b505050565b6000610b4282611acd565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c24611538565b73ffffffffffffffffffffffffffffffffffffffff16610c42610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90612fe7565b60405180910390fd5b610ca26000611d5c565b565b6000611a0a61ffff16610cb5610877565b14905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610cf490612e15565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2090612e15565b8015610d6d5780601f10610d4257610100808354040283529160200191610d6d565b820191906000526020600020905b815481529060010190602001808311610d5057829003601f168201915b5050505050905090565b60008111610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613053565b60405180910390fd5b600660ff1681610dc933611e22565b610dd39190613073565b1115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613053565b60405180910390fd5b611a0a61ffff1681610e24610877565b610e2e9190613073565b1115610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613115565b60405180910390fd5b610e793382611aaf565b50565b610e84611538565b73ffffffffffffffffffffffffffffffffffffffff16610ea2610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90612fe7565b60405180910390fd5b818160099190610f09929190612547565b505050565b610f16611538565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f7a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f87611538565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611034611538565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161107991906126e1565b60405180910390a35050565b6110908484846115fb565b6110af8373ffffffffffffffffffffffffffffffffffffffff16611e8c565b80156110c457506110c284848484611eaf565b155b156110fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061110c826114ea565b611142576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600860149054906101000a900460ff16611193576040518060400160405280600681526020017f68696464656e000000000000000000000000000000000000000000000000000081525061119d565b61119c83611fff565b5b90506000600980546111ae90612e15565b9050036111ca57604051806020016040528060008152506111ee565b6009816040516020016111de929190613251565b6040516020818303038152906040525b915050919050565b6111fe611538565b73ffffffffffffffffffffffffffffffffffffffff1661121c610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990612fe7565b60405180910390fd5b80600a60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b60006112b182611e22565b9050919050565b60606040518060400160405280601d81526020017f68747470733a2f2f6a736f6e6b65657065722e636f6d2f622f39594d4b000000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611391611538565b73ffffffffffffffffffffffffffffffffffffffff166113af610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90612fe7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906132f2565b60405180910390fd5b61147d81611d5c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816114f56115f2565b11158015611504575060005482105b8015611531575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061160682611acd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611671576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611692611538565b73ffffffffffffffffffffffffffffffffffffffff1614806116c157506116c0856116bb611538565b6112f5565b5b8061170657506116cf611538565b73ffffffffffffffffffffffffffffffffffffffff166116ee846106ec565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061173f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117b2858585600161215f565b6117be60008487611540565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a3d576000548214611a3c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa88585856001612165565b5050505050565b611ac982826040518060200160405280600081525061216b565b5050565b611ad56125cd565b600082905080611ae36115f2565b11158015611af2575060005481105b15611d25576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d2357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c07578092505050611d57565b5b600115611d2257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d1d578092505050611d57565b611c08565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ed5611538565b8786866040518563ffffffff1660e01b8152600401611ef79493929190613367565b6020604051808303816000875af1925050508015611f3357506040513d601f19601f82011682018060405250810190611f3091906133c8565b60015b611fac573d8060008114611f63576040519150601f19603f3d011682016040523d82523d6000602084013e611f68565b606091505b506000815103611fa4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612046576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215a565b600082905060005b60008214612078578080612061906133f5565b915050600a826120719190612f6a565b915061204e565b60008167ffffffffffffffff81111561209457612093612b87565b5b6040519080825280601f01601f1916602001820160405280156120c65781602001600182028036833780820191505090505b5090505b60008514612153576001826120df919061343d565b9150600a856120ee9190613471565b60306120fa9190613073565b60f81b8183815181106121105761210f6134a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214c9190612f6a565b94506120ca565b8093505050505b919050565b50505050565b50505050565b612178838383600161217d565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612223576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612230600086838761215f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123fa57506123f98773ffffffffffffffffffffffffffffffffffffffff16611e8c565b5b156124bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f6000888480600101955088611eaf565b6124a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124005782600054146124ba57600080fd5b61252a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036124c0575b8160008190555050506125406000868387612165565b5050505050565b82805461255390612e15565b90600052602060002090601f01602090048101928261257557600085556125bc565b82601f1061258e57803560ff19168380011785556125bc565b828001600101855582156125bc579182015b828111156125bb5782358255916020019190600101906125a0565b5b5090506125c99190612610565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612629576000816000905550600101612611565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61267681612641565b811461268157600080fd5b50565b6000813590506126938161266d565b92915050565b6000602082840312156126af576126ae612637565b5b60006126bd84828501612684565b91505092915050565b60008115159050919050565b6126db816126c6565b82525050565b60006020820190506126f660008301846126d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561273657808201518184015260208101905061271b565b83811115612745576000848401525b50505050565b6000601f19601f8301169050919050565b6000612767826126fc565b6127718185612707565b9350612781818560208601612718565b61278a8161274b565b840191505092915050565b600060208201905081810360008301526127af818461275c565b905092915050565b6000819050919050565b6127ca816127b7565b81146127d557600080fd5b50565b6000813590506127e7816127c1565b92915050565b60006020828403121561280357612802612637565b5b6000612811848285016127d8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128458261281a565b9050919050565b6128558161283a565b82525050565b6000602082019050612870600083018461284c565b92915050565b61287f8161283a565b811461288a57600080fd5b50565b60008135905061289c81612876565b92915050565b600080604083850312156128b9576128b8612637565b5b60006128c78582860161288d565b92505060206128d8858286016127d8565b9150509250929050565b600060ff82169050919050565b6128f8816128e2565b82525050565b600060208201905061291360008301846128ef565b92915050565b612922816127b7565b82525050565b600060208201905061293d6000830184612919565b92915050565b60008060006060848603121561295c5761295b612637565b5b600061296a8682870161288d565b935050602061297b8682870161288d565b925050604061298c868287016127d8565b9150509250925092565b600080604083850312156129ad576129ac612637565b5b60006129bb858286016127d8565b92505060206129cc858286016127d8565b9150509250929050565b60006040820190506129eb600083018561284c565b6129f86020830184612919565b9392505050565b600061ffff82169050919050565b612a16816129ff565b82525050565b6000602082019050612a316000830184612a0d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5c57612a5b612a37565b5b8235905067ffffffffffffffff811115612a7957612a78612a3c565b5b602083019150836001820283011115612a9557612a94612a41565b5b9250929050565b60008060208385031215612ab357612ab2612637565b5b600083013567ffffffffffffffff811115612ad157612ad061263c565b5b612add85828601612a46565b92509250509250929050565b600060208284031215612aff57612afe612637565b5b6000612b0d8482850161288d565b91505092915050565b612b1f816126c6565b8114612b2a57600080fd5b50565b600081359050612b3c81612b16565b92915050565b60008060408385031215612b5957612b58612637565b5b6000612b678582860161288d565b9250506020612b7885828601612b2d565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bbf8261274b565b810181811067ffffffffffffffff82111715612bde57612bdd612b87565b5b80604052505050565b6000612bf161262d565b9050612bfd8282612bb6565b919050565b600067ffffffffffffffff821115612c1d57612c1c612b87565b5b612c268261274b565b9050602081019050919050565b82818337600083830152505050565b6000612c55612c5084612c02565b612be7565b905082815260208101848484011115612c7157612c70612b82565b5b612c7c848285612c33565b509392505050565b600082601f830112612c9957612c98612a37565b5b8135612ca9848260208601612c42565b91505092915050565b60008060008060808587031215612ccc57612ccb612637565b5b6000612cda8782880161288d565b9450506020612ceb8782880161288d565b9350506040612cfc878288016127d8565b925050606085013567ffffffffffffffff811115612d1d57612d1c61263c565b5b612d2987828801612c84565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b612d5681612d35565b8114612d6157600080fd5b50565b600081359050612d7381612d4d565b92915050565b600060208284031215612d8f57612d8e612637565b5b6000612d9d84828501612d64565b91505092915050565b60008060408385031215612dbd57612dbc612637565b5b6000612dcb8582860161288d565b9250506020612ddc8582860161288d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e2d57607f821691505b602082108103612e4057612e3f612de6565b5b50919050565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b6000612e7c601f83612707565b9150612e8782612e46565b602082019050919050565b60006020820190508181036000830152612eab81612e6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612eec826127b7565b9150612ef7836127b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f3057612f2f612eb2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f75826127b7565b9150612f80836127b7565b925082612f9057612f8f612f3b565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fd1602083612707565b9150612fdc82612f9b565b602082019050919050565b6000602082019050818103600083015261300081612fc4565b9050919050565b7f494e434f52524543545f5155414e544954590000000000000000000000000000600082015250565b600061303d601283612707565b915061304882613007565b602082019050919050565b6000602082019050818103600083015261306c81613030565b9050919050565b600061307e826127b7565b9150613089836127b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130be576130bd612eb2565b5b828201905092915050565b7f53414c455f4d4158454400000000000000000000000000000000000000000000600082015250565b60006130ff600a83612707565b915061310a826130c9565b602082019050919050565b6000602082019050818103600083015261312e816130f2565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461316281612e15565b61316c8186613135565b945060018216600081146131875760018114613198576131cb565b60ff198316865281860193506131cb565b6131a185613140565b60005b838110156131c3578154818901526001820191506020810190506131a4565b838801955050505b50505092915050565b60006131df826126fc565b6131e98185613135565b93506131f9818560208601612718565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061323b600583613135565b915061324682613205565b600582019050919050565b600061325d8285613155565b915061326982846131d4565b91506132748261322e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132dc602683612707565b91506132e782613280565b604082019050919050565b6000602082019050818103600083015261330b816132cf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061333982613312565b613343818561331d565b9350613353818560208601612718565b61335c8161274b565b840191505092915050565b600060808201905061337c600083018761284c565b613389602083018661284c565b6133966040830185612919565b81810360608301526133a8818461332e565b905095945050505050565b6000815190506133c28161266d565b92915050565b6000602082840312156133de576133dd612637565b5b60006133ec848285016133b3565b91505092915050565b6000613400826127b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361343257613431612eb2565b5b600182019050919050565b6000613448826127b7565b9150613453836127b7565b92508282101561346657613465612eb2565b5b828203905092915050565b600061347c826127b7565b9150613487836127b7565b92508261349757613496612f3b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220589fa8cb1352fb29f1d0474afee0cccdbdf5ed89448c7b3845a5b28d3cbaf33a64736f6c634300080d003368747470733a2f2f77616774792e6d7970696e6174612e636c6f75642f697066732f516d6333413842625a785934456d46734157336e46386a6a4a4c565973326177786a38746b6874567570476b62722f
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106101c45760003560e01c8063715018a6116100f9578063b88d4fde11610097578063dc33e68111610071578063dc33e681146104de578063e8a3d4851461050e578063e985e9c51461052c578063f2fde38b1461055c576101c4565b8063b88d4fde14610476578063c87b56dd14610492578063cac92669146104c2576101c4565b806395d89b41116100d357806395d89b4114610404578063a0712d6814610422578063a0bcfc7f1461043e578063a22cb4651461045a576101c4565b8063715018a6146103be578063893da6c9146103c85780638da5cb5b146103e6576101c4565b80632a55205a1161016657806342842e0e1161014057806342842e0e146103265780634c261247146103425780636352211e1461035e57806370a082311461038e576101c4565b80632a55205a146102bb57806332cb6b0c146102ec578063375a069a1461030a576101c4565b8063095ea7b3116101a2578063095ea7b3146102475780630f2cdd6c1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612699565b610578565b6040516101f091906126e1565b60405180910390f35b61020161065a565b60405161020e9190612795565b60405180910390f35b610231600480360381019061022c91906127ed565b6106ec565b60405161023e919061285b565b60405180910390f35b610261600480360381019061025c91906128a2565b610768565b005b61026b610872565b60405161027891906128fe565b60405180910390f35b610289610877565b6040516102969190612928565b60405180910390f35b6102b960048036038101906102b49190612943565b61088e565b005b6102d560048036038101906102d09190612996565b61089e565b6040516102e39291906129d6565b60405180910390f35b6102f461093d565b6040516103019190612a1c565b60405180910390f35b610324600480360381019061031f91906127ed565b610943565b005b610340600480360381019061033b9190612943565b610a6a565b005b61035c60048036038101906103579190612a9c565b610a8a565b005b610378600480360381019061037391906127ed565b610b37565b604051610385919061285b565b60405180910390f35b6103a860048036038101906103a39190612ae9565b610b4d565b6040516103b59190612928565b60405180910390f35b6103c6610c1c565b005b6103d0610ca4565b6040516103dd91906126e1565b60405180910390f35b6103ee610cbb565b6040516103fb919061285b565b60405180910390f35b61040c610ce5565b6040516104199190612795565b60405180910390f35b61043c600480360381019061043791906127ed565b610d77565b005b61045860048036038101906104539190612a9c565b610e7c565b005b610474600480360381019061046f9190612b42565b610f0e565b005b610490600480360381019061048b9190612cb2565b611085565b005b6104ac60048036038101906104a791906127ed565b611101565b6040516104b99190612795565b60405180910390f35b6104dc60048036038101906104d79190612d79565b6111f6565b005b6104f860048036038101906104f39190612ae9565b6112a6565b6040516105059190612928565b60405180910390f35b6105166112b8565b6040516105239190612795565b60405180910390f35b61054660048036038101906105419190612da6565b6112f5565b60405161055391906126e1565b60405180910390f35b61057660048036038101906105719190612ae9565b611389565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061064357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610653575061065282611480565b5b9050919050565b60606002805461066990612e15565b80601f016020809104026020016040519081016040528092919081815260200182805461069590612e15565b80156106e25780601f106106b7576101008083540402835291602001916106e2565b820191906000526020600020905b8154815290600101906020018083116106c557829003601f168201915b5050505050905090565b60006106f7826114ea565b61072d576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061077382610b37565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036107da576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107f9611538565b73ffffffffffffffffffffffffffffffffffffffff161415801561082b575061082981610824611538565b6112f5565b155b15610862576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61086d838383611540565b505050565b600681565b60006108816115f2565b6001546000540303905090565b6108998383836115fb565b505050565b6000806108aa846114ea565b6108e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e090612e92565b60405180910390fd5b6108f1610cbb565b6103e8600a60009054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff16856109289190612ee1565b6109329190612f6a565b915091509250929050565b611a0a81565b61094b611538565b73ffffffffffffffffffffffffffffffffffffffff16610969610cbb565b73ffffffffffffffffffffffffffffffffffffffff16146109bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109b690612fe7565b60405180910390fd5b60008111610a02576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109f990613053565b60405180910390fd5b611a0a61ffff1681610a12610877565b610a1c9190613073565b1115610a5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a5490613115565b60405180910390fd5b610a673382611aaf565b50565b610a8583838360405180602001604052806000815250611085565b505050565b610a92611538565b73ffffffffffffffffffffffffffffffffffffffff16610ab0610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610b06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610afd90612fe7565b60405180910390fd5b6001600860146101000a81548160ff021916908315150217905550818160099190610b32929190612547565b505050565b6000610b4282611acd565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610bb4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610c24611538565b73ffffffffffffffffffffffffffffffffffffffff16610c42610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610c98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8f90612fe7565b60405180910390fd5b610ca26000611d5c565b565b6000611a0a61ffff16610cb5610877565b14905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610cf490612e15565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2090612e15565b8015610d6d5780601f10610d4257610100808354040283529160200191610d6d565b820191906000526020600020905b815481529060010190602001808311610d5057829003601f168201915b5050505050905090565b60008111610dba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db190613053565b60405180910390fd5b600660ff1681610dc933611e22565b610dd39190613073565b1115610e14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0b90613053565b60405180910390fd5b611a0a61ffff1681610e24610877565b610e2e9190613073565b1115610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613115565b60405180910390fd5b610e793382611aaf565b50565b610e84611538565b73ffffffffffffffffffffffffffffffffffffffff16610ea2610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614610ef8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eef90612fe7565b60405180910390fd5b818160099190610f09929190612547565b505050565b610f16611538565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610f7a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610f87611538565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611034611538565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161107991906126e1565b60405180910390a35050565b6110908484846115fb565b6110af8373ffffffffffffffffffffffffffffffffffffffff16611e8c565b80156110c457506110c284848484611eaf565b155b156110fb576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061110c826114ea565b611142576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600860149054906101000a900460ff16611193576040518060400160405280600681526020017f68696464656e000000000000000000000000000000000000000000000000000081525061119d565b61119c83611fff565b5b90506000600980546111ae90612e15565b9050036111ca57604051806020016040528060008152506111ee565b6009816040516020016111de929190613251565b6040516020818303038152906040525b915050919050565b6111fe611538565b73ffffffffffffffffffffffffffffffffffffffff1661121c610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161126990612fe7565b60405180910390fd5b80600a60006101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff16021790555050565b60006112b182611e22565b9050919050565b60606040518060400160405280601d81526020017f68747470733a2f2f6a736f6e6b65657065722e636f6d2f622f39594d4b000000815250905090565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611391611538565b73ffffffffffffffffffffffffffffffffffffffff166113af610cbb565b73ffffffffffffffffffffffffffffffffffffffff1614611405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113fc90612fe7565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611474576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146b906132f2565b60405180910390fd5b61147d81611d5c565b50565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000816114f56115f2565b11158015611504575060005482105b8015611531575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b600061160682611acd565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611671576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611692611538565b73ffffffffffffffffffffffffffffffffffffffff1614806116c157506116c0856116bb611538565b6112f5565b5b8061170657506116cf611538565b73ffffffffffffffffffffffffffffffffffffffff166116ee846106ec565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061173f576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036117a5576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6117b2858585600161215f565b6117be60008487611540565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603611a3d576000548214611a3c57878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611aa88585856001612165565b5050505050565b611ac982826040518060200160405280600081525061216b565b5050565b611ad56125cd565b600082905080611ae36115f2565b11158015611af2575060005481105b15611d25576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff16151515158152505090508060400151611d2357600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611c07578092505050611d57565b5b600115611d2257818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d1d578092505050611d57565b611c08565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611ed5611538565b8786866040518563ffffffff1660e01b8152600401611ef79493929190613367565b6020604051808303816000875af1925050508015611f3357506040513d601f19601f82011682018060405250810190611f3091906133c8565b60015b611fac573d8060008114611f63576040519150601f19603f3d011682016040523d82523d6000602084013e611f68565b606091505b506000815103611fa4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060008203612046576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061215a565b600082905060005b60008214612078578080612061906133f5565b915050600a826120719190612f6a565b915061204e565b60008167ffffffffffffffff81111561209457612093612b87565b5b6040519080825280601f01601f1916602001820160405280156120c65781602001600182028036833780820191505090505b5090505b60008514612153576001826120df919061343d565b9150600a856120ee9190613471565b60306120fa9190613073565b60f81b8183815181106121105761210f6134a2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561214c9190612f6a565b94506120ca565b8093505050505b919050565b50505050565b50505050565b612178838383600161217d565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036121e9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008403612223576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612230600086838761215f565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156123fa57506123f98773ffffffffffffffffffffffffffffffffffffffff16611e8c565b5b156124bf575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461246f6000888480600101955088611eaf565b6124a5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082036124005782600054146124ba57600080fd5b61252a565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082036124c0575b8160008190555050506125406000868387612165565b5050505050565b82805461255390612e15565b90600052602060002090601f01602090048101928261257557600085556125bc565b82601f1061258e57803560ff19168380011785556125bc565b828001600101855582156125bc579182015b828111156125bb5782358255916020019190600101906125a0565b5b5090506125c99190612610565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612629576000816000905550600101612611565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61267681612641565b811461268157600080fd5b50565b6000813590506126938161266d565b92915050565b6000602082840312156126af576126ae612637565b5b60006126bd84828501612684565b91505092915050565b60008115159050919050565b6126db816126c6565b82525050565b60006020820190506126f660008301846126d2565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561273657808201518184015260208101905061271b565b83811115612745576000848401525b50505050565b6000601f19601f8301169050919050565b6000612767826126fc565b6127718185612707565b9350612781818560208601612718565b61278a8161274b565b840191505092915050565b600060208201905081810360008301526127af818461275c565b905092915050565b6000819050919050565b6127ca816127b7565b81146127d557600080fd5b50565b6000813590506127e7816127c1565b92915050565b60006020828403121561280357612802612637565b5b6000612811848285016127d8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006128458261281a565b9050919050565b6128558161283a565b82525050565b6000602082019050612870600083018461284c565b92915050565b61287f8161283a565b811461288a57600080fd5b50565b60008135905061289c81612876565b92915050565b600080604083850312156128b9576128b8612637565b5b60006128c78582860161288d565b92505060206128d8858286016127d8565b9150509250929050565b600060ff82169050919050565b6128f8816128e2565b82525050565b600060208201905061291360008301846128ef565b92915050565b612922816127b7565b82525050565b600060208201905061293d6000830184612919565b92915050565b60008060006060848603121561295c5761295b612637565b5b600061296a8682870161288d565b935050602061297b8682870161288d565b925050604061298c868287016127d8565b9150509250925092565b600080604083850312156129ad576129ac612637565b5b60006129bb858286016127d8565b92505060206129cc858286016127d8565b9150509250929050565b60006040820190506129eb600083018561284c565b6129f86020830184612919565b9392505050565b600061ffff82169050919050565b612a16816129ff565b82525050565b6000602082019050612a316000830184612a0d565b92915050565b600080fd5b600080fd5b600080fd5b60008083601f840112612a5c57612a5b612a37565b5b8235905067ffffffffffffffff811115612a7957612a78612a3c565b5b602083019150836001820283011115612a9557612a94612a41565b5b9250929050565b60008060208385031215612ab357612ab2612637565b5b600083013567ffffffffffffffff811115612ad157612ad061263c565b5b612add85828601612a46565b92509250509250929050565b600060208284031215612aff57612afe612637565b5b6000612b0d8482850161288d565b91505092915050565b612b1f816126c6565b8114612b2a57600080fd5b50565b600081359050612b3c81612b16565b92915050565b60008060408385031215612b5957612b58612637565b5b6000612b678582860161288d565b9250506020612b7885828601612b2d565b9150509250929050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612bbf8261274b565b810181811067ffffffffffffffff82111715612bde57612bdd612b87565b5b80604052505050565b6000612bf161262d565b9050612bfd8282612bb6565b919050565b600067ffffffffffffffff821115612c1d57612c1c612b87565b5b612c268261274b565b9050602081019050919050565b82818337600083830152505050565b6000612c55612c5084612c02565b612be7565b905082815260208101848484011115612c7157612c70612b82565b5b612c7c848285612c33565b509392505050565b600082601f830112612c9957612c98612a37565b5b8135612ca9848260208601612c42565b91505092915050565b60008060008060808587031215612ccc57612ccb612637565b5b6000612cda8782880161288d565b9450506020612ceb8782880161288d565b9350506040612cfc878288016127d8565b925050606085013567ffffffffffffffff811115612d1d57612d1c61263c565b5b612d2987828801612c84565b91505092959194509250565b60006bffffffffffffffffffffffff82169050919050565b612d5681612d35565b8114612d6157600080fd5b50565b600081359050612d7381612d4d565b92915050565b600060208284031215612d8f57612d8e612637565b5b6000612d9d84828501612d64565b91505092915050565b60008060408385031215612dbd57612dbc612637565b5b6000612dcb8582860161288d565b9250506020612ddc8582860161288d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612e2d57607f821691505b602082108103612e4057612e3f612de6565b5b50919050565b7f43616e6e6f74207175657279206e6f6e2d6578697374656e7420746f6b656e00600082015250565b6000612e7c601f83612707565b9150612e8782612e46565b602082019050919050565b60006020820190508181036000830152612eab81612e6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612eec826127b7565b9150612ef7836127b7565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612f3057612f2f612eb2565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000612f75826127b7565b9150612f80836127b7565b925082612f9057612f8f612f3b565b5b828204905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612fd1602083612707565b9150612fdc82612f9b565b602082019050919050565b6000602082019050818103600083015261300081612fc4565b9050919050565b7f494e434f52524543545f5155414e544954590000000000000000000000000000600082015250565b600061303d601283612707565b915061304882613007565b602082019050919050565b6000602082019050818103600083015261306c81613030565b9050919050565b600061307e826127b7565b9150613089836127b7565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156130be576130bd612eb2565b5b828201905092915050565b7f53414c455f4d4158454400000000000000000000000000000000000000000000600082015250565b60006130ff600a83612707565b915061310a826130c9565b602082019050919050565b6000602082019050818103600083015261312e816130f2565b9050919050565b600081905092915050565b60008190508160005260206000209050919050565b6000815461316281612e15565b61316c8186613135565b945060018216600081146131875760018114613198576131cb565b60ff198316865281860193506131cb565b6131a185613140565b60005b838110156131c3578154818901526001820191506020810190506131a4565b838801955050505b50505092915050565b60006131df826126fc565b6131e98185613135565b93506131f9818560208601612718565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061323b600583613135565b915061324682613205565b600582019050919050565b600061325d8285613155565b915061326982846131d4565b91506132748261322e565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132dc602683612707565b91506132e782613280565b604082019050919050565b6000602082019050818103600083015261330b816132cf565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061333982613312565b613343818561331d565b9350613353818560208601612718565b61335c8161274b565b840191505092915050565b600060808201905061337c600083018761284c565b613389602083018661284c565b6133966040830185612919565b81810360608301526133a8818461332e565b905095945050505050565b6000815190506133c28161266d565b92915050565b6000602082840312156133de576133dd612637565b5b60006133ec848285016133b3565b91505092915050565b6000613400826127b7565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361343257613431612eb2565b5b600182019050919050565b6000613448826127b7565b9150613453836127b7565b92508282101561346657613465612eb2565b5b828203905092915050565b600061347c826127b7565b9150613487836127b7565b92508261349757613496612f3b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fdfea2646970667358221220589fa8cb1352fb29f1d0474afee0cccdbdf5ed89448c7b3845a5b28d3cbaf33a64736f6c634300080d0033
Deployed Bytecode Sourcemap
44751:2477:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26937:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30050:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31553:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31116:371;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44840:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26186:303;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32418:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46953:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;44793:40;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45853:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32659:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46324:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29858:125;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27306:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4653:103;;;:::i;:::-;;45282:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4002:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30219:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45520:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46214:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31829:287;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32915:369;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46456:355;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46819:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45395:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44889:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32187:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4911:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26937:305;27039:4;27091:25;27076:40;;;:11;:40;;;;:105;;;;27148:33;27133:48;;;:11;:48;;;;27076:105;:158;;;;27198:36;27222:11;27198:23;:36::i;:::-;27076:158;27056:178;;26937:305;;;:::o;30050:100::-;30104:13;30137:5;30130:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30050:100;:::o;31553:204::-;31621:7;31646:16;31654:7;31646;:16::i;:::-;31641:64;;31671:34;;;;;;;;;;;;;;31641:64;31725:15;:24;31741:7;31725:24;;;;;;;;;;;;;;;;;;;;;31718:31;;31553:204;;;:::o;31116:371::-;31189:13;31205:24;31221:7;31205:15;:24::i;:::-;31189:40;;31250:5;31244:11;;:2;:11;;;31240:48;;31264:24;;;;;;;;;;;;;;31240:48;31321:5;31305:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;31331:37;31348:5;31355:12;:10;:12::i;:::-;31331:16;:37::i;:::-;31330:38;31305:63;31301:138;;;31392:35;;;;;;;;;;;;;;31301:138;31451:28;31460:2;31464:7;31473:5;31451:8;:28::i;:::-;31178:309;31116:371;;:::o;44840:40::-;44879:1;44840:40;:::o;26186:303::-;26230:7;26455:15;:13;:15::i;:::-;26440:12;;26424:13;;:28;:46;26417:53;;26186:303;:::o;32418:170::-;32552:28;32562:4;32568:2;32572:7;32552:9;:28::i;:::-;32418:170;;;:::o;46953:272::-;47035:16;47053:21;47095:17;47103:8;47095:7;:17::i;:::-;47087:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;47167:7;:5;:7::i;:::-;47212:4;47190:18;;;;;;;;;;;47177:31;;:10;:31;;;;:::i;:::-;47176:40;;;;:::i;:::-;47159:58;;;;46953:272;;;;;:::o;44793:40::-;44829:4;44793:40;:::o;45853:244::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45939:1:::1;45927:9;:13;45919:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44829:4;45982:39;;45998:9;45982:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;45974:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46057:32;46067:10;46079:9;46057;:32::i;:::-;45853:244:::0;:::o;32659:185::-;32797:39;32814:4;32820:2;32824:7;32797:39;;;;;;;;;;;;:16;:39::i;:::-;32659:185;;;:::o;46324:124::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46407:4:::1;46396:8;;:15;;;;;;;;;;;;;;;;;;46432:8;;46422:7;:18;;;;;;;:::i;:::-;;46324:124:::0;;:::o;29858:125::-;29922:7;29949:21;29962:7;29949:12;:21::i;:::-;:26;;;29942:33;;29858:125;;;:::o;27306:206::-;27370:7;27411:1;27394:19;;:5;:19;;;27390:60;;27422:28;;;;;;;;;;;;;;27390:60;27476:12;:19;27489:5;27476:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;27468:36;;27461:43;;27306:206;;;:::o;4653:103::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4718:30:::1;4745:1;4718:18;:30::i;:::-;4653:103::o:0;45282:101::-;45324:4;44829;45348:27;;:13;:11;:13::i;:::-;:27;45341:34;;45282:101;:::o;4002:87::-;4048:7;4075:6;;;;;;;;;;;4068:13;;4002:87;:::o;30219:104::-;30275:13;30308:7;30301:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30219:104;:::o;45520:320::-;45593:1;45581:9;:13;45573:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;44879:1;45636:55;;45664:9;45636:25;45650:10;45636:13;:25::i;:::-;:37;;;;:::i;:::-;:55;;45628:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;44829:4;45733:39;;45749:9;45733:13;:11;:13::i;:::-;:25;;;;:::i;:::-;:39;;45725:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;45800:32;45810:10;45822:9;45800;:32::i;:::-;45520:320;:::o;46214:102::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46300:8:::1;;46290:7;:18;;;;;;;:::i;:::-;;46214:102:::0;;:::o;31829:287::-;31940:12;:10;:12::i;:::-;31928:24;;:8;:24;;;31924:54;;31961:17;;;;;;;;;;;;;;31924:54;32036:8;31991:18;:32;32010:12;:10;:12::i;:::-;31991:32;;;;;;;;;;;;;;;:42;32024:8;31991:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;32089:8;32060:48;;32075:12;:10;:12::i;:::-;32060:48;;;32099:8;32060:48;;;;;;:::i;:::-;;;;;;;;31829:287;;:::o;32915:369::-;33082:28;33092:4;33098:2;33102:7;33082:9;:28::i;:::-;33125:15;:2;:13;;;:15::i;:::-;:76;;;;;33145:56;33176:4;33182:2;33186:7;33195:5;33145:30;:56::i;:::-;33144:57;33125:76;33121:156;;;33225:40;;;;;;;;;;;;;;33121:156;32915:369;;;;:::o;46456:355::-;46529:13;46560:16;46568:7;46560;:16::i;:::-;46555:59;;46585:29;;;;;;;;;;;;;;46555:59;46627:22;46652:8;;;;;;;;;;;:47;;;;;;;;;;;;;;;;;;;;;;46663:25;46680:7;46663:16;:25::i;:::-;46652:47;46627:72;;46742:1;46723:7;46717:21;;;;;:::i;:::-;;;:26;:86;;;;;;;;;;;;;;;;;46770:7;46779:8;46753:44;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46717:86;46710:93;;;46456:355;;;:::o;46819:126::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46918:19:::1;46897:18;;:40;;;;;;;;;;;;;;;;;;46819:126:::0;:::o;45395:115::-;45455:7;45482:20;45496:5;45482:13;:20::i;:::-;45475:27;;45395:115;;;:::o;44889:116::-;44933:13;44959:38;;;;;;;;;;;;;;;;;;;44889:116;:::o;32187:164::-;32284:4;32308:18;:25;32327:5;32308:25;;;;;;;;;;;;;;;:35;32334:8;32308:35;;;;;;;;;;;;;;;;;;;;;;;;;32301:42;;32187:164;;;;:::o;4911:201::-;4233:12;:10;:12::i;:::-;4222:23;;:7;:5;:7::i;:::-;:23;;;4214:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;5020:1:::1;5000:22;;:8;:22;;::::0;4992:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;5076:28;5095:8;5076:18;:28::i;:::-;4911:201:::0;:::o;16786:157::-;16871:4;16910:25;16895:40;;;:11;:40;;;;16888:47;;16786:157;;;:::o;33539:187::-;33596:4;33639:7;33620:15;:13;:15::i;:::-;:26;;:53;;;;;33660:13;;33650:7;:23;33620:53;:98;;;;;33691:11;:20;33703:7;33691:20;;;;;;;;;;;:27;;;;;;;;;;;;33690:28;33620:98;33613:105;;33539:187;;;:::o;2726:98::-;2779:7;2806:10;2799:17;;2726:98;:::o;41709:196::-;41851:2;41824:15;:24;41840:7;41824:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41889:7;41885:2;41869:28;;41878:5;41869:28;;;;;;;;;;;;41709:196;;;:::o;46105:101::-;46170:7;46197:1;46190:8;;46105:101;:::o;36652:2130::-;36767:35;36805:21;36818:7;36805:12;:21::i;:::-;36767:59;;36865:4;36843:26;;:13;:18;;;:26;;;36839:67;;36878:28;;;;;;;;;;;;;;36839:67;36919:22;36961:4;36945:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;36982:36;36999:4;37005:12;:10;:12::i;:::-;36982:16;:36::i;:::-;36945:73;:126;;;;37059:12;:10;:12::i;:::-;37035:36;;:20;37047:7;37035:11;:20::i;:::-;:36;;;36945:126;36919:153;;37090:17;37085:66;;37116:35;;;;;;;;;;;;;;37085:66;37180:1;37166:16;;:2;:16;;;37162:52;;37191:23;;;;;;;;;;;;;;37162:52;37227:43;37249:4;37255:2;37259:7;37268:1;37227:21;:43::i;:::-;37335:35;37352:1;37356:7;37365:4;37335:8;:35::i;:::-;37696:1;37666:12;:18;37679:4;37666:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37740:1;37712:12;:16;37725:2;37712:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37758:31;37792:11;:20;37804:7;37792:20;;;;;;;;;;;37758:54;;37843:2;37827:8;:13;;;:18;;;;;;;;;;;;;;;;;;37893:15;37860:8;:23;;;:49;;;;;;;;;;;;;;;;;;38161:19;38193:1;38183:7;:11;38161:33;;38209:31;38243:11;:24;38255:11;38243:24;;;;;;;;;;;38209:58;;38311:1;38286:27;;:8;:13;;;;;;;;;;;;:27;;;38282:384;;38496:13;;38481:11;:28;38477:174;;38550:4;38534:8;:13;;;:20;;;;;;;;;;;;;;;;;;38603:13;:28;;;38577:8;:23;;;:54;;;;;;;;;;;;;;;;;;38477:174;38282:384;37641:1036;;;38713:7;38709:2;38694:27;;38703:4;38694:27;;;;;;;;;;;;38732:42;38753:4;38759:2;38763:7;38772:1;38732:20;:42::i;:::-;36756:2026;;36652:2130;;;:::o;33734:104::-;33803:27;33813:2;33817:8;33803:27;;;;;;;;;;;;:9;:27::i;:::-;33734:104;;:::o;28687:1109::-;28749:21;;:::i;:::-;28783:12;28798:7;28783:22;;28866:4;28847:15;:13;:15::i;:::-;:23;;:47;;;;;28881:13;;28874:4;:20;28847:47;28843:886;;;28915:31;28949:11;:17;28961:4;28949:17;;;;;;;;;;;28915:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28990:9;:16;;;28985:729;;29061:1;29035:28;;:9;:14;;;:28;;;29031:101;;29099:9;29092:16;;;;;;29031:101;29434:261;29441:4;29434:261;;;29474:6;;;;;;;;29519:11;:17;29531:4;29519:17;;;;;;;;;;;29507:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;29593:1;29567:28;;:9;:14;;;:28;;;29563:109;;29635:9;29628:16;;;;;;29563:109;29434:261;;;28985:729;28896:833;28843:886;29757:31;;;;;;;;;;;;;;28687:1109;;;;:::o;5272:191::-;5346:16;5365:6;;;;;;;;;;;5346:25;;5391:8;5382:6;;:17;;;;;;;;;;;;;;;;;;5446:8;5415:40;;5436:8;5415:40;;;;;;;;;;;;5335:128;5272:191;:::o;27594:137::-;27655:7;27690:12;:19;27703:5;27690:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;27682:41;;27675:48;;27594:137;;;:::o;6703:326::-;6763:4;7020:1;6998:7;:19;;;:23;6991:30;;6703:326;;;:::o;42397:667::-;42560:4;42597:2;42581:36;;;42618:12;:10;:12::i;:::-;42632:4;42638:7;42647:5;42581:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42577:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42832:1;42815:6;:13;:18;42811:235;;42861:40;;;;;;;;;;;;;;42811:235;43004:6;42998:13;42989:6;42985:2;42981:15;42974:38;42577:480;42710:45;;;42700:55;;;:6;:55;;;;42693:62;;;42397:667;;;;;;:::o;288:723::-;344:13;574:1;565:5;:10;561:53;;592:10;;;;;;;;;;;;;;;;;;;;;561:53;624:12;639:5;624:20;;655:14;680:78;695:1;687:4;:9;680:78;;713:8;;;;;:::i;:::-;;;;744:2;736:10;;;;;:::i;:::-;;;680:78;;;768:19;800:6;790:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;768:39;;818:154;834:1;825:5;:10;818:154;;862:1;852:11;;;;;:::i;:::-;;;929:2;921:5;:10;;;;:::i;:::-;908:2;:24;;;;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;958:2;949:11;;;;;:::i;:::-;;;818:154;;;996:6;982:21;;;;;288:723;;;;:::o;43712:159::-;;;;;:::o;44530:158::-;;;;;:::o;34201:163::-;34324:32;34330:2;34334:8;34344:5;34351:4;34324:5;:32::i;:::-;34201:163;;;:::o;34623:1775::-;34762:20;34785:13;;34762:36;;34827:1;34813:16;;:2;:16;;;34809:48;;34838:19;;;;;;;;;;;;;;34809:48;34884:1;34872:8;:13;34868:44;;34894:18;;;;;;;;;;;;;;34868:44;34925:61;34955:1;34959:2;34963:12;34977:8;34925:21;:61::i;:::-;35298:8;35263:12;:16;35276:2;35263:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35362:8;35322:12;:16;35335:2;35322:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35421:2;35388:11;:25;35400:12;35388:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;35488:15;35438:11;:25;35450:12;35438:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;35521:20;35544:12;35521:35;;35571:11;35600:8;35585:12;:23;35571:37;;35629:4;:23;;;;;35637:15;:2;:13;;;:15::i;:::-;35629:23;35625:641;;;35673:314;35729:12;35725:2;35704:38;;35721:1;35704:38;;;;;;;;;;;;35770:69;35809:1;35813:2;35817:14;;;;;;35833:5;35770:30;:69::i;:::-;35765:174;;35875:40;;;;;;;;;;;;;;35765:174;35982:3;35966:12;:19;35673:314;;36068:12;36051:13;;:29;36047:43;;36082:8;;;36047:43;35625:641;;;36131:120;36187:14;;;;;;36183:2;36162:40;;36179:1;36162:40;;;;;;;;;;;;36246:3;36230:12;:19;36131:120;;35625:641;36296:12;36280:13;:28;;;;35238:1082;;36330:60;36359:1;36363:2;36367:12;36381:8;36330:20;:60::i;:::-;34751:1647;34623:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:86::-;4973:7;5013:4;5006:5;5002:16;4991:27;;4938:86;;;:::o;5030:112::-;5113:22;5129:5;5113:22;:::i;:::-;5108:3;5101:35;5030:112;;:::o;5148:214::-;5237:4;5275:2;5264:9;5260:18;5252:26;;5288:67;5352:1;5341:9;5337:17;5328:6;5288:67;:::i;:::-;5148:214;;;;:::o;5368:118::-;5455:24;5473:5;5455:24;:::i;:::-;5450:3;5443:37;5368:118;;:::o;5492:222::-;5585:4;5623:2;5612:9;5608:18;5600:26;;5636:71;5704:1;5693:9;5689:17;5680:6;5636:71;:::i;:::-;5492:222;;;;:::o;5720:619::-;5797:6;5805;5813;5862:2;5850:9;5841:7;5837:23;5833:32;5830:119;;;5868:79;;:::i;:::-;5830:119;5988:1;6013:53;6058:7;6049:6;6038:9;6034:22;6013:53;:::i;:::-;6003:63;;5959:117;6115:2;6141:53;6186:7;6177:6;6166:9;6162:22;6141:53;:::i;:::-;6131:63;;6086:118;6243:2;6269:53;6314:7;6305:6;6294:9;6290:22;6269:53;:::i;:::-;6259:63;;6214:118;5720:619;;;;;:::o;6345:474::-;6413:6;6421;6470:2;6458:9;6449:7;6445:23;6441:32;6438:119;;;6476:79;;:::i;:::-;6438:119;6596:1;6621:53;6666:7;6657:6;6646:9;6642:22;6621:53;:::i;:::-;6611:63;;6567:117;6723:2;6749:53;6794:7;6785:6;6774:9;6770:22;6749:53;:::i;:::-;6739:63;;6694:118;6345:474;;;;;:::o;6825:332::-;6946:4;6984:2;6973:9;6969:18;6961:26;;6997:71;7065:1;7054:9;7050:17;7041:6;6997:71;:::i;:::-;7078:72;7146:2;7135:9;7131:18;7122:6;7078:72;:::i;:::-;6825:332;;;;;:::o;7163:89::-;7199:7;7239:6;7232:5;7228:18;7217:29;;7163:89;;;:::o;7258:115::-;7343:23;7360:5;7343:23;:::i;:::-;7338:3;7331:36;7258:115;;:::o;7379:218::-;7470:4;7508:2;7497:9;7493:18;7485:26;;7521:69;7587:1;7576:9;7572:17;7563:6;7521:69;:::i;:::-;7379:218;;;;:::o;7603:117::-;7712:1;7709;7702:12;7726:117;7835:1;7832;7825:12;7849:117;7958:1;7955;7948:12;7986:553;8044:8;8054:6;8104:3;8097:4;8089:6;8085:17;8081:27;8071:122;;8112:79;;:::i;:::-;8071:122;8225:6;8212:20;8202:30;;8255:18;8247:6;8244:30;8241:117;;;8277:79;;:::i;:::-;8241:117;8391:4;8383:6;8379:17;8367:29;;8445:3;8437:4;8429:6;8425:17;8415:8;8411:32;8408:41;8405:128;;;8452:79;;:::i;:::-;8405:128;7986:553;;;;;:::o;8545:529::-;8616:6;8624;8673:2;8661:9;8652:7;8648:23;8644:32;8641:119;;;8679:79;;:::i;:::-;8641:119;8827:1;8816:9;8812:17;8799:31;8857:18;8849:6;8846:30;8843:117;;;8879:79;;:::i;:::-;8843:117;8992:65;9049:7;9040:6;9029:9;9025:22;8992:65;:::i;:::-;8974:83;;;;8770:297;8545:529;;;;;:::o;9080:329::-;9139:6;9188:2;9176:9;9167:7;9163:23;9159:32;9156:119;;;9194:79;;:::i;:::-;9156:119;9314:1;9339:53;9384:7;9375:6;9364:9;9360:22;9339:53;:::i;:::-;9329:63;;9285:117;9080:329;;;;:::o;9415:116::-;9485:21;9500:5;9485:21;:::i;:::-;9478:5;9475:32;9465:60;;9521:1;9518;9511:12;9465:60;9415:116;:::o;9537:133::-;9580:5;9618:6;9605:20;9596:29;;9634:30;9658:5;9634:30;:::i;:::-;9537:133;;;;:::o;9676:468::-;9741:6;9749;9798:2;9786:9;9777:7;9773:23;9769:32;9766:119;;;9804:79;;:::i;:::-;9766:119;9924:1;9949:53;9994:7;9985:6;9974:9;9970:22;9949:53;:::i;:::-;9939:63;;9895:117;10051:2;10077:50;10119:7;10110:6;10099:9;10095:22;10077:50;:::i;:::-;10067:60;;10022:115;9676:468;;;;;:::o;10150:117::-;10259:1;10256;10249:12;10273:180;10321:77;10318:1;10311:88;10418:4;10415:1;10408:15;10442:4;10439:1;10432:15;10459:281;10542:27;10564:4;10542:27;:::i;:::-;10534:6;10530:40;10672:6;10660:10;10657:22;10636:18;10624:10;10621:34;10618:62;10615:88;;;10683:18;;:::i;:::-;10615:88;10723:10;10719:2;10712:22;10502:238;10459:281;;:::o;10746:129::-;10780:6;10807:20;;:::i;:::-;10797:30;;10836:33;10864:4;10856:6;10836:33;:::i;:::-;10746:129;;;:::o;10881:307::-;10942:4;11032:18;11024:6;11021:30;11018:56;;;11054:18;;:::i;:::-;11018:56;11092:29;11114:6;11092:29;:::i;:::-;11084:37;;11176:4;11170;11166:15;11158:23;;10881:307;;;:::o;11194:154::-;11278:6;11273:3;11268;11255:30;11340:1;11331:6;11326:3;11322:16;11315:27;11194:154;;;:::o;11354:410::-;11431:5;11456:65;11472:48;11513:6;11472:48;:::i;:::-;11456:65;:::i;:::-;11447:74;;11544:6;11537:5;11530:21;11582:4;11575:5;11571:16;11620:3;11611:6;11606:3;11602:16;11599:25;11596:112;;;11627:79;;:::i;:::-;11596:112;11717:41;11751:6;11746:3;11741;11717:41;:::i;:::-;11437:327;11354:410;;;;;:::o;11783:338::-;11838:5;11887:3;11880:4;11872:6;11868:17;11864:27;11854:122;;11895:79;;:::i;:::-;11854:122;12012:6;11999:20;12037:78;12111:3;12103:6;12096:4;12088:6;12084:17;12037:78;:::i;:::-;12028:87;;11844:277;11783:338;;;;:::o;12127:943::-;12222:6;12230;12238;12246;12295:3;12283:9;12274:7;12270:23;12266:33;12263:120;;;12302:79;;:::i;:::-;12263:120;12422:1;12447:53;12492:7;12483:6;12472:9;12468:22;12447:53;:::i;:::-;12437:63;;12393:117;12549:2;12575:53;12620:7;12611:6;12600:9;12596:22;12575:53;:::i;:::-;12565:63;;12520:118;12677:2;12703:53;12748:7;12739:6;12728:9;12724:22;12703:53;:::i;:::-;12693:63;;12648:118;12833:2;12822:9;12818:18;12805:32;12864:18;12856:6;12853:30;12850:117;;;12886:79;;:::i;:::-;12850:117;12991:62;13045:7;13036:6;13025:9;13021:22;12991:62;:::i;:::-;12981:72;;12776:287;12127:943;;;;;;;:::o;13076:109::-;13112:7;13152:26;13145:5;13141:38;13130:49;;13076:109;;;:::o;13191:120::-;13263:23;13280:5;13263:23;:::i;:::-;13256:5;13253:34;13243:62;;13301:1;13298;13291:12;13243:62;13191:120;:::o;13317:137::-;13362:5;13400:6;13387:20;13378:29;;13416:32;13442:5;13416:32;:::i;:::-;13317:137;;;;:::o;13460:327::-;13518:6;13567:2;13555:9;13546:7;13542:23;13538:32;13535:119;;;13573:79;;:::i;:::-;13535:119;13693:1;13718:52;13762:7;13753:6;13742:9;13738:22;13718:52;:::i;:::-;13708:62;;13664:116;13460:327;;;;:::o;13793:474::-;13861:6;13869;13918:2;13906:9;13897:7;13893:23;13889:32;13886:119;;;13924:79;;:::i;:::-;13886:119;14044:1;14069:53;14114:7;14105:6;14094:9;14090:22;14069:53;:::i;:::-;14059:63;;14015:117;14171:2;14197:53;14242:7;14233:6;14222:9;14218:22;14197:53;:::i;:::-;14187:63;;14142:118;13793:474;;;;;:::o;14273:180::-;14321:77;14318:1;14311:88;14418:4;14415:1;14408:15;14442:4;14439:1;14432:15;14459:320;14503:6;14540:1;14534:4;14530:12;14520:22;;14587:1;14581:4;14577:12;14608:18;14598:81;;14664:4;14656:6;14652:17;14642:27;;14598:81;14726:2;14718:6;14715:14;14695:18;14692:38;14689:84;;14745:18;;:::i;:::-;14689:84;14510:269;14459:320;;;:::o;14785:181::-;14925:33;14921:1;14913:6;14909:14;14902:57;14785:181;:::o;14972:366::-;15114:3;15135:67;15199:2;15194:3;15135:67;:::i;:::-;15128:74;;15211:93;15300:3;15211:93;:::i;:::-;15329:2;15324:3;15320:12;15313:19;;14972:366;;;:::o;15344:419::-;15510:4;15548:2;15537:9;15533:18;15525:26;;15597:9;15591:4;15587:20;15583:1;15572:9;15568:17;15561:47;15625:131;15751:4;15625:131;:::i;:::-;15617:139;;15344:419;;;:::o;15769:180::-;15817:77;15814:1;15807:88;15914:4;15911:1;15904:15;15938:4;15935:1;15928:15;15955:348;15995:7;16018:20;16036:1;16018:20;:::i;:::-;16013:25;;16052:20;16070:1;16052:20;:::i;:::-;16047:25;;16240:1;16172:66;16168:74;16165:1;16162:81;16157:1;16150:9;16143:17;16139:105;16136:131;;;16247:18;;:::i;:::-;16136:131;16295:1;16292;16288:9;16277:20;;15955:348;;;;:::o;16309:180::-;16357:77;16354:1;16347:88;16454:4;16451:1;16444:15;16478:4;16475:1;16468:15;16495:185;16535:1;16552:20;16570:1;16552:20;:::i;:::-;16547:25;;16586:20;16604:1;16586:20;:::i;:::-;16581:25;;16625:1;16615:35;;16630:18;;:::i;:::-;16615:35;16672:1;16669;16665:9;16660:14;;16495:185;;;;:::o;16686:182::-;16826:34;16822:1;16814:6;16810:14;16803:58;16686:182;:::o;16874:366::-;17016:3;17037:67;17101:2;17096:3;17037:67;:::i;:::-;17030:74;;17113:93;17202:3;17113:93;:::i;:::-;17231:2;17226:3;17222:12;17215:19;;16874:366;;;:::o;17246:419::-;17412:4;17450:2;17439:9;17435:18;17427:26;;17499:9;17493:4;17489:20;17485:1;17474:9;17470:17;17463:47;17527:131;17653:4;17527:131;:::i;:::-;17519:139;;17246:419;;;:::o;17671:168::-;17811:20;17807:1;17799:6;17795:14;17788:44;17671:168;:::o;17845:366::-;17987:3;18008:67;18072:2;18067:3;18008:67;:::i;:::-;18001:74;;18084:93;18173:3;18084:93;:::i;:::-;18202:2;18197:3;18193:12;18186:19;;17845:366;;;:::o;18217:419::-;18383:4;18421:2;18410:9;18406:18;18398:26;;18470:9;18464:4;18460:20;18456:1;18445:9;18441:17;18434:47;18498:131;18624:4;18498:131;:::i;:::-;18490:139;;18217:419;;;:::o;18642:305::-;18682:3;18701:20;18719:1;18701:20;:::i;:::-;18696:25;;18735:20;18753:1;18735:20;:::i;:::-;18730:25;;18889:1;18821:66;18817:74;18814:1;18811:81;18808:107;;;18895:18;;:::i;:::-;18808:107;18939:1;18936;18932:9;18925:16;;18642:305;;;;:::o;18953:160::-;19093:12;19089:1;19081:6;19077:14;19070:36;18953:160;:::o;19119:366::-;19261:3;19282:67;19346:2;19341:3;19282:67;:::i;:::-;19275:74;;19358:93;19447:3;19358:93;:::i;:::-;19476:2;19471:3;19467:12;19460:19;;19119:366;;;:::o;19491:419::-;19657:4;19695:2;19684:9;19680:18;19672:26;;19744:9;19738:4;19734:20;19730:1;19719:9;19715:17;19708:47;19772:131;19898:4;19772:131;:::i;:::-;19764:139;;19491:419;;;:::o;19916:148::-;20018:11;20055:3;20040:18;;19916:148;;;;:::o;20070:141::-;20119:4;20142:3;20134:11;;20165:3;20162:1;20155:14;20199:4;20196:1;20186:18;20178:26;;20070:141;;;:::o;20241:845::-;20344:3;20381:5;20375:12;20410:36;20436:9;20410:36;:::i;:::-;20462:89;20544:6;20539:3;20462:89;:::i;:::-;20455:96;;20582:1;20571:9;20567:17;20598:1;20593:137;;;;20744:1;20739:341;;;;20560:520;;20593:137;20677:4;20673:9;20662;20658:25;20653:3;20646:38;20713:6;20708:3;20704:16;20697:23;;20593:137;;20739:341;20806:38;20838:5;20806:38;:::i;:::-;20866:1;20880:154;20894:6;20891:1;20888:13;20880:154;;;20968:7;20962:14;20958:1;20953:3;20949:11;20942:35;21018:1;21009:7;21005:15;20994:26;;20916:4;20913:1;20909:12;20904:17;;20880:154;;;21063:6;21058:3;21054:16;21047:23;;20746:334;;20560:520;;20348:738;;20241:845;;;;:::o;21092:377::-;21198:3;21226:39;21259:5;21226:39;:::i;:::-;21281:89;21363:6;21358:3;21281:89;:::i;:::-;21274:96;;21379:52;21424:6;21419:3;21412:4;21405:5;21401:16;21379:52;:::i;:::-;21456:6;21451:3;21447:16;21440:23;;21202:267;21092:377;;;;:::o;21475:155::-;21615:7;21611:1;21603:6;21599:14;21592:31;21475:155;:::o;21636:400::-;21796:3;21817:84;21899:1;21894:3;21817:84;:::i;:::-;21810:91;;21910:93;21999:3;21910:93;:::i;:::-;22028:1;22023:3;22019:11;22012:18;;21636:400;;;:::o;22042:695::-;22320:3;22342:92;22430:3;22421:6;22342:92;:::i;:::-;22335:99;;22451:95;22542:3;22533:6;22451:95;:::i;:::-;22444:102;;22563:148;22707:3;22563:148;:::i;:::-;22556:155;;22728:3;22721:10;;22042:695;;;;;:::o;22743:225::-;22883:34;22879:1;22871:6;22867:14;22860:58;22952:8;22947:2;22939:6;22935:15;22928:33;22743:225;:::o;22974:366::-;23116:3;23137:67;23201:2;23196:3;23137:67;:::i;:::-;23130:74;;23213:93;23302:3;23213:93;:::i;:::-;23331:2;23326:3;23322:12;23315:19;;22974:366;;;:::o;23346:419::-;23512:4;23550:2;23539:9;23535:18;23527:26;;23599:9;23593:4;23589:20;23585:1;23574:9;23570:17;23563:47;23627:131;23753:4;23627:131;:::i;:::-;23619:139;;23346:419;;;:::o;23771:98::-;23822:6;23856:5;23850:12;23840:22;;23771:98;;;:::o;23875:168::-;23958:11;23992:6;23987:3;23980:19;24032:4;24027:3;24023:14;24008:29;;23875:168;;;;:::o;24049:360::-;24135:3;24163:38;24195:5;24163:38;:::i;:::-;24217:70;24280:6;24275:3;24217:70;:::i;:::-;24210:77;;24296:52;24341:6;24336:3;24329:4;24322:5;24318:16;24296:52;:::i;:::-;24373:29;24395:6;24373:29;:::i;:::-;24368:3;24364:39;24357:46;;24139:270;24049:360;;;;:::o;24415:640::-;24610:4;24648:3;24637:9;24633:19;24625:27;;24662:71;24730:1;24719:9;24715:17;24706:6;24662:71;:::i;:::-;24743:72;24811:2;24800:9;24796:18;24787:6;24743:72;:::i;:::-;24825;24893:2;24882:9;24878:18;24869:6;24825:72;:::i;:::-;24944:9;24938:4;24934:20;24929:2;24918:9;24914:18;24907:48;24972:76;25043:4;25034:6;24972:76;:::i;:::-;24964:84;;24415:640;;;;;;;:::o;25061:141::-;25117:5;25148:6;25142:13;25133:22;;25164:32;25190:5;25164:32;:::i;:::-;25061:141;;;;:::o;25208:349::-;25277:6;25326:2;25314:9;25305:7;25301:23;25297:32;25294:119;;;25332:79;;:::i;:::-;25294:119;25452:1;25477:63;25532:7;25523:6;25512:9;25508:22;25477:63;:::i;:::-;25467:73;;25423:127;25208:349;;;;:::o;25563:233::-;25602:3;25625:24;25643:5;25625:24;:::i;:::-;25616:33;;25671:66;25664:5;25661:77;25658:103;;25741:18;;:::i;:::-;25658:103;25788:1;25781:5;25777:13;25770:20;;25563:233;;;:::o;25802:191::-;25842:4;25862:20;25880:1;25862:20;:::i;:::-;25857:25;;25896:20;25914:1;25896:20;:::i;:::-;25891:25;;25935:1;25932;25929:8;25926:34;;;25940:18;;:::i;:::-;25926:34;25985:1;25982;25978:9;25970:17;;25802:191;;;;:::o;25999:176::-;26031:1;26048:20;26066:1;26048:20;:::i;:::-;26043:25;;26082:20;26100:1;26082:20;:::i;:::-;26077:25;;26121:1;26111:35;;26126:18;;:::i;:::-;26111:35;26167:1;26164;26160:9;26155:14;;25999:176;;;;:::o;26181:180::-;26229:77;26226:1;26219:88;26326:4;26323:1;26316:15;26350:4;26347:1;26340:15
Swarm Source
ipfs://589fa8cb1352fb29f1d0474afee0cccdbdf5ed89448c7b3845a5b28d3cbaf33a
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.