Overview
TokenID
883
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Source Code Verified (Exact Match)
Contract Name:
Stormwarfare_NFT
Compiler Version
v0.8.23+commit.f704f362
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2024-01-27 */ // SPDX-License-Identifier: MIT pragma solidity 0.8.23; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } } /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } interface IERC721Mintable is IERC721 { /** * @dev Creates a new token for the given `owner`. * * Requirements: * * - `owner` cannot be the zero address. * */ function mint(address _to) external; } /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain `call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return verifyCallResult(success, returndata, errorMessage); } /** * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the * revert reason using the provided one. * * _Available since v4.3._ */ function verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) internal pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } /** * @dev 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); } } /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { _setApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Approve `operator` to operate on all of `owner` tokens * * Emits a {ApprovalForAll} event. */ function _setApprovalForAll( address owner, address operator, bool approved ) internal virtual { require(owner != operator, "ERC721: approve to caller"); _operatorApprovals[owner][operator] = approved; emit ApprovalForAll(owner, operator, approved); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver.onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { require(!paused(), "Pausable: paused"); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { require(paused(), "Pausable: not paused"); _; } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } /** * @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); } } /** * @title ERC721 Burnable Token * @dev ERC721 Token that can be irreversibly burned (destroyed). */ abstract contract ERC721Burnable is Context, ERC721 { /** * @dev Burns `tokenId`. See {ERC721-_burn}. * * Requirements: * * - The caller must own `tokenId` or be an approved operator. */ function burn(uint256 tokenId) public virtual { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721Burnable: caller is not owner nor approved"); _burn(tokenId); } } /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } /** * @dev Contract module that helps prevent reentrant calls to a function. * * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier * available, which can be applied to functions to make sure there are no nested * (reentrant) calls to them. * * Note that because there is a single `nonReentrant` guard, functions marked as * `nonReentrant` may not call one another. This can be worked around by making * those functions `private`, and then adding `external` `nonReentrant` entry * points to them. * * TIP: If you would like to learn more about reentrancy and alternative ways * to protect against it, check out our blog post * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul]. */ abstract contract ReentrancyGuard { // Booleans are more expensive than uint256 or any type that takes up a full // word because each write operation emits an extra SLOAD to first read the // slot's contents, replace the bits taken up by the boolean, and then write // back. This is the compiler's defense against contract upgrades and // pointer aliasing, and it cannot be disabled. // The values being non-zero value makes deployment a bit more expensive, // but in exchange the refund on every call to nonReentrant will be lower in // amount. Since refunds are capped to a percentage of the total // transaction's gas, it is best to keep them low in cases like this one, to // increase the likelihood of the full refund coming into effect. uint256 private constant _NOT_ENTERED = 1; uint256 private constant _ENTERED = 2; uint256 private _status; constructor() { _status = _NOT_ENTERED; } /** * @dev Prevents a contract from calling itself, directly or indirectly. * Calling a `nonReentrant` function from another `nonReentrant` * function is not supported. It is possible to prevent this from happening * by making the `nonReentrant` function external, and making it call a * `private` function that does the actual work. */ modifier nonReentrant() { // On the first call to nonReentrant, _notEntered will be true require(_status != _ENTERED, "ReentrancyGuard: reentrant call"); // Any calls to nonReentrant after this point will fail _status = _ENTERED; _; // By storing the original value once again, a refund is triggered (see // https://eips.ethereum.org/EIPS/eip-2200) _status = _NOT_ENTERED; } } /** * @dev Wrappers over Solidity's arithmetic operations with added overflow * checks. * * Arithmetic operations in Solidity wrap on overflow. This can easily result * in bugs, because programmers usually assume that an overflow raises an * error, which is the standard behavior in high level programming languages. * `SafeMath` restores this intuition by reverting the transaction when an * operation overflows. * * Using this library instead of the unchecked operations eliminates an entire * class of bugs, so it's recommended to use it always. */ library SafeMath { /** * @dev Returns the addition of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, "SafeMath: addition overflow"); return c; } /** * @dev Returns the addition of two unsigned integers, reverting with custom message on overflow. * * Counterpart to Solidity's `+` operator. * * Requirements: * - Addition cannot overflow. */ function add(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { uint256 c = a + b; require(c >= a, errorMessage); return c; } /** * @dev Returns the subtraction of two unsigned integers, reverting on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b) internal pure returns (uint256) { return sub(a, b, "SafeMath: subtraction underflow"); } /** * @dev Returns the subtraction of two unsigned integers, reverting with custom message on underflow (when the result is negative). * * Counterpart to Solidity's `-` operator. * * Requirements: * - Subtraction cannot underflow. */ function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b <= a, errorMessage); uint256 c = a - b; return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, "SafeMath: multiplication overflow"); return c; } /** * @dev Returns the multiplication of two unsigned integers, reverting on overflow. * * Counterpart to Solidity's `*` operator. * * Requirements: * - Multiplication cannot overflow. */ function mul(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Gas optimization: this is cheaper than requiring 'a' not being zero, but the // benefit is lost if 'b' is also tested. // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 if (a == 0) { return 0; } uint256 c = a * b; require(c / a == b, errorMessage); return c; } /** * @dev Returns the integer division of two unsigned integers. * Reverts on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b) internal pure returns (uint256) { return div(a, b, "SafeMath: division by zero"); } /** * @dev Returns the integer division of two unsigned integers. * Reverts with custom message on division by zero. The result is rounded towards zero. * * Counterpart to Solidity's `/` operator. Note: this function uses a * `revert` opcode (which leaves remaining gas untouched) while Solidity * uses an invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { // Solidity only automatically asserts when dividing by 0 require(b > 0, errorMessage); uint256 c = a / b; // assert(a == b * c + a % b); // There is no case in which this doesn't hold return c; } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b) internal pure returns (uint256) { return mod(a, b, "SafeMath: modulo by zero"); } /** * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), * Reverts with custom message when dividing by zero. * * Counterpart to Solidity's `%` operator. This function uses a `revert` * opcode (which leaves remaining gas untouched) while Solidity uses an * invalid opcode to revert (consuming all remaining gas). * * Requirements: * - The divisor cannot be zero. */ function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { require(b != 0, errorMessage); return a % b; } } /** * @dev Interface of the ERC20 standard as defined in the EIP. */ interface IERC20 { /** * @dev Returns the amount of tokens in existence. */ function totalSupply() external view returns (uint256); /** * @dev Returns the amount of tokens owned by `account`. */ function balanceOf(address account) external view returns (uint256); /** * @dev Moves `amount` tokens from the caller's account to `recipient`. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transfer(address recipient, uint256 amount) external returns (bool); /** * @dev Returns the remaining number of tokens that `spender` will be * allowed to spend on behalf of `owner` through {transferFrom}. This is * zero by default. * * This value changes when {approve} or {transferFrom} are called. */ function allowance(address owner, address spender) external view returns (uint256); /** * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. * * Returns a boolean value indicating whether the operation succeeded. * * IMPORTANT: Beware that changing an allowance with this method brings the risk * that someone may use both the old and the new allowance by unfortunate * transaction ordering. One possible solution to mitigate this race * condition is to first reduce the spender's allowance to 0 and set the * desired value afterwards: * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 * * Emits an {Approval} event. */ function approve(address spender, uint256 amount) external returns (bool); /** * @dev Moves `amount` tokens from `sender` to `recipient` using the * allowance mechanism. `amount` is then deducted from the caller's * allowance. * * Returns a boolean value indicating whether the operation succeeded. * * Emits a {Transfer} event. */ function transferFrom( address sender, address recipient, uint256 amount ) external returns (bool); /** * @dev Emitted when `value` tokens are moved from one account (`from`) to * another (`to`). * * Note that `value` may be zero. */ event Transfer(address indexed from, address indexed to, uint256 value); /** * @dev Emitted when the allowance of a `spender` for an `owner` is set by * a call to {approve}. `value` is the new allowance. */ event Approval(address indexed owner, address indexed spender, uint256 value); } /** * @title SafeERC20 * @dev Wrappers around ERC20 operations that throw on failure (when the token * contract returns false). Tokens that return no value (and instead revert or * throw on failure) are also supported, non-reverting calls are assumed to be * successful. * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. */ library SafeERC20 { using Address for address; function safeTransfer( IERC20 token, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); } function safeTransferFrom( IERC20 token, address from, address to, uint256 value ) internal { _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); } /** * @dev Deprecated. This function has issues similar to the ones found in * {IERC20-approve}, and its usage is discouraged. * * Whenever possible, use {safeIncreaseAllowance} and * {safeDecreaseAllowance} instead. */ function safeApprove( IERC20 token, address spender, uint256 value ) internal { // safeApprove should only be called when setting an initial allowance, // or when resetting it to zero. To increase and decrease it, use // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' require( (value == 0) || (token.allowance(address(this), spender) == 0), "SafeERC20: approve from non-zero to non-zero allowance" ); _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); } function safeIncreaseAllowance( IERC20 token, address spender, uint256 value ) internal { uint256 newAllowance = token.allowance(address(this), spender) + value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } function safeDecreaseAllowance( IERC20 token, address spender, uint256 value ) internal { unchecked { uint256 oldAllowance = token.allowance(address(this), spender); require(oldAllowance >= value, "SafeERC20: decreased allowance below zero"); uint256 newAllowance = oldAllowance - value; _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); } } /** * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement * on the return value: the return value is optional (but if data is returned, it must not be false). * @param token The token targeted by the call. * @param data The call data (encoded using abi.encode or one of its variants). */ function _callOptionalReturn(IERC20 token, bytes memory data) private { // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that // the target address contains contract code and also asserts for success in the low-level call. bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); if (returndata.length > 0) { // Return data is optional require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); } } } /** * @dev StormWarfare Project base NFT class. */ contract Stormwarfare_NFT_Base is Ownable { uint public constant MAX_SUPPLY = 1000; uint private totalAllowedNFTCount; mapping(address => uint) private addressIndices; Info[] private allowedAddresses; struct Info { address allowedAddress; uint initialBalance; uint remainingBalance; } modifier onlyAllowedAddresses() { require(allowedAddresses.length > 0, "Address is not allowed to mint NFTs."); uint256 _index = addressIndices[ msg.sender ]; require( msg.sender == allowedAddresses[ _index ].allowedAddress, "Address is not allowed to mint NFTs." ); _; } function addAllowedAddresses(address[] memory _addresses, uint[] memory _allowedNFTCounts) external onlyOwner { require(_addresses.length == _allowedNFTCounts.length, "Arrays length mismatch."); for (uint i = 0; i < _addresses.length; i++) { address _address = _addresses[i]; uint _allowedNFTCount = _allowedNFTCounts[i]; require(_address != address(0), "Address cannot be empty."); require(_allowedNFTCount > 0, "NFT count must be greater than 0."); uint256 index = addressIndices[_address]; if (allowedAddresses.length > 0) { if (index > 0) { require(false, "Address already exists."); //Force throw exception } else { require(_address != allowedAddresses[0].allowedAddress, "Address already exists."); } } allowedAddresses.push(Info({ allowedAddress: _address, initialBalance: _allowedNFTCount, remainingBalance: _allowedNFTCount })); addressIndices[_address] = allowedAddresses.length - 1; totalAllowedNFTCount = totalAllowedNFTCount + _allowedNFTCount; } } function removeAllowedAddress(address _address) external onlyOwner { require(_address != address(0), "Address cannot be empty." ); require(allowedAddresses.length > 0, "Address not found."); uint256 _index = addressIndices[ _address ]; require( _address == allowedAddresses[ _index ].allowedAddress, "Address to be removed not found in list." ); totalAllowedNFTCount = totalAllowedNFTCount - (allowedAddresses[ _index ].remainingBalance); allowedAddresses[ _index ].allowedAddress = address(0); allowedAddresses[ _index ].initialBalance = 0; allowedAddresses[ _index ].remainingBalance = 0; delete addressIndices[_address]; } function getMintableNFTBalance(address _address) public view returns (uint) { require(_address != address(0), "Address cannot be empty." ); require(allowedAddresses.length > 0, "Address not found."); uint256 _index = addressIndices[ _address ]; require( _address == allowedAddresses[ _index ].allowedAddress, "Address is not allowed to mint NFTs." ); return (allowedAddresses[ _index ].remainingBalance); } function decreaseNFTAllowance() internal { uint256 _index = addressIndices[ msg.sender ]; allowedAddresses[ _index ].remainingBalance = (allowedAddresses[ _index ].remainingBalance) - 1; } function getAllowedAddress(uint256 _index) view external onlyOwner returns(Info memory) { return allowedAddresses[_index]; } function checkAllowedAddress(address _address) public view returns (bool) { uint256 index = addressIndices[_address]; return (index >= 0 && _address == allowedAddresses[index].allowedAddress); } } /** * @dev StormWarfare Project ERC721 token for special Game NFTs. */ contract Stormwarfare_NFT is IERC721Mintable, ERC721, Pausable, Ownable, Stormwarfare_NFT_Base, ReentrancyGuard { using Counters for Counters.Counter; Counters.Counter private _tokenIdCounter; string private _baseTokenURI; constructor( string memory name, string memory symbol, string memory baseTokenURI ) ERC721(name, symbol) { _baseTokenURI = baseTokenURI; } function _baseURI() internal view virtual override returns (string memory) { return _baseTokenURI; } function setBaseURI(string memory baseTokenURI) external onlyOwner { _baseTokenURI = baseTokenURI; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { return string( abi.encodePacked(super.tokenURI(tokenId),".json") ); } function pause() public onlyOwner { _pause(); } function unpause() public onlyOwner { _unpause(); } function renounceOwnership() public view override onlyOwner { revert ("Renouncing ownership is prevented."); } function mint(address to) public override nonReentrant whenNotPaused onlyAllowedAddresses { require (getMintableNFTBalance(msg.sender) > 0, "No more NFT allowance for minting."); require (_tokenIdCounter.current() < MAX_SUPPLY, "MAX_SUPPLY reached. Cannot mint new NFT."); uint256 tokenId = _tokenIdCounter.current(); _tokenIdCounter.increment(); decreaseNFTAllowance(); _safeMint(to, tokenId); } function totalSupply() public view returns (uint256) { return _tokenIdCounter.current(); } function totalRemainingSupply() public view returns (uint256) { return MAX_SUPPLY - totalSupply(); } function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal whenNotPaused override { super._beforeTokenTransfer(from, to, tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"_allowedNFTCounts","type":"uint256[]"}],"name":"addAllowedAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"checkAllowedAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_index","type":"uint256"}],"name":"getAllowedAddress","outputs":[{"components":[{"internalType":"address","name":"allowedAddress","type":"address"},{"internalType":"uint256","name":"initialBalance","type":"uint256"},{"internalType":"uint256","name":"remainingBalance","type":"uint256"}],"internalType":"struct Stormwarfare_NFT_Base.Info","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"getMintableNFTBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_address","type":"address"}],"name":"removeAllowedAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"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":"baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalRemainingSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
608060405234801562000010575f80fd5b506040516200524f3803806200524f83398181016040528101906200003691906200030a565b8282815f9081620000489190620005f7565b5080600190816200005a9190620005f7565b5050505f60065f6101000a81548160ff021916908315150217905550620000966200008a620000b960201b60201c565b620000c060201b60201c565b6001600a8190555080600c9081620000af9190620005f7565b50505050620006db565b5f33905090565b5f600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b620001e6826200019e565b810181811067ffffffffffffffff82111715620002085762000207620001ae565b5b80604052505050565b5f6200021c62000185565b90506200022a8282620001db565b919050565b5f67ffffffffffffffff8211156200024c576200024b620001ae565b5b62000257826200019e565b9050602081019050919050565b5f5b838110156200028357808201518184015260208101905062000266565b5f8484015250505050565b5f620002a46200029e846200022f565b62000211565b905082815260208101848484011115620002c357620002c26200019a565b5b620002d084828562000264565b509392505050565b5f82601f830112620002ef57620002ee62000196565b5b8151620003018482602086016200028e565b91505092915050565b5f805f606084860312156200032457620003236200018e565b5b5f84015167ffffffffffffffff81111562000344576200034362000192565b5b6200035286828701620002d8565b935050602084015167ffffffffffffffff81111562000376576200037562000192565b5b6200038486828701620002d8565b925050604084015167ffffffffffffffff811115620003a857620003a762000192565b5b620003b686828701620002d8565b9150509250925092565b5f81519050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f60028204905060018216806200040f57607f821691505b602082108103620004255762000424620003ca565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302620004897fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200044c565b6200049586836200044c565b95508019841693508086168417925050509392505050565b5f819050919050565b5f819050919050565b5f620004df620004d9620004d384620004ad565b620004b6565b620004ad565b9050919050565b5f819050919050565b620004fa83620004bf565b620005126200050982620004e6565b84845462000458565b825550505050565b5f90565b620005286200051a565b62000535818484620004ef565b505050565b5b818110156200055c57620005505f826200051e565b6001810190506200053b565b5050565b601f821115620005ab5762000575816200042b565b62000580846200043d565b8101602085101562000590578190505b620005a86200059f856200043d565b8301826200053a565b50505b505050565b5f82821c905092915050565b5f620005cd5f1984600802620005b0565b1980831691505092915050565b5f620005e78383620005bc565b9150826002028217905092915050565b6200060282620003c0565b67ffffffffffffffff8111156200061e576200061d620001ae565b5b6200062a8254620003f7565b6200063782828562000560565b5f60209050601f8311600181146200066d575f841562000658578287015190505b620006648582620005da565b865550620006d3565b601f1984166200067d866200042b565b5f5b82811015620006a6578489015182556001820191506020850194506020810190506200067f565b86831015620006c65784890151620006c2601f891682620005bc565b8355505b6001600288020188555050505b505050505050565b614b6680620006e95f395ff3fe608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80636a6278421161010257806395d89b41116100a0578063bfe8ff4c1161006f578063bfe8ff4c146104dd578063c87b56dd1461050d578063e985e9c51461053d578063f2fde38b1461056d576101cd565b806395d89b4114610457578063a22cb46514610475578063a8ef986114610491578063b88d4fde146104c1576101cd565b80637d6eed44116100dc5780637d6eed44146103e357806380b0b95d146104135780638456cb591461042f5780638da5cb5b14610439576101cd565b80636a6278421461038d57806370a08231146103a9578063715018a6146103d9576101cd565b806332cb6b0c1161016f57806342842e0e1161014957806342842e0e1461030757806355f804b3146103235780635c975abb1461033f5780636352211e1461035d576101cd565b806332cb6b0c146102c35780633c9d93b8146102e15780633f4ba83a146102fd576101cd565b806308f6f8ed116101ab57806308f6f8ed1461024f578063095ea7b31461026d57806318160ddd1461028957806323b872dd146102a7576101cd565b806301ffc9a7146101d157806306fdde0314610201578063081812fc1461021f575b5f80fd5b6101eb60048036038101906101e69190612e4b565b610589565b6040516101f89190612e90565b60405180910390f35b61020961066a565b6040516102169190612f33565b60405180910390f35b61023960048036038101906102349190612f86565b6106f9565b6040516102469190612ff0565b60405180910390f35b61025761077a565b6040516102649190613018565b60405180910390f35b6102876004803603810190610282919061305b565b610795565b005b6102916108ab565b60405161029e9190613018565b60405180910390f35b6102c160048036038101906102bc9190613099565b6108bb565b005b6102cb61091b565b6040516102d89190613018565b60405180910390f35b6102fb60048036038101906102f691906130e9565b610921565b005b610305610c6d565b005b610321600480360381019061031c9190613099565b610cf3565b005b61033d60048036038101906103389190613240565b610d12565b005b610347610da1565b6040516103549190612e90565b60405180910390f35b61037760048036038101906103729190612f86565b610db6565b6040516103849190612ff0565b60405180910390f35b6103a760048036038101906103a291906130e9565b610e62565b005b6103c360048036038101906103be91906130e9565b6110fb565b6040516103d09190613018565b60405180910390f35b6103e16111af565b005b6103fd60048036038101906103f891906130e9565b611266565b60405161040a9190613018565b60405180910390f35b61042d6004803603810190610428919061340b565b611438565b005b61043761186a565b005b6104416118f0565b60405161044e9190612ff0565b60405180910390f35b61045f611919565b60405161046c9190612f33565b60405180910390f35b61048f600480360381019061048a91906134ab565b6119a9565b005b6104ab60048036038101906104a69190612f86565b6119bf565b6040516104b89190613547565b60405180910390f35b6104db60048036038101906104d691906135fe565b611add565b005b6104f760048036038101906104f291906130e9565b611b3f565b6040516105049190612e90565b60405180910390f35b61052760048036038101906105229190612f86565b611c05565b6040516105349190612f33565b60405180910390f35b6105576004803603810190610552919061367e565b611c36565b6040516105649190612e90565b60405180910390f35b610587600480360381019061058291906130e9565b611cc4565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610663575061066282611dba565b5b9050919050565b60605f8054610678906136e9565b80601f01602080910402602001604051908101604052809291908181526020018280546106a4906136e9565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b5f61070382611e23565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073990613789565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f6107836108ab565b6103e861079091906137d4565b905090565b5f61079f82610db6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690613877565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082e611e8b565b73ffffffffffffffffffffffffffffffffffffffff16148061085d575061085c81610857611e8b565b611c36565b5b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390613905565b60405180910390fd5b6108a68383611e92565b505050565b5f6108b6600b611f48565b905090565b6108cc6108c6611e8b565b82611f54565b61090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290613993565b60405180910390fd5b610916838383612030565b505050565b6103e881565b610929611e8b565b73ffffffffffffffffffffffffffffffffffffffff166109476118f0565b73ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906139fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613a63565b60405180910390fd5b5f60098054905011610a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4990613acb565b60405180910390fd5b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060098181548110610aa757610aa6613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990613b86565b60405180910390fd5b60098181548110610b5657610b55613ae9565b5b905f5260205f20906003020160020154600754610b7391906137d4565b6007819055505f60098281548110610b8e57610b8d613ae9565b5b905f5260205f2090600302015f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60098281548110610bee57610bed613ae9565b5b905f5260205f209060030201600101819055505f60098281548110610c1657610c15613ae9565b5b905f5260205f2090600302016002018190555060085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555050565b610c75611e8b565b73ffffffffffffffffffffffffffffffffffffffff16610c936118f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce0906139fb565b60405180910390fd5b610cf1612280565b565b610d0d83838360405180602001604052805f815250611add565b505050565b610d1a611e8b565b73ffffffffffffffffffffffffffffffffffffffff16610d386118f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d85906139fb565b60405180910390fd5b80600c9081610d9d9190613d41565b5050565b5f60065f9054906101000a900460ff16905090565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613e80565b60405180910390fd5b80915050919050565b6002600a5403610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90613ee8565b60405180910390fd5b6002600a81905550610eb7610da1565b15610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f50565b60405180910390fd5b5f60098054905011610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613fde565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060098181548110610f9357610f92613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102590613fde565b60405180910390fd5b5f61103833611266565b11611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f9061406c565b60405180910390fd5b6103e8611085600b611f48565b106110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc906140fa565b60405180910390fd5b5f6110d0600b611f48565b90506110dc600b612320565b6110e4612334565b6110ee83826123cf565b50506001600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190614188565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111b7611e8b565b73ffffffffffffffffffffffffffffffffffffffff166111d56118f0565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906139fb565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614216565b60405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613a63565b60405180910390fd5b5f6009805490501161131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390613acb565b60405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506009818154811061137157611370613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613fde565b60405180910390fd5b600981815481106114205761141f613ae9565b5b905f5260205f20906003020160020154915050919050565b611440611e8b565b73ffffffffffffffffffffffffffffffffffffffff1661145e6118f0565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab906139fb565b60405180910390fd5b80518251146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef9061427e565b60405180910390fd5b5f5b8251811015611865575f83828151811061151757611516613ae9565b5b602002602001015190505f83838151811061153557611534613ae9565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490613a63565b60405180910390fd5b5f81116115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e69061430c565b60405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600980549050111561173b575f81111561168a575f611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90614374565b60405180910390fd5b61173a565b60095f8154811061169e5761169d613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614374565b60405180910390fd5b5b5b600960405180606001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200184815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201555050600160098054905061180091906137d4565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160075461184f9190614392565b60078190555050505080806001019150506114fa565b505050565b611872611e8b565b73ffffffffffffffffffffffffffffffffffffffff166118906118f0565b73ffffffffffffffffffffffffffffffffffffffff16146118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd906139fb565b60405180910390fd5b6118ee6123ec565b565b5f600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611928906136e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611954906136e9565b801561199f5780601f106119765761010080835404028352916020019161199f565b820191905f5260205f20905b81548152906001019060200180831161198257829003601f168201915b5050505050905090565b6119bb6119b4611e8b565b838361248e565b5050565b6119c7612db1565b6119cf611e8b565b73ffffffffffffffffffffffffffffffffffffffff166119ed6118f0565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a906139fb565b60405180910390fd5b60098281548110611a5757611a56613ae9565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050919050565b611aee611ae8611e8b565b83611f54565b611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490613993565b60405180910390fd5b611b39848484846125f5565b50505050565b5f8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8110158015611bfd575060098181548110611ba057611b9f613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b915050919050565b6060611c1082612651565b604051602001611c209190614449565b6040516020818303038152906040529050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ccc611e8b565b73ffffffffffffffffffffffffffffffffffffffff16611cea6118f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d37906139fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da5906144da565b60405180910390fd5b611db7816126f5565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f0283610db6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815f01549050919050565b5f611f5e82611e23565b611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614568565b60405180910390fd5b5f611fa783610db6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201657508373ffffffffffffffffffffffffffffffffffffffff16611ffe846106f9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061202757506120268185611c36565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205082610db6565b73ffffffffffffffffffffffffffffffffffffffff16146120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d906145f6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90614684565b60405180910390fd5b61211f8383836127ba565b6121295f82611e92565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461217691906137d4565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121ca9190614392565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612288610da1565b6122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be906146ec565b60405180910390fd5b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612309611e8b565b6040516123169190612ff0565b60405180910390a1565b6001815f015f828254019250508190555050565b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060016009828154811061238b5761238a613ae9565b5b905f5260205f209060030201600201546123a591906137d4565b600982815481106123b9576123b8613ae9565b5b905f5260205f2090600302016002018190555050565b6123e8828260405180602001604052805f815250612812565b5050565b6123f4610da1565b15612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90613f50565b60405180910390fd5b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612477611e8b565b6040516124849190612ff0565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f390614754565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125e89190612e90565b60405180910390a3505050565b612600848484612030565b61260c8484848461286c565b61264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906147e2565b60405180910390fd5b50505050565b606061265c82611e23565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614870565b60405180910390fd5b5f6126a46129ee565b90505f8151116126c25760405180602001604052805f8152506126ed565b806126cc84612a7e565b6040516020016126dd92919061488e565b6040516020818303038152906040525b915050919050565b5f600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127c2610da1565b15612802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f990613f50565b60405180910390fd5b61280d838383612bd7565b505050565b61281c8383612bdc565b6128285f84848461286c565b612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e906147e2565b60405180910390fd5b505050565b5f61288c8473ffffffffffffffffffffffffffffffffffffffff16612da0565b156129e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b5611e8b565b8786866040518563ffffffff1660e01b81526004016128d79493929190614903565b6020604051808303815f875af192505050801561291257506040513d601f19601f8201168201806040525081019061290f9190614961565b60015b612991573d805f8114612940576040519150601f19603f3d011682016040523d82523d5f602084013e612945565b606091505b505f815103612989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612980906147e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129e6565b600190505b949350505050565b6060600c80546129fd906136e9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a29906136e9565b8015612a745780601f10612a4b57610100808354040283529160200191612a74565b820191905f5260205f20905b815481529060010190602001808311612a5757829003601f168201915b5050505050905090565b60605f8203612ac4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bd2565b5f8290505f5b5f8214612af3578080612adc9061498c565b915050600a82612aec9190614a00565b9150612aca565b5f8167ffffffffffffffff811115612b0e57612b0d61311c565b5b6040519080825280601f01601f191660200182016040528015612b405781602001600182028036833780820191505090505b5090505b5f8514612bcb57600182612b5891906137d4565b9150600a85612b679190614a30565b6030612b739190614392565b60f81b818381518110612b8957612b88613ae9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612bc49190614a00565b9450612b44565b8093505050505b919050565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4190614aaa565b60405180910390fd5b612c5381611e23565b15612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614b12565b60405180910390fd5b612c9e5f83836127ba565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ceb9190614392565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f80823b90505f8111915050919050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2a81612df6565b8114612e34575f80fd5b50565b5f81359050612e4581612e21565b92915050565b5f60208284031215612e6057612e5f612dee565b5b5f612e6d84828501612e37565b91505092915050565b5f8115159050919050565b612e8a81612e76565b82525050565b5f602082019050612ea35f830184612e81565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ee0578082015181840152602081019050612ec5565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0582612ea9565b612f0f8185612eb3565b9350612f1f818560208601612ec3565b612f2881612eeb565b840191505092915050565b5f6020820190508181035f830152612f4b8184612efb565b905092915050565b5f819050919050565b612f6581612f53565b8114612f6f575f80fd5b50565b5f81359050612f8081612f5c565b92915050565b5f60208284031215612f9b57612f9a612dee565b5b5f612fa884828501612f72565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fda82612fb1565b9050919050565b612fea81612fd0565b82525050565b5f6020820190506130035f830184612fe1565b92915050565b61301281612f53565b82525050565b5f60208201905061302b5f830184613009565b92915050565b61303a81612fd0565b8114613044575f80fd5b50565b5f8135905061305581613031565b92915050565b5f806040838503121561307157613070612dee565b5b5f61307e85828601613047565b925050602061308f85828601612f72565b9150509250929050565b5f805f606084860312156130b0576130af612dee565b5b5f6130bd86828701613047565b93505060206130ce86828701613047565b92505060406130df86828701612f72565b9150509250925092565b5f602082840312156130fe576130fd612dee565b5b5f61310b84828501613047565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61315282612eeb565b810181811067ffffffffffffffff821117156131715761317061311c565b5b80604052505050565b5f613183612de5565b905061318f8282613149565b919050565b5f67ffffffffffffffff8211156131ae576131ad61311c565b5b6131b782612eeb565b9050602081019050919050565b828183375f83830152505050565b5f6131e46131df84613194565b61317a565b905082815260208101848484011115613200576131ff613118565b5b61320b8482856131c4565b509392505050565b5f82601f83011261322757613226613114565b5b81356132378482602086016131d2565b91505092915050565b5f6020828403121561325557613254612dee565b5b5f82013567ffffffffffffffff81111561327257613271612df2565b5b61327e84828501613213565b91505092915050565b5f67ffffffffffffffff8211156132a1576132a061311c565b5b602082029050602081019050919050565b5f80fd5b5f6132c86132c384613287565b61317a565b905080838252602082019050602084028301858111156132eb576132ea6132b2565b5b835b8181101561331457806133008882613047565b8452602084019350506020810190506132ed565b5050509392505050565b5f82601f83011261333257613331613114565b5b81356133428482602086016132b6565b91505092915050565b5f67ffffffffffffffff8211156133655761336461311c565b5b602082029050602081019050919050565b5f6133886133838461334b565b61317a565b905080838252602082019050602084028301858111156133ab576133aa6132b2565b5b835b818110156133d457806133c08882612f72565b8452602084019350506020810190506133ad565b5050509392505050565b5f82601f8301126133f2576133f1613114565b5b8135613402848260208601613376565b91505092915050565b5f806040838503121561342157613420612dee565b5b5f83013567ffffffffffffffff81111561343e5761343d612df2565b5b61344a8582860161331e565b925050602083013567ffffffffffffffff81111561346b5761346a612df2565b5b613477858286016133de565b9150509250929050565b61348a81612e76565b8114613494575f80fd5b50565b5f813590506134a581613481565b92915050565b5f80604083850312156134c1576134c0612dee565b5b5f6134ce85828601613047565b92505060206134df85828601613497565b9150509250929050565b6134f281612fd0565b82525050565b61350181612f53565b82525050565b606082015f82015161351b5f8501826134e9565b50602082015161352e60208501826134f8565b50604082015161354160408501826134f8565b50505050565b5f60608201905061355a5f830184613507565b92915050565b5f67ffffffffffffffff82111561357a5761357961311c565b5b61358382612eeb565b9050602081019050919050565b5f6135a261359d84613560565b61317a565b9050828152602081018484840111156135be576135bd613118565b5b6135c98482856131c4565b509392505050565b5f82601f8301126135e5576135e4613114565b5b81356135f5848260208601613590565b91505092915050565b5f805f806080858703121561361657613615612dee565b5b5f61362387828801613047565b945050602061363487828801613047565b935050604061364587828801612f72565b925050606085013567ffffffffffffffff81111561366657613665612df2565b5b613672878288016135d1565b91505092959194509250565b5f806040838503121561369457613693612dee565b5b5f6136a185828601613047565b92505060206136b285828601613047565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061370057607f821691505b602082108103613713576137126136bc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613773602c83612eb3565b915061377e82613719565b604082019050919050565b5f6020820190508181035f8301526137a081613767565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137de82612f53565b91506137e983612f53565b9250828203905081811115613801576138006137a7565b5b92915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f613861602183612eb3565b915061386c82613807565b604082019050919050565b5f6020820190508181035f83015261388e81613855565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6138ef603883612eb3565b91506138fa82613895565b604082019050919050565b5f6020820190508181035f83015261391c816138e3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61397d603183612eb3565b915061398882613923565b604082019050919050565b5f6020820190508181035f8301526139aa81613971565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6139e5602083612eb3565b91506139f0826139b1565b602082019050919050565b5f6020820190508181035f830152613a12816139d9565b9050919050565b7f416464726573732063616e6e6f7420626520656d7074792e00000000000000005f82015250565b5f613a4d601883612eb3565b9150613a5882613a19565b602082019050919050565b5f6020820190508181035f830152613a7a81613a41565b9050919050565b7f41646472657373206e6f7420666f756e642e00000000000000000000000000005f82015250565b5f613ab5601283612eb3565b9150613ac082613a81565b602082019050919050565b5f6020820190508181035f830152613ae281613aa9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4164647265737320746f2062652072656d6f766564206e6f7420666f756e64205f8201527f696e206c6973742e000000000000000000000000000000000000000000000000602082015250565b5f613b70602883612eb3565b9150613b7b82613b16565b604082019050919050565b5f6020820190508181035f830152613b9d81613b64565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613c007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bc5565b613c0a8683613bc5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613c45613c40613c3b84612f53565b613c22565b612f53565b9050919050565b5f819050919050565b613c5e83613c2b565b613c72613c6a82613c4c565b848454613bd1565b825550505050565b5f90565b613c86613c7a565b613c91818484613c55565b505050565b5b81811015613cb457613ca95f82613c7e565b600181019050613c97565b5050565b601f821115613cf957613cca81613ba4565b613cd384613bb6565b81016020851015613ce2578190505b613cf6613cee85613bb6565b830182613c96565b50505b505050565b5f82821c905092915050565b5f613d195f1984600802613cfe565b1980831691505092915050565b5f613d318383613d0a565b9150826002028217905092915050565b613d4a82612ea9565b67ffffffffffffffff811115613d6357613d6261311c565b5b613d6d82546136e9565b613d78828285613cb8565b5f60209050601f831160018114613da9575f8415613d97578287015190505b613da18582613d26565b865550613e08565b601f198416613db786613ba4565b5f5b82811015613dde57848901518255600182019150602085019450602081019050613db9565b86831015613dfb5784890151613df7601f891682613d0a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613e6a602983612eb3565b9150613e7582613e10565b604082019050919050565b5f6020820190508181035f830152613e9781613e5e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613ed2601f83612eb3565b9150613edd82613e9e565b602082019050919050565b5f6020820190508181035f830152613eff81613ec6565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f613f3a601083612eb3565b9150613f4582613f06565b602082019050919050565b5f6020820190508181035f830152613f6781613f2e565b9050919050565b7f41646472657373206973206e6f7420616c6c6f77656420746f206d696e74204e5f8201527f4654732e00000000000000000000000000000000000000000000000000000000602082015250565b5f613fc8602483612eb3565b9150613fd382613f6e565b604082019050919050565b5f6020820190508181035f830152613ff581613fbc565b9050919050565b7f4e6f206d6f7265204e465420616c6c6f77616e636520666f72206d696e74696e5f8201527f672e000000000000000000000000000000000000000000000000000000000000602082015250565b5f614056602283612eb3565b915061406182613ffc565b604082019050919050565b5f6020820190508181035f8301526140838161404a565b9050919050565b7f4d41585f535550504c5920726561636865642e2043616e6e6f74206d696e74205f8201527f6e6577204e46542e000000000000000000000000000000000000000000000000602082015250565b5f6140e4602883612eb3565b91506140ef8261408a565b604082019050919050565b5f6020820190508181035f830152614111816140d8565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f614172602a83612eb3565b915061417d82614118565b604082019050919050565b5f6020820190508181035f83015261419f81614166565b9050919050565b7f52656e6f756e63696e67206f776e6572736869702069732070726576656e74655f8201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b5f614200602283612eb3565b915061420b826141a6565b604082019050919050565b5f6020820190508181035f83015261422d816141f4565b9050919050565b7f417272617973206c656e677468206d69736d617463682e0000000000000000005f82015250565b5f614268601783612eb3565b915061427382614234565b602082019050919050565b5f6020820190508181035f8301526142958161425c565b9050919050565b7f4e465420636f756e74206d7573742062652067726561746572207468616e20305f8201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f6142f6602183612eb3565b91506143018261429c565b604082019050919050565b5f6020820190508181035f830152614323816142ea565b9050919050565b7f4164647265737320616c7265616479206578697374732e0000000000000000005f82015250565b5f61435e601783612eb3565b91506143698261432a565b602082019050919050565b5f6020820190508181035f83015261438b81614352565b9050919050565b5f61439c82612f53565b91506143a783612f53565b92508282019050808211156143bf576143be6137a7565b5b92915050565b5f81905092915050565b5f6143d982612ea9565b6143e381856143c5565b93506143f3818560208601612ec3565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6144336005836143c5565b915061443e826143ff565b600582019050919050565b5f61445482846143cf565b915061445f82614427565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6144c4602683612eb3565b91506144cf8261446a565b604082019050919050565b5f6020820190508181035f8301526144f1816144b8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f614552602c83612eb3565b915061455d826144f8565b604082019050919050565b5f6020820190508181035f83015261457f81614546565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f6145e0602983612eb3565b91506145eb82614586565b604082019050919050565b5f6020820190508181035f83015261460d816145d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61466e602483612eb3565b915061467982614614565b604082019050919050565b5f6020820190508181035f83015261469b81614662565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f6146d6601483612eb3565b91506146e1826146a2565b602082019050919050565b5f6020820190508181035f830152614703816146ca565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61473e601983612eb3565b91506147498261470a565b602082019050919050565b5f6020820190508181035f83015261476b81614732565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6147cc603283612eb3565b91506147d782614772565b604082019050919050565b5f6020820190508181035f8301526147f9816147c0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61485a602f83612eb3565b915061486582614800565b604082019050919050565b5f6020820190508181035f8301526148878161484e565b9050919050565b5f61489982856143cf565b91506148a582846143cf565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6148d5826148b1565b6148df81856148bb565b93506148ef818560208601612ec3565b6148f881612eeb565b840191505092915050565b5f6080820190506149165f830187612fe1565b6149236020830186612fe1565b6149306040830185613009565b818103606083015261494281846148cb565b905095945050505050565b5f8151905061495b81612e21565b92915050565b5f6020828403121561497657614975612dee565b5b5f6149838482850161494d565b91505092915050565b5f61499682612f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149c8576149c76137a7565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a0a82612f53565b9150614a1583612f53565b925082614a2557614a246149d3565b5b828204905092915050565b5f614a3a82612f53565b9150614a4583612f53565b925082614a5557614a546149d3565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614a94602083612eb3565b9150614a9f82614a60565b602082019050919050565b5f6020820190508181035f830152614ac181614a88565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614afc601c83612eb3565b9150614b0782614ac8565b602082019050919050565b5f6020820190508181035f830152614b2981614af0565b905091905056fea26469706673582212206ef43f01678f91da8851d2664ae40b639d42db04cd218a6ed12481b3edaea03464736f6c63430008170033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001453746f726d576172666172652047656e6573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000035357470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d68747470733a2f2f73746f726d2d776172666172652e73332e65752d63656e7472616c2d312e616d617a6f6e6177732e636f6d2f6d657461646174612f000000
Deployed Bytecode
0x608060405234801561000f575f80fd5b50600436106101cd575f3560e01c80636a6278421161010257806395d89b41116100a0578063bfe8ff4c1161006f578063bfe8ff4c146104dd578063c87b56dd1461050d578063e985e9c51461053d578063f2fde38b1461056d576101cd565b806395d89b4114610457578063a22cb46514610475578063a8ef986114610491578063b88d4fde146104c1576101cd565b80637d6eed44116100dc5780637d6eed44146103e357806380b0b95d146104135780638456cb591461042f5780638da5cb5b14610439576101cd565b80636a6278421461038d57806370a08231146103a9578063715018a6146103d9576101cd565b806332cb6b0c1161016f57806342842e0e1161014957806342842e0e1461030757806355f804b3146103235780635c975abb1461033f5780636352211e1461035d576101cd565b806332cb6b0c146102c35780633c9d93b8146102e15780633f4ba83a146102fd576101cd565b806308f6f8ed116101ab57806308f6f8ed1461024f578063095ea7b31461026d57806318160ddd1461028957806323b872dd146102a7576101cd565b806301ffc9a7146101d157806306fdde0314610201578063081812fc1461021f575b5f80fd5b6101eb60048036038101906101e69190612e4b565b610589565b6040516101f89190612e90565b60405180910390f35b61020961066a565b6040516102169190612f33565b60405180910390f35b61023960048036038101906102349190612f86565b6106f9565b6040516102469190612ff0565b60405180910390f35b61025761077a565b6040516102649190613018565b60405180910390f35b6102876004803603810190610282919061305b565b610795565b005b6102916108ab565b60405161029e9190613018565b60405180910390f35b6102c160048036038101906102bc9190613099565b6108bb565b005b6102cb61091b565b6040516102d89190613018565b60405180910390f35b6102fb60048036038101906102f691906130e9565b610921565b005b610305610c6d565b005b610321600480360381019061031c9190613099565b610cf3565b005b61033d60048036038101906103389190613240565b610d12565b005b610347610da1565b6040516103549190612e90565b60405180910390f35b61037760048036038101906103729190612f86565b610db6565b6040516103849190612ff0565b60405180910390f35b6103a760048036038101906103a291906130e9565b610e62565b005b6103c360048036038101906103be91906130e9565b6110fb565b6040516103d09190613018565b60405180910390f35b6103e16111af565b005b6103fd60048036038101906103f891906130e9565b611266565b60405161040a9190613018565b60405180910390f35b61042d6004803603810190610428919061340b565b611438565b005b61043761186a565b005b6104416118f0565b60405161044e9190612ff0565b60405180910390f35b61045f611919565b60405161046c9190612f33565b60405180910390f35b61048f600480360381019061048a91906134ab565b6119a9565b005b6104ab60048036038101906104a69190612f86565b6119bf565b6040516104b89190613547565b60405180910390f35b6104db60048036038101906104d691906135fe565b611add565b005b6104f760048036038101906104f291906130e9565b611b3f565b6040516105049190612e90565b60405180910390f35b61052760048036038101906105229190612f86565b611c05565b6040516105349190612f33565b60405180910390f35b6105576004803603810190610552919061367e565b611c36565b6040516105649190612e90565b60405180910390f35b610587600480360381019061058291906130e9565b611cc4565b005b5f7f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610663575061066282611dba565b5b9050919050565b60605f8054610678906136e9565b80601f01602080910402602001604051908101604052809291908181526020018280546106a4906136e9565b80156106ef5780601f106106c6576101008083540402835291602001916106ef565b820191905f5260205f20905b8154815290600101906020018083116106d257829003601f168201915b5050505050905090565b5f61070382611e23565b610742576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073990613789565b60405180910390fd5b60045f8381526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b5f6107836108ab565b6103e861079091906137d4565b905090565b5f61079f82610db6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361080f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161080690613877565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661082e611e8b565b73ffffffffffffffffffffffffffffffffffffffff16148061085d575061085c81610857611e8b565b611c36565b5b61089c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089390613905565b60405180910390fd5b6108a68383611e92565b505050565b5f6108b6600b611f48565b905090565b6108cc6108c6611e8b565b82611f54565b61090b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090290613993565b60405180910390fd5b610916838383612030565b505050565b6103e881565b610929611e8b565b73ffffffffffffffffffffffffffffffffffffffff166109476118f0565b73ffffffffffffffffffffffffffffffffffffffff161461099d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610994906139fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0290613a63565b60405180910390fd5b5f60098054905011610a52576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4990613acb565b60405180910390fd5b5f60085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060098181548110610aa757610aa6613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614610b42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3990613b86565b60405180910390fd5b60098181548110610b5657610b55613ae9565b5b905f5260205f20906003020160020154600754610b7391906137d4565b6007819055505f60098281548110610b8e57610b8d613ae9565b5b905f5260205f2090600302015f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055505f60098281548110610bee57610bed613ae9565b5b905f5260205f209060030201600101819055505f60098281548110610c1657610c15613ae9565b5b905f5260205f2090600302016002018190555060085f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555050565b610c75611e8b565b73ffffffffffffffffffffffffffffffffffffffff16610c936118f0565b73ffffffffffffffffffffffffffffffffffffffff1614610ce9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce0906139fb565b60405180910390fd5b610cf1612280565b565b610d0d83838360405180602001604052805f815250611add565b505050565b610d1a611e8b565b73ffffffffffffffffffffffffffffffffffffffff16610d386118f0565b73ffffffffffffffffffffffffffffffffffffffff1614610d8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d85906139fb565b60405180910390fd5b80600c9081610d9d9190613d41565b5050565b5f60065f9054906101000a900460ff16905090565b5f8060025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1690505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610e59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5090613e80565b60405180910390fd5b80915050919050565b6002600a5403610ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e9e90613ee8565b60405180910390fd5b6002600a81905550610eb7610da1565b15610ef7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eee90613f50565b60405180910390fd5b5f60098054905011610f3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f3590613fde565b60405180910390fd5b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060098181548110610f9357610f92613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461102e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161102590613fde565b60405180910390fd5b5f61103833611266565b11611078576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106f9061406c565b60405180910390fd5b6103e8611085600b611f48565b106110c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110bc906140fa565b60405180910390fd5b5f6110d0600b611f48565b90506110dc600b612320565b6110e4612334565b6110ee83826123cf565b50506001600a8190555050565b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361116a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161116190614188565b60405180910390fd5b60035f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20549050919050565b6111b7611e8b565b73ffffffffffffffffffffffffffffffffffffffff166111d56118f0565b73ffffffffffffffffffffffffffffffffffffffff161461122b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611222906139fb565b60405180910390fd5b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125d90614216565b60405180910390fd5b5f8073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112cc90613a63565b60405180910390fd5b5f6009805490501161131c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131390613acb565b60405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490506009818154811061137157611370613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461140c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161140390613fde565b60405180910390fd5b600981815481106114205761141f613ae9565b5b905f5260205f20906003020160020154915050919050565b611440611e8b565b73ffffffffffffffffffffffffffffffffffffffff1661145e6118f0565b73ffffffffffffffffffffffffffffffffffffffff16146114b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ab906139fb565b60405180910390fd5b80518251146114f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114ef9061427e565b60405180910390fd5b5f5b8251811015611865575f83828151811061151757611516613ae9565b5b602002602001015190505f83838151811061153557611534613ae9565b5b602002602001015190505f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036115ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a490613a63565b60405180910390fd5b5f81116115ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115e69061430c565b60405180910390fd5b5f60085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f600980549050111561173b575f81111561168a575f611685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167c90614374565b60405180910390fd5b61173a565b60095f8154811061169e5761169d613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611739576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161173090614374565b60405180910390fd5b5b5b600960405180606001604052808573ffffffffffffffffffffffffffffffffffffffff16815260200184815260200184815250908060018154018082558091505060019003905f5260205f2090600302015f909190919091505f820151815f015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160010155604082015181600201555050600160098054905061180091906137d4565b60085f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055508160075461184f9190614392565b60078190555050505080806001019150506114fa565b505050565b611872611e8b565b73ffffffffffffffffffffffffffffffffffffffff166118906118f0565b73ffffffffffffffffffffffffffffffffffffffff16146118e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118dd906139fb565b60405180910390fd5b6118ee6123ec565b565b5f600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611928906136e9565b80601f0160208091040260200160405190810160405280929190818152602001828054611954906136e9565b801561199f5780601f106119765761010080835404028352916020019161199f565b820191905f5260205f20905b81548152906001019060200180831161198257829003601f168201915b5050505050905090565b6119bb6119b4611e8b565b838361248e565b5050565b6119c7612db1565b6119cf611e8b565b73ffffffffffffffffffffffffffffffffffffffff166119ed6118f0565b73ffffffffffffffffffffffffffffffffffffffff1614611a43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3a906139fb565b60405180910390fd5b60098281548110611a5757611a56613ae9565b5b905f5260205f2090600302016040518060600160405290815f82015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001600182015481526020016002820154815250509050919050565b611aee611ae8611e8b565b83611f54565b611b2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2490613993565b60405180910390fd5b611b39848484846125f5565b50505050565b5f8060085f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205490505f8110158015611bfd575060098181548110611ba057611b9f613ae9565b5b905f5260205f2090600302015f015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16145b915050919050565b6060611c1082612651565b604051602001611c209190614449565b6040516020818303038152906040529050919050565b5f60055f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff16905092915050565b611ccc611e8b565b73ffffffffffffffffffffffffffffffffffffffff16611cea6118f0565b73ffffffffffffffffffffffffffffffffffffffff1614611d40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d37906139fb565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611dae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da5906144da565b60405180910390fd5b611db7816126f5565b50565b5f7f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b5f8073ffffffffffffffffffffffffffffffffffffffff1660025f8481526020019081526020015f205f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b5f33905090565b8160045f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f0283610db6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b5f815f01549050919050565b5f611f5e82611e23565b611f9d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f9490614568565b60405180910390fd5b5f611fa783610db6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061201657508373ffffffffffffffffffffffffffffffffffffffff16611ffe846106f9565b73ffffffffffffffffffffffffffffffffffffffff16145b8061202757506120268185611c36565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661205082610db6565b73ffffffffffffffffffffffffffffffffffffffff16146120a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209d906145f6565b60405180910390fd5b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612114576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210b90614684565b60405180910390fd5b61211f8383836127ba565b6121295f82611e92565b600160035f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461217691906137d4565b92505081905550600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8282546121ca9190614392565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612288610da1565b6122c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122be906146ec565b60405180910390fd5b5f60065f6101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612309611e8b565b6040516123169190612ff0565b60405180910390a1565b6001815f015f828254019250508190555050565b5f60085f3373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054905060016009828154811061238b5761238a613ae9565b5b905f5260205f209060030201600201546123a591906137d4565b600982815481106123b9576123b8613ae9565b5b905f5260205f2090600302016002018190555050565b6123e8828260405180602001604052805f815250612812565b5050565b6123f4610da1565b15612434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242b90613f50565b60405180910390fd5b600160065f6101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612477611e8b565b6040516124849190612ff0565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124f390614754565b60405180910390fd5b8060055f8573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516125e89190612e90565b60405180910390a3505050565b612600848484612030565b61260c8484848461286c565b61264b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612642906147e2565b60405180910390fd5b50505050565b606061265c82611e23565b61269b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269290614870565b60405180910390fd5b5f6126a46129ee565b90505f8151116126c25760405180602001604052805f8152506126ed565b806126cc84612a7e565b6040516020016126dd92919061488e565b6040516020818303038152906040525b915050919050565b5f600660019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6127c2610da1565b15612802576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f990613f50565b60405180910390fd5b61280d838383612bd7565b505050565b61281c8383612bdc565b6128285f84848461286c565b612867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161285e906147e2565b60405180910390fd5b505050565b5f61288c8473ffffffffffffffffffffffffffffffffffffffff16612da0565b156129e1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128b5611e8b565b8786866040518563ffffffff1660e01b81526004016128d79493929190614903565b6020604051808303815f875af192505050801561291257506040513d601f19601f8201168201806040525081019061290f9190614961565b60015b612991573d805f8114612940576040519150601f19603f3d011682016040523d82523d5f602084013e612945565b606091505b505f815103612989576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612980906147e2565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506129e6565b600190505b949350505050565b6060600c80546129fd906136e9565b80601f0160208091040260200160405190810160405280929190818152602001828054612a29906136e9565b8015612a745780601f10612a4b57610100808354040283529160200191612a74565b820191905f5260205f20905b815481529060010190602001808311612a5757829003601f168201915b5050505050905090565b60605f8203612ac4576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612bd2565b5f8290505f5b5f8214612af3578080612adc9061498c565b915050600a82612aec9190614a00565b9150612aca565b5f8167ffffffffffffffff811115612b0e57612b0d61311c565b5b6040519080825280601f01601f191660200182016040528015612b405781602001600182028036833780820191505090505b5090505b5f8514612bcb57600182612b5891906137d4565b9150600a85612b679190614a30565b6030612b739190614392565b60f81b818381518110612b8957612b88613ae9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a85612bc49190614a00565b9450612b44565b8093505050505b919050565b505050565b5f73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4190614aaa565b60405180910390fd5b612c5381611e23565b15612c93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8a90614b12565b60405180910390fd5b612c9e5f83836127ba565b600160035f8473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f828254612ceb9190614392565b925050819055508160025f8381526020019081526020015f205f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff165f73ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b5f80823b90505f8111915050919050565b60405180606001604052805f73ffffffffffffffffffffffffffffffffffffffff1681526020015f81526020015f81525090565b5f604051905090565b5f80fd5b5f80fd5b5f7fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612e2a81612df6565b8114612e34575f80fd5b50565b5f81359050612e4581612e21565b92915050565b5f60208284031215612e6057612e5f612dee565b5b5f612e6d84828501612e37565b91505092915050565b5f8115159050919050565b612e8a81612e76565b82525050565b5f602082019050612ea35f830184612e81565b92915050565b5f81519050919050565b5f82825260208201905092915050565b5f5b83811015612ee0578082015181840152602081019050612ec5565b5f8484015250505050565b5f601f19601f8301169050919050565b5f612f0582612ea9565b612f0f8185612eb3565b9350612f1f818560208601612ec3565b612f2881612eeb565b840191505092915050565b5f6020820190508181035f830152612f4b8184612efb565b905092915050565b5f819050919050565b612f6581612f53565b8114612f6f575f80fd5b50565b5f81359050612f8081612f5c565b92915050565b5f60208284031215612f9b57612f9a612dee565b5b5f612fa884828501612f72565b91505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f612fda82612fb1565b9050919050565b612fea81612fd0565b82525050565b5f6020820190506130035f830184612fe1565b92915050565b61301281612f53565b82525050565b5f60208201905061302b5f830184613009565b92915050565b61303a81612fd0565b8114613044575f80fd5b50565b5f8135905061305581613031565b92915050565b5f806040838503121561307157613070612dee565b5b5f61307e85828601613047565b925050602061308f85828601612f72565b9150509250929050565b5f805f606084860312156130b0576130af612dee565b5b5f6130bd86828701613047565b93505060206130ce86828701613047565b92505060406130df86828701612f72565b9150509250925092565b5f602082840312156130fe576130fd612dee565b5b5f61310b84828501613047565b91505092915050565b5f80fd5b5f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61315282612eeb565b810181811067ffffffffffffffff821117156131715761317061311c565b5b80604052505050565b5f613183612de5565b905061318f8282613149565b919050565b5f67ffffffffffffffff8211156131ae576131ad61311c565b5b6131b782612eeb565b9050602081019050919050565b828183375f83830152505050565b5f6131e46131df84613194565b61317a565b905082815260208101848484011115613200576131ff613118565b5b61320b8482856131c4565b509392505050565b5f82601f83011261322757613226613114565b5b81356132378482602086016131d2565b91505092915050565b5f6020828403121561325557613254612dee565b5b5f82013567ffffffffffffffff81111561327257613271612df2565b5b61327e84828501613213565b91505092915050565b5f67ffffffffffffffff8211156132a1576132a061311c565b5b602082029050602081019050919050565b5f80fd5b5f6132c86132c384613287565b61317a565b905080838252602082019050602084028301858111156132eb576132ea6132b2565b5b835b8181101561331457806133008882613047565b8452602084019350506020810190506132ed565b5050509392505050565b5f82601f83011261333257613331613114565b5b81356133428482602086016132b6565b91505092915050565b5f67ffffffffffffffff8211156133655761336461311c565b5b602082029050602081019050919050565b5f6133886133838461334b565b61317a565b905080838252602082019050602084028301858111156133ab576133aa6132b2565b5b835b818110156133d457806133c08882612f72565b8452602084019350506020810190506133ad565b5050509392505050565b5f82601f8301126133f2576133f1613114565b5b8135613402848260208601613376565b91505092915050565b5f806040838503121561342157613420612dee565b5b5f83013567ffffffffffffffff81111561343e5761343d612df2565b5b61344a8582860161331e565b925050602083013567ffffffffffffffff81111561346b5761346a612df2565b5b613477858286016133de565b9150509250929050565b61348a81612e76565b8114613494575f80fd5b50565b5f813590506134a581613481565b92915050565b5f80604083850312156134c1576134c0612dee565b5b5f6134ce85828601613047565b92505060206134df85828601613497565b9150509250929050565b6134f281612fd0565b82525050565b61350181612f53565b82525050565b606082015f82015161351b5f8501826134e9565b50602082015161352e60208501826134f8565b50604082015161354160408501826134f8565b50505050565b5f60608201905061355a5f830184613507565b92915050565b5f67ffffffffffffffff82111561357a5761357961311c565b5b61358382612eeb565b9050602081019050919050565b5f6135a261359d84613560565b61317a565b9050828152602081018484840111156135be576135bd613118565b5b6135c98482856131c4565b509392505050565b5f82601f8301126135e5576135e4613114565b5b81356135f5848260208601613590565b91505092915050565b5f805f806080858703121561361657613615612dee565b5b5f61362387828801613047565b945050602061363487828801613047565b935050604061364587828801612f72565b925050606085013567ffffffffffffffff81111561366657613665612df2565b5b613672878288016135d1565b91505092959194509250565b5f806040838503121561369457613693612dee565b5b5f6136a185828601613047565b92505060206136b285828601613047565b9150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061370057607f821691505b602082108103613713576137126136bc565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f613773602c83612eb3565b915061377e82613719565b604082019050919050565b5f6020820190508181035f8301526137a081613767565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6137de82612f53565b91506137e983612f53565b9250828203905081811115613801576138006137a7565b5b92915050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e655f8201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b5f613861602183612eb3565b915061386c82613807565b604082019050919050565b5f6020820190508181035f83015261388e81613855565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f775f8201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b5f6138ef603883612eb3565b91506138fa82613895565b604082019050919050565b5f6020820190508181035f83015261391c816138e3565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f5f8201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b5f61397d603183612eb3565b915061398882613923565b604082019050919050565b5f6020820190508181035f8301526139aa81613971565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65725f82015250565b5f6139e5602083612eb3565b91506139f0826139b1565b602082019050919050565b5f6020820190508181035f830152613a12816139d9565b9050919050565b7f416464726573732063616e6e6f7420626520656d7074792e00000000000000005f82015250565b5f613a4d601883612eb3565b9150613a5882613a19565b602082019050919050565b5f6020820190508181035f830152613a7a81613a41565b9050919050565b7f41646472657373206e6f7420666f756e642e00000000000000000000000000005f82015250565b5f613ab5601283612eb3565b9150613ac082613a81565b602082019050919050565b5f6020820190508181035f830152613ae281613aa9565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4164647265737320746f2062652072656d6f766564206e6f7420666f756e64205f8201527f696e206c6973742e000000000000000000000000000000000000000000000000602082015250565b5f613b70602883612eb3565b9150613b7b82613b16565b604082019050919050565b5f6020820190508181035f830152613b9d81613b64565b9050919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f60088302613c007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613bc5565b613c0a8683613bc5565b95508019841693508086168417925050509392505050565b5f819050919050565b5f613c45613c40613c3b84612f53565b613c22565b612f53565b9050919050565b5f819050919050565b613c5e83613c2b565b613c72613c6a82613c4c565b848454613bd1565b825550505050565b5f90565b613c86613c7a565b613c91818484613c55565b505050565b5b81811015613cb457613ca95f82613c7e565b600181019050613c97565b5050565b601f821115613cf957613cca81613ba4565b613cd384613bb6565b81016020851015613ce2578190505b613cf6613cee85613bb6565b830182613c96565b50505b505050565b5f82821c905092915050565b5f613d195f1984600802613cfe565b1980831691505092915050565b5f613d318383613d0a565b9150826002028217905092915050565b613d4a82612ea9565b67ffffffffffffffff811115613d6357613d6261311c565b5b613d6d82546136e9565b613d78828285613cb8565b5f60209050601f831160018114613da9575f8415613d97578287015190505b613da18582613d26565b865550613e08565b601f198416613db786613ba4565b5f5b82811015613dde57848901518255600182019150602085019450602081019050613db9565b86831015613dfb5784890151613df7601f891682613d0a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e65786973745f8201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b5f613e6a602983612eb3565b9150613e7582613e10565b604082019050919050565b5f6020820190508181035f830152613e9781613e5e565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c005f82015250565b5f613ed2601f83612eb3565b9150613edd82613e9e565b602082019050919050565b5f6020820190508181035f830152613eff81613ec6565b9050919050565b7f5061757361626c653a20706175736564000000000000000000000000000000005f82015250565b5f613f3a601083612eb3565b9150613f4582613f06565b602082019050919050565b5f6020820190508181035f830152613f6781613f2e565b9050919050565b7f41646472657373206973206e6f7420616c6c6f77656420746f206d696e74204e5f8201527f4654732e00000000000000000000000000000000000000000000000000000000602082015250565b5f613fc8602483612eb3565b9150613fd382613f6e565b604082019050919050565b5f6020820190508181035f830152613ff581613fbc565b9050919050565b7f4e6f206d6f7265204e465420616c6c6f77616e636520666f72206d696e74696e5f8201527f672e000000000000000000000000000000000000000000000000000000000000602082015250565b5f614056602283612eb3565b915061406182613ffc565b604082019050919050565b5f6020820190508181035f8301526140838161404a565b9050919050565b7f4d41585f535550504c5920726561636865642e2043616e6e6f74206d696e74205f8201527f6e6577204e46542e000000000000000000000000000000000000000000000000602082015250565b5f6140e4602883612eb3565b91506140ef8261408a565b604082019050919050565b5f6020820190508181035f830152614111816140d8565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a655f8201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b5f614172602a83612eb3565b915061417d82614118565b604082019050919050565b5f6020820190508181035f83015261419f81614166565b9050919050565b7f52656e6f756e63696e67206f776e6572736869702069732070726576656e74655f8201527f642e000000000000000000000000000000000000000000000000000000000000602082015250565b5f614200602283612eb3565b915061420b826141a6565b604082019050919050565b5f6020820190508181035f83015261422d816141f4565b9050919050565b7f417272617973206c656e677468206d69736d617463682e0000000000000000005f82015250565b5f614268601783612eb3565b915061427382614234565b602082019050919050565b5f6020820190508181035f8301526142958161425c565b9050919050565b7f4e465420636f756e74206d7573742062652067726561746572207468616e20305f8201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b5f6142f6602183612eb3565b91506143018261429c565b604082019050919050565b5f6020820190508181035f830152614323816142ea565b9050919050565b7f4164647265737320616c7265616479206578697374732e0000000000000000005f82015250565b5f61435e601783612eb3565b91506143698261432a565b602082019050919050565b5f6020820190508181035f83015261438b81614352565b9050919050565b5f61439c82612f53565b91506143a783612f53565b92508282019050808211156143bf576143be6137a7565b5b92915050565b5f81905092915050565b5f6143d982612ea9565b6143e381856143c5565b93506143f3818560208601612ec3565b80840191505092915050565b7f2e6a736f6e0000000000000000000000000000000000000000000000000000005f82015250565b5f6144336005836143c5565b915061443e826143ff565b600582019050919050565b5f61445482846143cf565b915061445f82614427565b915081905092915050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f20615f8201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b5f6144c4602683612eb3565b91506144cf8261446a565b604082019050919050565b5f6020820190508181035f8301526144f1816144b8565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e65785f8201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b5f614552602c83612eb3565b915061455d826144f8565b604082019050919050565b5f6020820190508181035f83015261457f81614546565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e207468617420695f8201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b5f6145e0602983612eb3565b91506145eb82614586565b604082019050919050565b5f6020820190508181035f83015261460d816145d4565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f206164645f8201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b5f61466e602483612eb3565b915061467982614614565b604082019050919050565b5f6020820190508181035f83015261469b81614662565b9050919050565b7f5061757361626c653a206e6f74207061757365640000000000000000000000005f82015250565b5f6146d6601483612eb3565b91506146e1826146a2565b602082019050919050565b5f6020820190508181035f830152614703816146ca565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c6572000000000000005f82015250565b5f61473e601983612eb3565b91506147498261470a565b602082019050919050565b5f6020820190508181035f83015261476b81614732565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e2045524337323152655f8201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b5f6147cc603283612eb3565b91506147d782614772565b604082019050919050565b5f6020820190508181035f8301526147f9816147c0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f5f8201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b5f61485a602f83612eb3565b915061486582614800565b604082019050919050565b5f6020820190508181035f8301526148878161484e565b9050919050565b5f61489982856143cf565b91506148a582846143cf565b91508190509392505050565b5f81519050919050565b5f82825260208201905092915050565b5f6148d5826148b1565b6148df81856148bb565b93506148ef818560208601612ec3565b6148f881612eeb565b840191505092915050565b5f6080820190506149165f830187612fe1565b6149236020830186612fe1565b6149306040830185613009565b818103606083015261494281846148cb565b905095945050505050565b5f8151905061495b81612e21565b92915050565b5f6020828403121561497657614975612dee565b5b5f6149838482850161494d565b91505092915050565b5f61499682612f53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036149c8576149c76137a7565b5b600182019050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f614a0a82612f53565b9150614a1583612f53565b925082614a2557614a246149d3565b5b828204905092915050565b5f614a3a82612f53565b9150614a4583612f53565b925082614a5557614a546149d3565b5b828206905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f20616464726573735f82015250565b5f614a94602083612eb3565b9150614a9f82614a60565b602082019050919050565b5f6020820190508181035f830152614ac181614a88565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e746564000000005f82015250565b5f614afc601c83612eb3565b9150614b0782614ac8565b602082019050919050565b5f6020820190508181035f830152614b2981614af0565b905091905056fea26469706673582212206ef43f01678f91da8851d2664ae40b639d42db04cd218a6ed12481b3edaea03464736f6c63430008170033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000001453746f726d576172666172652047656e6573697300000000000000000000000000000000000000000000000000000000000000000000000000000000000000035357470000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003d68747470733a2f2f73746f726d2d776172666172652e73332e65752d63656e7472616c2d312e616d617a6f6e6177732e636f6d2f6d657461646174612f000000
-----Decoded View---------------
Arg [0] : name (string): StormWarfare Genesis
Arg [1] : symbol (string): SWG
Arg [2] : baseTokenURI (string): https://storm-warfare.s3.eu-central-1.amazonaws.com/metadata/
-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [4] : 53746f726d576172666172652047656e65736973000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 5357470000000000000000000000000000000000000000000000000000000000
Arg [7] : 000000000000000000000000000000000000000000000000000000000000003d
Arg [8] : 68747470733a2f2f73746f726d2d776172666172652e73332e65752d63656e74
Arg [9] : 72616c2d312e616d617a6f6e6177732e636f6d2f6d657461646174612f000000
Deployed Bytecode Sourcemap
50723:1778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17505:257;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18303:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19638:202;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52234:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19244:345;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52137:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20294:284;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47489:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49033:647;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51539:53;;;:::i;:::-;;20632:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51212:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28835:74;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18042:211;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51714:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17809:188;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51597:112;;;:::i;:::-;;49685:418;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48029:999;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51485:49;;;:::i;:::-;;30637:75;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18443:92;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19895:143;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50304:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20831:272;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50435:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51319:161;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20092:152;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31426:181;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17505:257;17607:4;17639:25;17624:40;;;:11;:40;;;;:93;;;;17684:33;17669:48;;;:11;:48;;;;17624:93;:134;;;;17722:36;17746:11;17722:23;:36::i;:::-;17624:134;17616:142;;17505:257;;;:::o;18303:88::-;18357:13;18382:5;18375:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18303:88;:::o;19638:202::-;19714:7;19734:16;19742:7;19734;:16::i;:::-;19726:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;19812:15;:24;19828:7;19812:24;;;;;;;;;;;;;;;;;;;;;19805:31;;19638:202;;;:::o;52234:102::-;52287:7;52319:13;:11;:13::i;:::-;47523:4;52306:26;;;;:::i;:::-;52299:33;;52234:102;:::o;19244:345::-;19317:13;19333:23;19348:7;19333:14;:23::i;:::-;19317:39;;19373:5;19367:11;;:2;:11;;;19359:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;19448:5;19432:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;19457:37;19474:5;19481:12;:10;:12::i;:::-;19457:16;:37::i;:::-;19432:62;19422:136;;;;;;;;;;;;:::i;:::-;;;;;;;;;19564:21;19573:2;19577:7;19564:8;:21::i;:::-;19314:275;19244:345;;:::o;52137:92::-;52181:7;52200:25;:15;:23;:25::i;:::-;52193:32;;52137:92;:::o;20294:284::-;20445:41;20464:12;:10;:12::i;:::-;20478:7;20445:18;:41::i;:::-;20437:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;20546:28;20556:4;20562:2;20566:7;20546:9;:28::i;:::-;20294:284;;;:::o;47489:38::-;47523:4;47489:38;:::o;49033:647::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49131:1:::1;49111:22;;:8;:22;;::::0;49103:60:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;49200:1;49174:16;:23;;;;:27;49166:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49230:14;49247;:26;49263:8;49247:26;;;;;;;;;;;;;;;;49230:43;;49297:16;49315:6;49297:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;49285:53;;:8;:53;;;49276:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;49437:16;49455:6;49437:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;49413:20;;:68;;;;:::i;:::-;49390:20;:91;;;;49539:1;49487:16;49505:6;49487:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;:54;;;;;;;;;;;;;;;;;;49588:1;49544:16;49562:6;49544:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;:45;;;;49638:1;49592:16;49610:6;49592:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;:47;;;;49652:14;:24;49667:8;49652:24;;;;;;;;;;;;;;;49645:31;;;49100:580;49033:647:::0;:::o;51539:53::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51578:10:::1;:8;:10::i;:::-;51539:53::o:0;20632:145::-;20734:39;20751:4;20757:2;20761:7;20734:39;;;;;;;;;;;;:16;:39::i;:::-;20632:145;;;:::o;51212:102::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51298:12:::1;51282:13;:28;;;;;;:::i;:::-;;51212:102:::0;:::o;28835:74::-;28882:4;28898:7;;;;;;;;;;;28891:14;;28835:74;:::o;18042:211::-;18114:7;18126:13;18142:7;:16;18150:7;18142:16;;;;;;;;;;;;;;;;;;;;;18126:32;;18186:1;18169:19;;:5;:19;;;18161:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;18244:5;18237:12;;;18042:211;;;:::o;51714:418::-;35194:1;35721:7;;:19;35713:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;35194:1;35839:7;:18;;;;29104:8:::1;:6;:8::i;:::-;29103:9;29095:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;47817:1:::2;47791:16;:23;;;;:27;47783:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;47862:14;47879;:28;47895:10;47879:28;;;;;;;;;;;;;;;;47862:45;;47933:16;47951:6;47933:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;47919:55;;:10;:55;;;47910:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;51852:1:::3;51816:33;51838:10;51816:21;:33::i;:::-;:37;51807:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;47523:4;51904:25;:15;:23;:25::i;:::-;:38;51895:92;;;;;;;;;;;;:::i;:::-;;;;;;;;;51996:15;52014:25;:15;:23;:25::i;:::-;51996:43;;52045:27;:15;:25;:27::i;:::-;52078:22;:20;:22::i;:::-;52106;52116:2;52120:7;52106:9;:22::i;:::-;51804:328;47780:244:::2;35154:1:::0;35988:7;:22;;;;51714:418;:::o;17809:188::-;17881:7;17918:1;17901:19;;:5;:19;;;17893:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;17977:9;:16;17987:5;17977:16;;;;;;;;;;;;;;;;17970:23;;17809:188;;;:::o;51597:112::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51660:45:::1;;;;;;;;;;:::i;:::-;;;;;;;;49685:418:::0;49755:4;49792:1;49772:22;;:8;:22;;;49764:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;49861:1;49835:16;:23;;;;:27;49827:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;49891:14;49908;:26;49924:8;49908:26;;;;;;;;;;;;;;;;49891:43;;49958:16;49976:6;49958:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:41;;;;;;;;;;;;49946:53;;:8;:53;;;49937:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;50055:16;50073:6;50055:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;50047:52;;;49685:418;;;:::o;48029:999::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48171:17:::1;:24;48150:10;:17;:45;48142:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;48234:6;48229:796;48250:10;:17;48246:1;:21;48229:796;;;48277:16;48296:10;48307:1;48296:13;;;;;;;;:::i;:::-;;;;;;;;48277:32;;48312:21;48336:17;48354:1;48336:20;;;;;;;;:::i;:::-;;;;;;;;48312:44;;48390:1;48370:22;;:8;:22;;::::0;48362:59:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48451:1;48432:16;:20;48424:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;48496:13;48512:14;:24;48527:8;48512:24;;;;;;;;;;;;;;;;48496:40;;48569:1;48543:16;:23;;;;:27;48539:221;;;48587:1;48579:5;:9;48575:182;;;48601:5;48593:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;48575:182;;;48691:16;48708:1;48691:19;;;;;;;;:::i;:::-;;;;;;;;;;;;:34;;;;;;;;;;;;48679:46;;:8;:46;;::::0;48671:82:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;48575:182;48539:221;48765:16;48787:108;;;;;;;;48811:8;48787:108;;;;;;48838:16;48787:108;;;;48875:16;48787:108;;::::0;48765:131:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48955:1;48929:16;:23;;;;:27;;;;:::i;:::-;48902:14;:24;48917:8;48902:24;;;;;;;;;;;;;;;:54;;;;49005:16;48982:20;;:39;;;;:::i;:::-;48959:20;:62;;;;48274:751;;;48269:3;;;;;;;48229:796;;;;48029:999:::0;;:::o;51485:49::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51522:8:::1;:6;:8::i;:::-;51485:49::o:0;30637:75::-;30683:7;30702:6;;;;;;;;;;;30695:13;;30637:75;:::o;18443:92::-;18499:13;18524:7;18517:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18443:92;:::o;19895:143::-;19982:52;20001:12;:10;:12::i;:::-;20015:8;20025;19982:18;:52::i;:::-;19895:143;;:::o;50304:126::-;50379:11;;:::i;:::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50402:16:::1;50419:6;50402:24;;;;;;;;:::i;:::-;;;;;;;;;;;;50395:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;50304:126:::0;;;:::o;20831:272::-;20962:41;20981:12;:10;:12::i;:::-;20995:7;20962:18;:41::i;:::-;20954:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;21060:39;21074:4;21080:2;21084:7;21093:5;21060:13;:39::i;:::-;20831:272;;;;:::o;50435:197::-;50503:4;50512:13;50528:14;:24;50543:8;50528:24;;;;;;;;;;;;;;;;50512:40;;50572:1;50563:5;:10;;:64;;;;;50589:16;50606:5;50589:23;;;;;;;;:::i;:::-;;;;;;;;;;;;:38;;;;;;;;;;;;50577:50;;:8;:50;;;50563:64;50555:73;;;50435:197;;;:::o;51319:161::-;51392:13;51442:23;51457:7;51442:14;:23::i;:::-;51425:49;;;;;;;;:::i;:::-;;;;;;;;;;;;;51410:66;;51319:161;;;:::o;20092:152::-;20189:4;20205:18;:25;20224:5;20205:25;;;;;;;;;;;;;;;:35;20231:8;20205:35;;;;;;;;;;;;;;;;;;;;;;;;;20198:42;;20092:152;;;;:::o;31426:181::-;30831:12;:10;:12::i;:::-;30820:23;;:7;:5;:7::i;:::-;:23;;;30812:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;31527:1:::1;31507:22;;:8;:22;;::::0;31499:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;31575:28;31594:8;31575:18;:28::i;:::-;31426:181:::0;:::o;16233:145::-;16318:4;16349:25;16334:40;;;:11;:40;;;;16327:47;;16233:145;;;:::o;22423:115::-;22488:4;22532:1;22504:30;;:7;:16;22512:7;22504:16;;;;;;;;;;;;;;;;;;;;;:30;;;;22497:37;;22423:115;;;:::o;588:86::-;641:7;660:10;653:17;;588:86;:::o;25758:154::-;25852:2;25825:15;:24;25841:7;25825:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25900:7;25896:2;25862:46;;25871:23;25886:7;25871:14;:23::i;:::-;25862:46;;;;;;;;;;;;25758:154;;:::o;33124:102::-;33189:7;33208;:14;;;33201:21;;33124:102;;;:::o;22668:320::-;22761:4;22778:16;22786:7;22778;:16::i;:::-;22770:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22846:13;22862:23;22877:7;22862:14;:23::i;:::-;22846:39;;22907:5;22896:16;;:7;:16;;;:51;;;;22940:7;22916:31;;:20;22928:7;22916:11;:20::i;:::-;:31;;;22896:51;:87;;;;22951:32;22968:5;22975:7;22951:16;:32::i;:::-;22896:87;22888:96;;;22668:320;;;;:::o;25189:478::-;25312:4;25285:31;;:23;25300:7;25285:14;:23::i;:::-;:31;;;25277:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;25387:1;25373:16;;:2;:16;;;25365:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;25436:39;25457:4;25463:2;25467:7;25436:20;:39::i;:::-;25525:29;25542:1;25546:7;25525:8;:29::i;:::-;25579:1;25560:9;:15;25570:4;25560:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;25600:1;25583:9;:13;25593:2;25583:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;25623:2;25604:7;:16;25612:7;25604:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;25655:7;25651:2;25636:27;;25645:4;25636:27;;;;;;;;;;;;25189:478;;;:::o;29674:100::-;29324:8;:6;:8::i;:::-;29316:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;29735:5:::1;29725:7;;:15;;;;;;;;;;;;;;;;;;29748:22;29757:12;:10;:12::i;:::-;29748:22;;;;;;:::i;:::-;;;;;;;;29674:100::o:0;33231:95::-;33318:1;33300:7;:14;;;:19;;;;;;;;;;;33231:95;:::o;50108:191::-;50152:14;50169;:28;50185:10;50169:28;;;;;;;;;;;;;;;;50152:45;;50294:1;50247:16;50265:6;50247:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;;50246:49;;;;:::i;:::-;50200:16;50218:6;50200:26;;;;;;;;:::i;:::-;;;;;;;;;;;;:43;;:95;;;;50149:150;50108:191::o;23278:98::-;23346:26;23356:2;23360:7;23346:26;;;;;;;;;;;;:9;:26::i;:::-;23278:98;;:::o;29472:::-;29104:8;:6;:8::i;:::-;29103:9;29095:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;29534:4:::1;29524:7;;:14;;;;;;;;;;;;;;;;;;29546:20;29553:12;:10;:12::i;:::-;29546:20;;;;;;:::i;:::-;;;;;;;;29472:98::o:0;26027:259::-;26146:8;26137:17;;:5;:17;;;26129:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;26225:8;26187:18;:25;26206:5;26187:25;;;;;;;;;;;;;;;:35;26213:8;26187:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;26263:8;26241:41;;26256:5;26241:41;;;26273:8;26241:41;;;;;;:::i;:::-;;;;;;;;26027:259;;;:::o;21893:::-;22006:28;22016:4;22022:2;22026:7;22006:9;:28::i;:::-;22045:48;22068:4;22074:2;22078:7;22087:5;22045:22;:48::i;:::-;22037:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;21893:259;;;;:::o;18589:307::-;18662:13;18688:16;18696:7;18688;:16::i;:::-;18680:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;18762:21;18786:10;:8;:10::i;:::-;18762:34;;18830:1;18812:7;18806:21;:25;:86;;;;;;;;;;;;;;;;;18858:7;18867:18;:7;:16;:18::i;:::-;18841:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;18806:86;18799:93;;;18589:307;;;:::o;31745:163::-;31811:16;31830:6;;;;;;;;;;;31811:25;;31848:8;31839:6;;:17;;;;;;;;;;;;;;;;;;31895:8;31864:40;;31885:8;31864:40;;;;;;;;;;;;31808:100;31745:163;:::o;52341:157::-;29104:8;:6;:8::i;:::-;29103:9;29095:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;52449:45:::1;52476:4;52482:2;52486:7;52449:26;:45::i;:::-;52341:157:::0;;;:::o;23581:241::-;23675:18;23681:2;23685:7;23675:5;:18::i;:::-;23706:54;23737:1;23741:2;23745:7;23754:5;23706:22;:54::i;:::-;23696:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;23581:241;;;:::o;26799:539::-;26918:4;26931:15;:2;:13;;;:15::i;:::-;26927:408;;;26971:2;26955:36;;;26992:12;:10;:12::i;:::-;27006:4;27012:7;27021:5;26955:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;26951:357;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27170:1;27153:6;:13;:18;27149:156;;27176:60;;;;;;;;;;:::i;:::-;;;;;;;;27149:156;27291:6;27285:13;27276:6;27272:2;27268:15;27261:38;26951:357;27072:41;;;27062:51;;;:6;:51;;;;27055:58;;;;;26927:408;27327:4;27320:11;;26799:539;;;;;;;:::o;51105:102::-;51165:13;51190;51183:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51105:102;:::o;14195:552::-;14251:13;14458:1;14449:5;:10;14445:33;;14464:10;;;;;;;;;;;;;;;;;;;;;14445:33;14480:12;14495:5;14480:20;;14503:14;14520:46;14535:1;14527:4;:9;14520:46;;14541:8;;;;;:::i;:::-;;;;14560:2;14552:10;;;;;:::i;:::-;;;14520:46;;;14568:19;14600:6;14590:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14568:39;;14610:110;14626:1;14617:5;:10;14610:110;;14642:1;14632:11;;;;;:::i;:::-;;;14697:2;14689:5;:10;;;;:::i;:::-;14676:2;:24;;;;:::i;:::-;14663:39;;14646:6;14653;14646:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;14714:2;14705:11;;;;;:::i;:::-;;;14610:110;;;14736:6;14722:21;;;;;14195:552;;;;:::o;27838:98::-;;;;:::o;24096:333::-;24182:1;24168:16;;:2;:16;;;24160:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;24233:16;24241:7;24233;:16::i;:::-;24232:17;24224:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;24288:45;24317:1;24321:2;24325:7;24288:20;:45::i;:::-;24356:1;24339:9;:13;24349:2;24339:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;24379:2;24360:7;:16;24368:7;24360:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;24417:7;24413:2;24392:33;;24409:1;24392:33;;;;;;;;;;;;24096:333;;:::o;7729:316::-;7789:4;7966:12;8013:7;8001:20;7993:28;;8040:1;8033:4;:8;8026:15;;;7729:316;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:118::-;4224:24;4242:5;4224:24;:::i;:::-;4219:3;4212:37;4137:118;;:::o;4261:222::-;4354:4;4392:2;4381:9;4377:18;4369:26;;4405:71;4473:1;4462:9;4458:17;4449:6;4405:71;:::i;:::-;4261:222;;;;:::o;4489:122::-;4562:24;4580:5;4562:24;:::i;:::-;4555:5;4552:35;4542:63;;4601:1;4598;4591:12;4542:63;4489:122;:::o;4617:139::-;4663:5;4701:6;4688:20;4679:29;;4717:33;4744:5;4717:33;:::i;:::-;4617:139;;;;:::o;4762:474::-;4830:6;4838;4887:2;4875:9;4866:7;4862:23;4858:32;4855:119;;;4893:79;;:::i;:::-;4855:119;5013:1;5038:53;5083:7;5074:6;5063:9;5059:22;5038:53;:::i;:::-;5028:63;;4984:117;5140:2;5166:53;5211:7;5202:6;5191:9;5187:22;5166:53;:::i;:::-;5156:63;;5111:118;4762:474;;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:117::-;6311:1;6308;6301:12;6325:117;6434:1;6431;6424:12;6448:180;6496:77;6493:1;6486:88;6593:4;6590:1;6583:15;6617:4;6614:1;6607:15;6634:281;6717:27;6739:4;6717:27;:::i;:::-;6709:6;6705:40;6847:6;6835:10;6832:22;6811:18;6799:10;6796:34;6793:62;6790:88;;;6858:18;;:::i;:::-;6790:88;6898:10;6894:2;6887:22;6677:238;6634:281;;:::o;6921:129::-;6955:6;6982:20;;:::i;:::-;6972:30;;7011:33;7039:4;7031:6;7011:33;:::i;:::-;6921:129;;;:::o;7056:308::-;7118:4;7208:18;7200:6;7197:30;7194:56;;;7230:18;;:::i;:::-;7194:56;7268:29;7290:6;7268:29;:::i;:::-;7260:37;;7352:4;7346;7342:15;7334:23;;7056:308;;;:::o;7370:146::-;7467:6;7462:3;7457;7444:30;7508:1;7499:6;7494:3;7490:16;7483:27;7370:146;;;:::o;7522:425::-;7600:5;7625:66;7641:49;7683:6;7641:49;:::i;:::-;7625:66;:::i;:::-;7616:75;;7714:6;7707:5;7700:21;7752:4;7745:5;7741:16;7790:3;7781:6;7776:3;7772:16;7769:25;7766:112;;;7797:79;;:::i;:::-;7766:112;7887:54;7934:6;7929:3;7924;7887:54;:::i;:::-;7606:341;7522:425;;;;;:::o;7967:340::-;8023:5;8072:3;8065:4;8057:6;8053:17;8049:27;8039:122;;8080:79;;:::i;:::-;8039:122;8197:6;8184:20;8222:79;8297:3;8289:6;8282:4;8274:6;8270:17;8222:79;:::i;:::-;8213:88;;8029:278;7967:340;;;;:::o;8313:509::-;8382:6;8431:2;8419:9;8410:7;8406:23;8402:32;8399:119;;;8437:79;;:::i;:::-;8399:119;8585:1;8574:9;8570:17;8557:31;8615:18;8607:6;8604:30;8601:117;;;8637:79;;:::i;:::-;8601:117;8742:63;8797:7;8788:6;8777:9;8773:22;8742:63;:::i;:::-;8732:73;;8528:287;8313:509;;;;:::o;8828:311::-;8905:4;8995:18;8987:6;8984:30;8981:56;;;9017:18;;:::i;:::-;8981:56;9067:4;9059:6;9055:17;9047:25;;9127:4;9121;9117:15;9109:23;;8828:311;;;:::o;9145:117::-;9254:1;9251;9244:12;9285:710;9381:5;9406:81;9422:64;9479:6;9422:64;:::i;:::-;9406:81;:::i;:::-;9397:90;;9507:5;9536:6;9529:5;9522:21;9570:4;9563:5;9559:16;9552:23;;9623:4;9615:6;9611:17;9603:6;9599:30;9652:3;9644:6;9641:15;9638:122;;;9671:79;;:::i;:::-;9638:122;9786:6;9769:220;9803:6;9798:3;9795:15;9769:220;;;9878:3;9907:37;9940:3;9928:10;9907:37;:::i;:::-;9902:3;9895:50;9974:4;9969:3;9965:14;9958:21;;9845:144;9829:4;9824:3;9820:14;9813:21;;9769:220;;;9773:21;9387:608;;9285:710;;;;;:::o;10018:370::-;10089:5;10138:3;10131:4;10123:6;10119:17;10115:27;10105:122;;10146:79;;:::i;:::-;10105:122;10263:6;10250:20;10288:94;10378:3;10370:6;10363:4;10355:6;10351:17;10288:94;:::i;:::-;10279:103;;10095:293;10018:370;;;;:::o;10394:311::-;10471:4;10561:18;10553:6;10550:30;10547:56;;;10583:18;;:::i;:::-;10547:56;10633:4;10625:6;10621:17;10613:25;;10693:4;10687;10683:15;10675:23;;10394:311;;;:::o;10728:710::-;10824:5;10849:81;10865:64;10922:6;10865:64;:::i;:::-;10849:81;:::i;:::-;10840:90;;10950:5;10979:6;10972:5;10965:21;11013:4;11006:5;11002:16;10995:23;;11066:4;11058:6;11054:17;11046:6;11042:30;11095:3;11087:6;11084:15;11081:122;;;11114:79;;:::i;:::-;11081:122;11229:6;11212:220;11246:6;11241:3;11238:15;11212:220;;;11321:3;11350:37;11383:3;11371:10;11350:37;:::i;:::-;11345:3;11338:50;11417:4;11412:3;11408:14;11401:21;;11288:144;11272:4;11267:3;11263:14;11256:21;;11212:220;;;11216:21;10830:608;;10728:710;;;;;:::o;11461:370::-;11532:5;11581:3;11574:4;11566:6;11562:17;11558:27;11548:122;;11589:79;;:::i;:::-;11548:122;11706:6;11693:20;11731:94;11821:3;11813:6;11806:4;11798:6;11794:17;11731:94;:::i;:::-;11722:103;;11538:293;11461:370;;;;:::o;11837:894::-;11955:6;11963;12012:2;12000:9;11991:7;11987:23;11983:32;11980:119;;;12018:79;;:::i;:::-;11980:119;12166:1;12155:9;12151:17;12138:31;12196:18;12188:6;12185:30;12182:117;;;12218:79;;:::i;:::-;12182:117;12323:78;12393:7;12384:6;12373:9;12369:22;12323:78;:::i;:::-;12313:88;;12109:302;12478:2;12467:9;12463:18;12450:32;12509:18;12501:6;12498:30;12495:117;;;12531:79;;:::i;:::-;12495:117;12636:78;12706:7;12697:6;12686:9;12682:22;12636:78;:::i;:::-;12626:88;;12421:303;11837:894;;;;;:::o;12737:116::-;12807:21;12822:5;12807:21;:::i;:::-;12800:5;12797:32;12787:60;;12843:1;12840;12833:12;12787:60;12737:116;:::o;12859:133::-;12902:5;12940:6;12927:20;12918:29;;12956:30;12980:5;12956:30;:::i;:::-;12859:133;;;;:::o;12998:468::-;13063:6;13071;13120:2;13108:9;13099:7;13095:23;13091:32;13088:119;;;13126:79;;:::i;:::-;13088:119;13246:1;13271:53;13316:7;13307:6;13296:9;13292:22;13271:53;:::i;:::-;13261:63;;13217:117;13373:2;13399:50;13441:7;13432:6;13421:9;13417:22;13399:50;:::i;:::-;13389:60;;13344:115;12998:468;;;;;:::o;13472:108::-;13549:24;13567:5;13549:24;:::i;:::-;13544:3;13537:37;13472:108;;:::o;13586:::-;13663:24;13681:5;13663:24;:::i;:::-;13658:3;13651:37;13586:108;;:::o;13778:707::-;13919:4;13914:3;13910:14;14016:4;14009:5;14005:16;13999:23;14035:63;14092:4;14087:3;14083:14;14069:12;14035:63;:::i;:::-;13934:174;14200:4;14193:5;14189:16;14183:23;14219:63;14276:4;14271:3;14267:14;14253:12;14219:63;:::i;:::-;14118:174;14386:4;14379:5;14375:16;14369:23;14405:63;14462:4;14457:3;14453:14;14439:12;14405:63;:::i;:::-;14302:176;13888:597;13778:707;;:::o;14491:310::-;14628:4;14666:2;14655:9;14651:18;14643:26;;14679:115;14791:1;14780:9;14776:17;14767:6;14679:115;:::i;:::-;14491:310;;;;:::o;14807:307::-;14868:4;14958:18;14950:6;14947:30;14944:56;;;14980:18;;:::i;:::-;14944:56;15018:29;15040:6;15018:29;:::i;:::-;15010:37;;15102:4;15096;15092:15;15084:23;;14807:307;;;:::o;15120:423::-;15197:5;15222:65;15238:48;15279:6;15238:48;:::i;:::-;15222:65;:::i;:::-;15213:74;;15310:6;15303:5;15296:21;15348:4;15341:5;15337:16;15386:3;15377:6;15372:3;15368:16;15365:25;15362:112;;;15393:79;;:::i;:::-;15362:112;15483:54;15530:6;15525:3;15520;15483:54;:::i;:::-;15203:340;15120:423;;;;;:::o;15562:338::-;15617:5;15666:3;15659:4;15651:6;15647:17;15643:27;15633:122;;15674:79;;:::i;:::-;15633:122;15791:6;15778:20;15816:78;15890:3;15882:6;15875:4;15867:6;15863:17;15816:78;:::i;:::-;15807:87;;15623:277;15562:338;;;;:::o;15906:943::-;16001:6;16009;16017;16025;16074:3;16062:9;16053:7;16049:23;16045:33;16042:120;;;16081:79;;:::i;:::-;16042:120;16201:1;16226:53;16271:7;16262:6;16251:9;16247:22;16226:53;:::i;:::-;16216:63;;16172:117;16328:2;16354:53;16399:7;16390:6;16379:9;16375:22;16354:53;:::i;:::-;16344:63;;16299:118;16456:2;16482:53;16527:7;16518:6;16507:9;16503:22;16482:53;:::i;:::-;16472:63;;16427:118;16612:2;16601:9;16597:18;16584:32;16643:18;16635:6;16632:30;16629:117;;;16665:79;;:::i;:::-;16629:117;16770:62;16824:7;16815:6;16804:9;16800:22;16770:62;:::i;:::-;16760:72;;16555:287;15906:943;;;;;;;:::o;16855:474::-;16923:6;16931;16980:2;16968:9;16959:7;16955:23;16951:32;16948:119;;;16986:79;;:::i;:::-;16948:119;17106:1;17131:53;17176:7;17167:6;17156:9;17152:22;17131:53;:::i;:::-;17121:63;;17077:117;17233:2;17259:53;17304:7;17295:6;17284:9;17280:22;17259:53;:::i;:::-;17249:63;;17204:118;16855:474;;;;;:::o;17335:180::-;17383:77;17380:1;17373:88;17480:4;17477:1;17470:15;17504:4;17501:1;17494:15;17521:320;17565:6;17602:1;17596:4;17592:12;17582:22;;17649:1;17643:4;17639:12;17670:18;17660:81;;17726:4;17718:6;17714:17;17704:27;;17660:81;17788:2;17780:6;17777:14;17757:18;17754:38;17751:84;;17807:18;;:::i;:::-;17751:84;17572:269;17521:320;;;:::o;17847:231::-;17987:34;17983:1;17975:6;17971:14;17964:58;18056:14;18051:2;18043:6;18039:15;18032:39;17847:231;:::o;18084:366::-;18226:3;18247:67;18311:2;18306:3;18247:67;:::i;:::-;18240:74;;18323:93;18412:3;18323:93;:::i;:::-;18441:2;18436:3;18432:12;18425:19;;18084:366;;;:::o;18456:419::-;18622:4;18660:2;18649:9;18645:18;18637:26;;18709:9;18703:4;18699:20;18695:1;18684:9;18680:17;18673:47;18737:131;18863:4;18737:131;:::i;:::-;18729:139;;18456:419;;;:::o;18881:180::-;18929:77;18926:1;18919:88;19026:4;19023:1;19016:15;19050:4;19047:1;19040:15;19067:194;19107:4;19127:20;19145:1;19127:20;:::i;:::-;19122:25;;19161:20;19179:1;19161:20;:::i;:::-;19156:25;;19205:1;19202;19198:9;19190:17;;19229:1;19223:4;19220:11;19217:37;;;19234:18;;:::i;:::-;19217:37;19067:194;;;;:::o;19267:220::-;19407:34;19403:1;19395:6;19391:14;19384:58;19476:3;19471:2;19463:6;19459:15;19452:28;19267:220;:::o;19493:366::-;19635:3;19656:67;19720:2;19715:3;19656:67;:::i;:::-;19649:74;;19732:93;19821:3;19732:93;:::i;:::-;19850:2;19845:3;19841:12;19834:19;;19493:366;;;:::o;19865:419::-;20031:4;20069:2;20058:9;20054:18;20046:26;;20118:9;20112:4;20108:20;20104:1;20093:9;20089:17;20082:47;20146:131;20272:4;20146:131;:::i;:::-;20138:139;;19865:419;;;:::o;20290:243::-;20430:34;20426:1;20418:6;20414:14;20407:58;20499:26;20494:2;20486:6;20482:15;20475:51;20290:243;:::o;20539:366::-;20681:3;20702:67;20766:2;20761:3;20702:67;:::i;:::-;20695:74;;20778:93;20867:3;20778:93;:::i;:::-;20896:2;20891:3;20887:12;20880:19;;20539:366;;;:::o;20911:419::-;21077:4;21115:2;21104:9;21100:18;21092:26;;21164:9;21158:4;21154:20;21150:1;21139:9;21135:17;21128:47;21192:131;21318:4;21192:131;:::i;:::-;21184:139;;20911:419;;;:::o;21336:236::-;21476:34;21472:1;21464:6;21460:14;21453:58;21545:19;21540:2;21532:6;21528:15;21521:44;21336:236;:::o;21578:366::-;21720:3;21741:67;21805:2;21800:3;21741:67;:::i;:::-;21734:74;;21817:93;21906:3;21817:93;:::i;:::-;21935:2;21930:3;21926:12;21919:19;;21578:366;;;:::o;21950:419::-;22116:4;22154:2;22143:9;22139:18;22131:26;;22203:9;22197:4;22193:20;22189:1;22178:9;22174:17;22167:47;22231:131;22357:4;22231:131;:::i;:::-;22223:139;;21950:419;;;:::o;22375:182::-;22515:34;22511:1;22503:6;22499:14;22492:58;22375:182;:::o;22563:366::-;22705:3;22726:67;22790:2;22785:3;22726:67;:::i;:::-;22719:74;;22802:93;22891:3;22802:93;:::i;:::-;22920:2;22915:3;22911:12;22904:19;;22563:366;;;:::o;22935:419::-;23101:4;23139:2;23128:9;23124:18;23116:26;;23188:9;23182:4;23178:20;23174:1;23163:9;23159:17;23152:47;23216:131;23342:4;23216:131;:::i;:::-;23208:139;;22935:419;;;:::o;23360:174::-;23500:26;23496:1;23488:6;23484:14;23477:50;23360:174;:::o;23540:366::-;23682:3;23703:67;23767:2;23762:3;23703:67;:::i;:::-;23696:74;;23779:93;23868:3;23779:93;:::i;:::-;23897:2;23892:3;23888:12;23881:19;;23540:366;;;:::o;23912:419::-;24078:4;24116:2;24105:9;24101:18;24093:26;;24165:9;24159:4;24155:20;24151:1;24140:9;24136:17;24129:47;24193:131;24319:4;24193:131;:::i;:::-;24185:139;;23912:419;;;:::o;24337:168::-;24477:20;24473:1;24465:6;24461:14;24454:44;24337:168;:::o;24511:366::-;24653:3;24674:67;24738:2;24733:3;24674:67;:::i;:::-;24667:74;;24750:93;24839:3;24750:93;:::i;:::-;24868:2;24863:3;24859:12;24852:19;;24511:366;;;:::o;24883:419::-;25049:4;25087:2;25076:9;25072:18;25064:26;;25136:9;25130:4;25126:20;25122:1;25111:9;25107:17;25100:47;25164:131;25290:4;25164:131;:::i;:::-;25156:139;;24883:419;;;:::o;25308:180::-;25356:77;25353:1;25346:88;25453:4;25450:1;25443:15;25477:4;25474:1;25467:15;25494:227;25634:34;25630:1;25622:6;25618:14;25611:58;25703:10;25698:2;25690:6;25686:15;25679:35;25494:227;:::o;25727:366::-;25869:3;25890:67;25954:2;25949:3;25890:67;:::i;:::-;25883:74;;25966:93;26055:3;25966:93;:::i;:::-;26084:2;26079:3;26075:12;26068:19;;25727:366;;;:::o;26099:419::-;26265:4;26303:2;26292:9;26288:18;26280:26;;26352:9;26346:4;26342:20;26338:1;26327:9;26323:17;26316:47;26380:131;26506:4;26380:131;:::i;:::-;26372:139;;26099:419;;;:::o;26524:141::-;26573:4;26596:3;26588:11;;26619:3;26616:1;26609:14;26653:4;26650:1;26640:18;26632:26;;26524:141;;;:::o;26671:93::-;26708:6;26755:2;26750;26743:5;26739:14;26735:23;26725:33;;26671:93;;;:::o;26770:107::-;26814:8;26864:5;26858:4;26854:16;26833:37;;26770:107;;;;:::o;26883:393::-;26952:6;27002:1;26990:10;26986:18;27025:97;27055:66;27044:9;27025:97;:::i;:::-;27143:39;27173:8;27162:9;27143:39;:::i;:::-;27131:51;;27215:4;27211:9;27204:5;27200:21;27191:30;;27264:4;27254:8;27250:19;27243:5;27240:30;27230:40;;26959:317;;26883:393;;;;;:::o;27282:60::-;27310:3;27331:5;27324:12;;27282:60;;;:::o;27348:142::-;27398:9;27431:53;27449:34;27458:24;27476:5;27458:24;:::i;:::-;27449:34;:::i;:::-;27431:53;:::i;:::-;27418:66;;27348:142;;;:::o;27496:75::-;27539:3;27560:5;27553:12;;27496:75;;;:::o;27577:269::-;27687:39;27718:7;27687:39;:::i;:::-;27748:91;27797:41;27821:16;27797:41;:::i;:::-;27789:6;27782:4;27776:11;27748:91;:::i;:::-;27742:4;27735:105;27653:193;27577:269;;;:::o;27852:73::-;27897:3;27852:73;:::o;27931:189::-;28008:32;;:::i;:::-;28049:65;28107:6;28099;28093:4;28049:65;:::i;:::-;27984:136;27931:189;;:::o;28126:186::-;28186:120;28203:3;28196:5;28193:14;28186:120;;;28257:39;28294:1;28287:5;28257:39;:::i;:::-;28230:1;28223:5;28219:13;28210:22;;28186:120;;;28126:186;;:::o;28318:543::-;28419:2;28414:3;28411:11;28408:446;;;28453:38;28485:5;28453:38;:::i;:::-;28537:29;28555:10;28537:29;:::i;:::-;28527:8;28523:44;28720:2;28708:10;28705:18;28702:49;;;28741:8;28726:23;;28702:49;28764:80;28820:22;28838:3;28820:22;:::i;:::-;28810:8;28806:37;28793:11;28764:80;:::i;:::-;28423:431;;28408:446;28318:543;;;:::o;28867:117::-;28921:8;28971:5;28965:4;28961:16;28940:37;;28867:117;;;;:::o;28990:169::-;29034:6;29067:51;29115:1;29111:6;29103:5;29100:1;29096:13;29067:51;:::i;:::-;29063:56;29148:4;29142;29138:15;29128:25;;29041:118;28990:169;;;;:::o;29164:295::-;29240:4;29386:29;29411:3;29405:4;29386:29;:::i;:::-;29378:37;;29448:3;29445:1;29441:11;29435:4;29432:21;29424:29;;29164:295;;;;:::o;29464:1395::-;29581:37;29614:3;29581:37;:::i;:::-;29683:18;29675:6;29672:30;29669:56;;;29705:18;;:::i;:::-;29669:56;29749:38;29781:4;29775:11;29749:38;:::i;:::-;29834:67;29894:6;29886;29880:4;29834:67;:::i;:::-;29928:1;29952:4;29939:17;;29984:2;29976:6;29973:14;30001:1;29996:618;;;;30658:1;30675:6;30672:77;;;30724:9;30719:3;30715:19;30709:26;30700:35;;30672:77;30775:67;30835:6;30828:5;30775:67;:::i;:::-;30769:4;30762:81;30631:222;29966:887;;29996:618;30048:4;30044:9;30036:6;30032:22;30082:37;30114:4;30082:37;:::i;:::-;30141:1;30155:208;30169:7;30166:1;30163:14;30155:208;;;30248:9;30243:3;30239:19;30233:26;30225:6;30218:42;30299:1;30291:6;30287:14;30277:24;;30346:2;30335:9;30331:18;30318:31;;30192:4;30189:1;30185:12;30180:17;;30155:208;;;30391:6;30382:7;30379:19;30376:179;;;30449:9;30444:3;30440:19;30434:26;30492:48;30534:4;30526:6;30522:17;30511:9;30492:48;:::i;:::-;30484:6;30477:64;30399:156;30376:179;30601:1;30597;30589:6;30585:14;30581:22;30575:4;30568:36;30003:611;;;29966:887;;29556:1303;;;29464:1395;;:::o;30865:228::-;31005:34;31001:1;30993:6;30989:14;30982:58;31074:11;31069:2;31061:6;31057:15;31050:36;30865:228;:::o;31099:366::-;31241:3;31262:67;31326:2;31321:3;31262:67;:::i;:::-;31255:74;;31338:93;31427:3;31338:93;:::i;:::-;31456:2;31451:3;31447:12;31440:19;;31099:366;;;:::o;31471:419::-;31637:4;31675:2;31664:9;31660:18;31652:26;;31724:9;31718:4;31714:20;31710:1;31699:9;31695:17;31688:47;31752:131;31878:4;31752:131;:::i;:::-;31744:139;;31471:419;;;:::o;31896:181::-;32036:33;32032:1;32024:6;32020:14;32013:57;31896:181;:::o;32083:366::-;32225:3;32246:67;32310:2;32305:3;32246:67;:::i;:::-;32239:74;;32322:93;32411:3;32322:93;:::i;:::-;32440:2;32435:3;32431:12;32424:19;;32083:366;;;:::o;32455:419::-;32621:4;32659:2;32648:9;32644:18;32636:26;;32708:9;32702:4;32698:20;32694:1;32683:9;32679:17;32672:47;32736:131;32862:4;32736:131;:::i;:::-;32728:139;;32455:419;;;:::o;32880:166::-;33020:18;33016:1;33008:6;33004:14;32997:42;32880:166;:::o;33052:366::-;33194:3;33215:67;33279:2;33274:3;33215:67;:::i;:::-;33208:74;;33291:93;33380:3;33291:93;:::i;:::-;33409:2;33404:3;33400:12;33393:19;;33052:366;;;:::o;33424:419::-;33590:4;33628:2;33617:9;33613:18;33605:26;;33677:9;33671:4;33667:20;33663:1;33652:9;33648:17;33641:47;33705:131;33831:4;33705:131;:::i;:::-;33697:139;;33424:419;;;:::o;33849:223::-;33989:34;33985:1;33977:6;33973:14;33966:58;34058:6;34053:2;34045:6;34041:15;34034:31;33849:223;:::o;34078:366::-;34220:3;34241:67;34305:2;34300:3;34241:67;:::i;:::-;34234:74;;34317:93;34406:3;34317:93;:::i;:::-;34435:2;34430:3;34426:12;34419:19;;34078:366;;;:::o;34450:419::-;34616:4;34654:2;34643:9;34639:18;34631:26;;34703:9;34697:4;34693:20;34689:1;34678:9;34674:17;34667:47;34731:131;34857:4;34731:131;:::i;:::-;34723:139;;34450:419;;;:::o;34875:221::-;35015:34;35011:1;35003:6;34999:14;34992:58;35084:4;35079:2;35071:6;35067:15;35060:29;34875:221;:::o;35102:366::-;35244:3;35265:67;35329:2;35324:3;35265:67;:::i;:::-;35258:74;;35341:93;35430:3;35341:93;:::i;:::-;35459:2;35454:3;35450:12;35443:19;;35102:366;;;:::o;35474:419::-;35640:4;35678:2;35667:9;35663:18;35655:26;;35727:9;35721:4;35717:20;35713:1;35702:9;35698:17;35691:47;35755:131;35881:4;35755:131;:::i;:::-;35747:139;;35474:419;;;:::o;35899:227::-;36039:34;36035:1;36027:6;36023:14;36016:58;36108:10;36103:2;36095:6;36091:15;36084:35;35899:227;:::o;36132:366::-;36274:3;36295:67;36359:2;36354:3;36295:67;:::i;:::-;36288:74;;36371:93;36460:3;36371:93;:::i;:::-;36489:2;36484:3;36480:12;36473:19;;36132:366;;;:::o;36504:419::-;36670:4;36708:2;36697:9;36693:18;36685:26;;36757:9;36751:4;36747:20;36743:1;36732:9;36728:17;36721:47;36785:131;36911:4;36785:131;:::i;:::-;36777:139;;36504:419;;;:::o;36929:229::-;37069:34;37065:1;37057:6;37053:14;37046:58;37138:12;37133:2;37125:6;37121:15;37114:37;36929:229;:::o;37164:366::-;37306:3;37327:67;37391:2;37386:3;37327:67;:::i;:::-;37320:74;;37403:93;37492:3;37403:93;:::i;:::-;37521:2;37516:3;37512:12;37505:19;;37164:366;;;:::o;37536:419::-;37702:4;37740:2;37729:9;37725:18;37717:26;;37789:9;37783:4;37779:20;37775:1;37764:9;37760:17;37753:47;37817:131;37943:4;37817:131;:::i;:::-;37809:139;;37536:419;;;:::o;37961:221::-;38101:34;38097:1;38089:6;38085:14;38078:58;38170:4;38165:2;38157:6;38153:15;38146:29;37961:221;:::o;38188:366::-;38330:3;38351:67;38415:2;38410:3;38351:67;:::i;:::-;38344:74;;38427:93;38516:3;38427:93;:::i;:::-;38545:2;38540:3;38536:12;38529:19;;38188:366;;;:::o;38560:419::-;38726:4;38764:2;38753:9;38749:18;38741:26;;38813:9;38807:4;38803:20;38799:1;38788:9;38784:17;38777:47;38841:131;38967:4;38841:131;:::i;:::-;38833:139;;38560:419;;;:::o;38985:173::-;39125:25;39121:1;39113:6;39109:14;39102:49;38985:173;:::o;39164:366::-;39306:3;39327:67;39391:2;39386:3;39327:67;:::i;:::-;39320:74;;39403:93;39492:3;39403:93;:::i;:::-;39521:2;39516:3;39512:12;39505:19;;39164:366;;;:::o;39536:419::-;39702:4;39740:2;39729:9;39725:18;39717:26;;39789:9;39783:4;39779:20;39775:1;39764:9;39760:17;39753:47;39817:131;39943:4;39817:131;:::i;:::-;39809:139;;39536:419;;;:::o;39961:220::-;40101:34;40097:1;40089:6;40085:14;40078:58;40170:3;40165:2;40157:6;40153:15;40146:28;39961:220;:::o;40187:366::-;40329:3;40350:67;40414:2;40409:3;40350:67;:::i;:::-;40343:74;;40426:93;40515:3;40426:93;:::i;:::-;40544:2;40539:3;40535:12;40528:19;;40187:366;;;:::o;40559:419::-;40725:4;40763:2;40752:9;40748:18;40740:26;;40812:9;40806:4;40802:20;40798:1;40787:9;40783:17;40776:47;40840:131;40966:4;40840:131;:::i;:::-;40832:139;;40559:419;;;:::o;40984:173::-;41124:25;41120:1;41112:6;41108:14;41101:49;40984:173;:::o;41163:366::-;41305:3;41326:67;41390:2;41385:3;41326:67;:::i;:::-;41319:74;;41402:93;41491:3;41402:93;:::i;:::-;41520:2;41515:3;41511:12;41504:19;;41163:366;;;:::o;41535:419::-;41701:4;41739:2;41728:9;41724:18;41716:26;;41788:9;41782:4;41778:20;41774:1;41763:9;41759:17;41752:47;41816:131;41942:4;41816:131;:::i;:::-;41808:139;;41535:419;;;:::o;41960:191::-;42000:3;42019:20;42037:1;42019:20;:::i;:::-;42014:25;;42053:20;42071:1;42053:20;:::i;:::-;42048:25;;42096:1;42093;42089:9;42082:16;;42117:3;42114:1;42111:10;42108:36;;;42124:18;;:::i;:::-;42108:36;41960:191;;;;:::o;42157:148::-;42259:11;42296:3;42281:18;;42157:148;;;;:::o;42311:390::-;42417:3;42445:39;42478:5;42445:39;:::i;:::-;42500:89;42582:6;42577:3;42500:89;:::i;:::-;42493:96;;42598:65;42656:6;42651:3;42644:4;42637:5;42633:16;42598:65;:::i;:::-;42688:6;42683:3;42679:16;42672:23;;42421:280;42311:390;;;;:::o;42707:155::-;42847:7;42843:1;42835:6;42831:14;42824:31;42707:155;:::o;42868:400::-;43028:3;43049:84;43131:1;43126:3;43049:84;:::i;:::-;43042:91;;43142:93;43231:3;43142:93;:::i;:::-;43260:1;43255:3;43251:11;43244:18;;42868:400;;;:::o;43274:541::-;43507:3;43529:95;43620:3;43611:6;43529:95;:::i;:::-;43522:102;;43641:148;43785:3;43641:148;:::i;:::-;43634:155;;43806:3;43799:10;;43274:541;;;;:::o;43821:225::-;43961:34;43957:1;43949:6;43945:14;43938:58;44030:8;44025:2;44017:6;44013:15;44006:33;43821:225;:::o;44052:366::-;44194:3;44215:67;44279:2;44274:3;44215:67;:::i;:::-;44208:74;;44291:93;44380:3;44291:93;:::i;:::-;44409:2;44404:3;44400:12;44393:19;;44052:366;;;:::o;44424:419::-;44590:4;44628:2;44617:9;44613:18;44605:26;;44677:9;44671:4;44667:20;44663:1;44652:9;44648:17;44641:47;44705:131;44831:4;44705:131;:::i;:::-;44697:139;;44424:419;;;:::o;44849:231::-;44989:34;44985:1;44977:6;44973:14;44966:58;45058:14;45053:2;45045:6;45041:15;45034:39;44849:231;:::o;45086:366::-;45228:3;45249:67;45313:2;45308:3;45249:67;:::i;:::-;45242:74;;45325:93;45414:3;45325:93;:::i;:::-;45443:2;45438:3;45434:12;45427:19;;45086:366;;;:::o;45458:419::-;45624:4;45662:2;45651:9;45647:18;45639:26;;45711:9;45705:4;45701:20;45697:1;45686:9;45682:17;45675:47;45739:131;45865:4;45739:131;:::i;:::-;45731:139;;45458:419;;;:::o;45883:228::-;46023:34;46019:1;46011:6;46007:14;46000:58;46092:11;46087:2;46079:6;46075:15;46068:36;45883:228;:::o;46117:366::-;46259:3;46280:67;46344:2;46339:3;46280:67;:::i;:::-;46273:74;;46356:93;46445:3;46356:93;:::i;:::-;46474:2;46469:3;46465:12;46458:19;;46117:366;;;:::o;46489:419::-;46655:4;46693:2;46682:9;46678:18;46670:26;;46742:9;46736:4;46732:20;46728:1;46717:9;46713:17;46706:47;46770:131;46896:4;46770:131;:::i;:::-;46762:139;;46489:419;;;:::o;46914:223::-;47054:34;47050:1;47042:6;47038:14;47031:58;47123:6;47118:2;47110:6;47106:15;47099:31;46914:223;:::o;47143:366::-;47285:3;47306:67;47370:2;47365:3;47306:67;:::i;:::-;47299:74;;47382:93;47471:3;47382:93;:::i;:::-;47500:2;47495:3;47491:12;47484:19;;47143:366;;;:::o;47515:419::-;47681:4;47719:2;47708:9;47704:18;47696:26;;47768:9;47762:4;47758:20;47754:1;47743:9;47739:17;47732:47;47796:131;47922:4;47796:131;:::i;:::-;47788:139;;47515:419;;;:::o;47940:170::-;48080:22;48076:1;48068:6;48064:14;48057:46;47940:170;:::o;48116:366::-;48258:3;48279:67;48343:2;48338:3;48279:67;:::i;:::-;48272:74;;48355:93;48444:3;48355:93;:::i;:::-;48473:2;48468:3;48464:12;48457:19;;48116:366;;;:::o;48488:419::-;48654:4;48692:2;48681:9;48677:18;48669:26;;48741:9;48735:4;48731:20;48727:1;48716:9;48712:17;48705:47;48769:131;48895:4;48769:131;:::i;:::-;48761:139;;48488:419;;;:::o;48913:175::-;49053:27;49049:1;49041:6;49037:14;49030:51;48913:175;:::o;49094:366::-;49236:3;49257:67;49321:2;49316:3;49257:67;:::i;:::-;49250:74;;49333:93;49422:3;49333:93;:::i;:::-;49451:2;49446:3;49442:12;49435:19;;49094:366;;;:::o;49466:419::-;49632:4;49670:2;49659:9;49655:18;49647:26;;49719:9;49713:4;49709:20;49705:1;49694:9;49690:17;49683:47;49747:131;49873:4;49747:131;:::i;:::-;49739:139;;49466:419;;;:::o;49891:237::-;50031:34;50027:1;50019:6;50015:14;50008:58;50100:20;50095:2;50087:6;50083:15;50076:45;49891:237;:::o;50134:366::-;50276:3;50297:67;50361:2;50356:3;50297:67;:::i;:::-;50290:74;;50373:93;50462:3;50373:93;:::i;:::-;50491:2;50486:3;50482:12;50475:19;;50134:366;;;:::o;50506:419::-;50672:4;50710:2;50699:9;50695:18;50687:26;;50759:9;50753:4;50749:20;50745:1;50734:9;50730:17;50723:47;50787:131;50913:4;50787:131;:::i;:::-;50779:139;;50506:419;;;:::o;50931:234::-;51071:34;51067:1;51059:6;51055:14;51048:58;51140:17;51135:2;51127:6;51123:15;51116:42;50931:234;:::o;51171:366::-;51313:3;51334:67;51398:2;51393:3;51334:67;:::i;:::-;51327:74;;51410:93;51499:3;51410:93;:::i;:::-;51528:2;51523:3;51519:12;51512:19;;51171:366;;;:::o;51543:419::-;51709:4;51747:2;51736:9;51732:18;51724:26;;51796:9;51790:4;51786:20;51782:1;51771:9;51767:17;51760:47;51824:131;51950:4;51824:131;:::i;:::-;51816:139;;51543:419;;;:::o;51968:435::-;52148:3;52170:95;52261:3;52252:6;52170:95;:::i;:::-;52163:102;;52282:95;52373:3;52364:6;52282:95;:::i;:::-;52275:102;;52394:3;52387:10;;51968:435;;;;;:::o;52409:98::-;52460:6;52494:5;52488:12;52478:22;;52409:98;;;:::o;52513:168::-;52596:11;52630:6;52625:3;52618:19;52670:4;52665:3;52661:14;52646:29;;52513:168;;;;:::o;52687:373::-;52773:3;52801:38;52833:5;52801:38;:::i;:::-;52855:70;52918:6;52913:3;52855:70;:::i;:::-;52848:77;;52934:65;52992:6;52987:3;52980:4;52973:5;52969:16;52934:65;:::i;:::-;53024:29;53046:6;53024:29;:::i;:::-;53019:3;53015:39;53008:46;;52777:283;52687:373;;;;:::o;53066:640::-;53261:4;53299:3;53288:9;53284:19;53276:27;;53313:71;53381:1;53370:9;53366:17;53357:6;53313:71;:::i;:::-;53394:72;53462:2;53451:9;53447:18;53438:6;53394:72;:::i;:::-;53476;53544:2;53533:9;53529:18;53520:6;53476:72;:::i;:::-;53595:9;53589:4;53585:20;53580:2;53569:9;53565:18;53558:48;53623:76;53694:4;53685:6;53623:76;:::i;:::-;53615:84;;53066:640;;;;;;;:::o;53712:141::-;53768:5;53799:6;53793:13;53784:22;;53815:32;53841:5;53815:32;:::i;:::-;53712:141;;;;:::o;53859:349::-;53928:6;53977:2;53965:9;53956:7;53952:23;53948:32;53945:119;;;53983:79;;:::i;:::-;53945:119;54103:1;54128:63;54183:7;54174:6;54163:9;54159:22;54128:63;:::i;:::-;54118:73;;54074:127;53859:349;;;;:::o;54214:233::-;54253:3;54276:24;54294:5;54276:24;:::i;:::-;54267:33;;54322:66;54315:5;54312:77;54309:103;;54392:18;;:::i;:::-;54309:103;54439:1;54432:5;54428:13;54421:20;;54214:233;;;:::o;54453:180::-;54501:77;54498:1;54491:88;54598:4;54595:1;54588:15;54622:4;54619:1;54612:15;54639:185;54679:1;54696:20;54714:1;54696:20;:::i;:::-;54691:25;;54730:20;54748:1;54730:20;:::i;:::-;54725:25;;54769:1;54759:35;;54774:18;;:::i;:::-;54759:35;54816:1;54813;54809:9;54804:14;;54639:185;;;;:::o;54830:176::-;54862:1;54879:20;54897:1;54879:20;:::i;:::-;54874:25;;54913:20;54931:1;54913:20;:::i;:::-;54908:25;;54952:1;54942:35;;54957:18;;:::i;:::-;54942:35;54998:1;54995;54991:9;54986:14;;54830:176;;;;:::o;55012:182::-;55152:34;55148:1;55140:6;55136:14;55129:58;55012:182;:::o;55200:366::-;55342:3;55363:67;55427:2;55422:3;55363:67;:::i;:::-;55356:74;;55439:93;55528:3;55439:93;:::i;:::-;55557:2;55552:3;55548:12;55541:19;;55200:366;;;:::o;55572:419::-;55738:4;55776:2;55765:9;55761:18;55753:26;;55825:9;55819:4;55815:20;55811:1;55800:9;55796:17;55789:47;55853:131;55979:4;55853:131;:::i;:::-;55845:139;;55572:419;;;:::o;55997:178::-;56137:30;56133:1;56125:6;56121:14;56114:54;55997:178;:::o;56181:366::-;56323:3;56344:67;56408:2;56403:3;56344:67;:::i;:::-;56337:74;;56420:93;56509:3;56420:93;:::i;:::-;56538:2;56533:3;56529:12;56522:19;;56181:366;;;:::o;56553:419::-;56719:4;56757:2;56746:9;56742:18;56734:26;;56806:9;56800:4;56796:20;56792:1;56781:9;56777:17;56770:47;56834:131;56960:4;56834:131;:::i;:::-;56826:139;;56553:419;;;:::o
Swarm Source
ipfs://6ef43f01678f91da8851d2664ae40b639d42db04cd218a6ed12481b3edaea034
Loading...
Loading
Loading...
Loading
[ 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.