Token Killer GF

NFT  
 

Overview [ERC-721]

Max Total Supply:
7,777 KGF

Holders:
3,877

Transfers:
-

 
Loading
[ Download CSV Export  ] 
Loading
[ Download CSV Export  ] 
Loading

OVERVIEW

Killer GF is a 7,777 generative portrait art collection by a former Riot Games Artist, Zeronis, with over 240 meticulously designed features that contrasts cute and aesthetically appealing girlfriends that also happen to be dangerous assassins.

# Exchange Pair Price  24H Volume % Volume
Loading

Contract Source Code Verified (Exact Match)

Contract Name:
KillerGF

Compiler Version
v0.8.8+commit.dddeac2f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-25
*/

//             ((((((((((((((((((.                                             
//         ((((((((((((((((((((((((((*                                         
//      /(((((((((((((((((((((((((((((((*                                      
//     ((((((((((((#             #(((((((((                                    
//   (((((((((((                     ((((((((((((((((((((((,                   
//   ((((((((#         ((((((((((       (((((((((((((((((((((((((              
//  *(((((((       #(((((((((((((((((               /(((((((((((((((           
//  *((((((/     #((((((#        .((((((                 .((((((((((((.        
//   ((((((.    ((((((               #(((((((((((((#         (((((((((((       
//   ((((((/    ((((/                         .((((((((.      .((((((((((      
//   *((((((    ((((                              (((((((       ((((((((((     
//    ((((((,   ,(((.                               ((((((      .(((((((((     
//     ((((((    ((((                                (((((*      (((((((((     
//      ((((((    ((((                              ((((((      #(((((((((     
//       ((((((    #(((                            #(((((      ((((((((((      
//        ((((((/   .(((.                        ((((((,      ((((((((((       
//          ((((((    ((((                    (((((((       ((((((((((         
//           ((((((    /(((             ,((((((((        ((((((((((/           
//            /(((((#    ((((     ((((((((((         #(((((((((((              
//              ((((((    ((((((((((((          #((((((((((((*                 
//               ((((((/    ((,           (((((((((((((((                      
//                 ((((((          ,(((((((((((((((/                           
//                  ((((((*(((((((((((((((((((                                 
//                   ,(((((((((((((((((*                                       
//                     (((((((((,  
//           
// Killer GF by Zeronis and uwulabs                                  
// Made with love <3                                            


// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        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");

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (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");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

    function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private 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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

/*
 * @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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant alphabet = "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] = alphabet[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

}

/**
 * @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;
}


/**
 * @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);
}

/**
 * @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);
}


/**
 * @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 the {IERC721Receiver} interface.
 *
 * Accepts all token transfers.
 * Make sure the contract is able to use its token with {IERC721-safeTransferFrom}, {IERC721-approve} or {IERC721-setApprovalForAll}.
 */
contract ERC721Holder is IERC721Receiver {
    /**
     * @dev See {IERC721Receiver-onERC721Received}.
     *
     * Always returns `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address,
        address,
        uint256,
        bytes memory
    ) public virtual override returns (bytes4) {
        return this.onERC721Received.selector;
    }
}

/**
 * @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, ERC721Holder {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Supply of token.
    uint256 public totalSupply;    

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        uint256[] memory ids = new uint256[](1);
        ids[0] = tokenId;
        _mintNFTs(to, ids);
    }

    function _mintNFTs(address to, uint256[] memory tokenIds) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");

        uint256 _totalSupply = totalSupply;
        uint256 _length = tokenIds.length;

        totalSupply = _totalSupply + _length;
        _balances[to] += _length;
        
        for (uint256 i; i < _length; ++i) {
            uint256 tokenId = tokenIds[i];
            require(!_exists(tokenId), "ERC721: token already minted");
            _beforeTokenTransfer(address(0), to, tokenId);

            _owners[tokenId] = to;
            emit Transfer(address(0), to, tokenId);
        }
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

/**
 * @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() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

interface IGetRoyalties {
  function getRoyalties(uint256 tokenId)
    external
    view
    returns (address payable[] memory recipients, uint256[] memory feesInBasisPoints);
}

/**
 * @notice An interface for communicating fees to 3rd party marketplaces.
 * @dev Originally implemented in mainnet contract 0x44d6e8933f8271abcf253c72f9ed7e0e4c0323b3
 */
interface IGetFees {
  function getFeeRecipients(uint256 id) external view returns (address payable[] memory);

  function getFeeBps(uint256 id) external view returns (uint256[] memory);
}

interface ITokenCreator {
  function tokenCreator(uint256 tokenId) external view returns (address payable);
}

interface ITokenCreatorPaymentAddress {
  function getTokenCreatorPaymentAddress(uint256 tokenId)
    external
    view
    returns (address payable tokenCreatorPaymentAddress);
}

contract KillerGF is Ownable, IGetRoyalties, IGetFees, ITokenCreator, ITokenCreatorPaymentAddress, ERC721 {
  uint256 public immutable MAX_SUPPLY;

  address public saleContract;

  string public baseURI;

  /**
   * @dev Stores an optional alternate address to receive creator revenue and royalty payments.
   * The target address may be a contract which could split or escrow payments.
   */
  address payable private _creatorPaymentAddress;
  address payable private _tokenCreator;

  uint256 private _royaltyInBasisPoints = 300;

  constructor(string memory _name, string memory _symbol, uint256 maxSupply) Ownable() ERC721(_name, _symbol) {
    MAX_SUPPLY = maxSupply;
  }

  function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
    if (
      interfaceId == type(IGetRoyalties).interfaceId ||
      interfaceId == type(ITokenCreator).interfaceId ||
      interfaceId == type(ITokenCreatorPaymentAddress).interfaceId ||
      interfaceId == type(IGetFees).interfaceId
    ) {
      return true;
    }
    return super.supportsInterface(interfaceId);
  }

  function mintNFTs(address to, uint256[] memory tokenIds) public virtual {
    require(msg.sender == saleContract, "Nice try lol");
    uint256 length = tokenIds.length;
    for (uint256 i; i < length; ++i) {
      require(tokenIds[i] != 0 && tokenIds[i] <= MAX_SUPPLY, "ID > MAX_SUPPLY");
    }
    _mintNFTs(to, tokenIds);
  }

  function prepareSale(address _saleContract) public onlyOwner {
    require(saleContract == address(0), "Immutable");
    saleContract = _saleContract;
  }

  function renounceMinting() public onlyOwner {
    saleContract = 0x000000000000000000000000000000000000dEaD;
  }

  function setTokenCreator(address payable newCreator) external onlyOwner {
    _tokenCreator = newCreator;
  }

  function setTokenCreatorPaymentAddress(address payable tokenCreatorPaymentAddress) external onlyOwner {
    _creatorPaymentAddress = tokenCreatorPaymentAddress;
  }

  function setRoyaltyInBasisPoints(uint256 royaltyInBasisPoints) external onlyOwner {
    _royaltyInBasisPoints = royaltyInBasisPoints;
  }

  function setBaseURI(string memory newURI) public onlyOwner {
    baseURI = newURI;
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }

  /**
   * @notice Returns an array of recipient addresses to which royalties for secondary sales should be sent.
   * The expected royalty amount is communicated with `getFeeBps`.
   */
  function getFeeRecipients(uint256 /*id*/) external view returns (address payable[] memory recipients) {
    recipients = new address payable[](1);
    recipients[0] = _creatorPaymentAddress;
  }

  /**
   * @notice Returns an array of royalties to be sent for secondary sales in basis points.
   * The expected recipients is communicated with `getFeeRecipients`.
   */
  function getFeeBps(
    uint256 /* id */
  ) external view returns (uint256[] memory feesInBasisPoints) {
    feesInBasisPoints = new uint256[](1);
    feesInBasisPoints[0] = _royaltyInBasisPoints;
  }

  /**
   * @notice Returns an array of royalties to be sent for secondary sales.
   */
  function getRoyalties(uint256 /*tokenId*/)
    external
    view
    returns (address payable[] memory recipients, uint256[] memory feesInBasisPoints)
  {
    recipients = new address payable[](1);
    recipients[0] = _creatorPaymentAddress;
    feesInBasisPoints = new uint256[](1);
    feesInBasisPoints[0] = _royaltyInBasisPoints;
  }

  /**
   * @notice Returns the creator for an NFT, which is always the collection owner.
   */
  function tokenCreator(
    uint256 /* tokenId */
  ) external view returns (address payable) {
    return _tokenCreator;
  }

  /**
   * @notice Returns the desired payment address to be used for any transfers to the creator.
   * @dev The payment address may be assigned for each individual NFT, if not defined the collection owner is returned.
   */
  function getTokenCreatorPaymentAddress(uint256 /* tokenId */)
    public
    view
    returns (address payable)
  {
    return _creatorPaymentAddress;
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeBps","outputs":[{"internalType":"uint256[]","name":"feesInBasisPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getFeeRecipients","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getRoyalties","outputs":[{"internalType":"address payable[]","name":"recipients","type":"address[]"},{"internalType":"uint256[]","name":"feesInBasisPoints","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getTokenCreatorPaymentAddress","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mintNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"bytes","name":"","type":"bytes"}],"name":"onERC721Received","outputs":[{"internalType":"bytes4","name":"","type":"bytes4"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_saleContract","type":"address"}],"name":"prepareSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"newURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"royaltyInBasisPoints","type":"uint256"}],"name":"setRoyaltyInBasisPoints","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"newCreator","type":"address"}],"name":"setTokenCreator","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"tokenCreatorPaymentAddress","type":"address"}],"name":"setTokenCreatorPaymentAddress","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":"","type":"uint256"}],"name":"tokenCreator","outputs":[{"internalType":"address payable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60a060405261012c600c553480156200001757600080fd5b50604051620046263803806200462683398181016040528101906200003d9190620003c4565b82826000620000516200013460201b60201c565b9050806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3508160019080519060200190620001079291906200013c565b508060029080519060200190620001209291906200013c565b5050508060808181525050505050620004c3565b600033905090565b8280546200014a906200048d565b90600052602060002090601f0160209004810192826200016e5760008555620001ba565b82601f106200018957805160ff1916838001178555620001ba565b82800160010185558215620001ba579182015b82811115620001b95782518255916020019190600101906200019c565b5b509050620001c99190620001cd565b5090565b5b80821115620001e8576000816000905550600101620001ce565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000255826200020a565b810181811067ffffffffffffffff821117156200027757620002766200021b565b5b80604052505050565b60006200028c620001ec565b90506200029a82826200024a565b919050565b600067ffffffffffffffff821115620002bd57620002bc6200021b565b5b620002c8826200020a565b9050602081019050919050565b60005b83811015620002f5578082015181840152602081019050620002d8565b8381111562000305576000848401525b50505050565b6000620003226200031c846200029f565b62000280565b90508281526020810184848401111562000341576200034062000205565b5b6200034e848285620002d5565b509392505050565b600082601f8301126200036e576200036d62000200565b5b8151620003808482602086016200030b565b91505092915050565b6000819050919050565b6200039e8162000389565b8114620003aa57600080fd5b50565b600081519050620003be8162000393565b92915050565b600080600060608486031215620003e057620003df620001f6565b5b600084015167ffffffffffffffff811115620004015762000400620001fb565b5b6200040f8682870162000356565b935050602084015167ffffffffffffffff811115620004335762000432620001fb565b5b620004418682870162000356565b92505060406200045486828701620003ad565b9150509250925092565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004a657607f821691505b60208210811415620004bd57620004bc6200045e565b5b50919050565b608051614140620004e660003960008181610c12015261166801526141406000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370a082311161011a578063bc8784b7116100ad578063da00e6ed1161007c578063da00e6ed146105c1578063daf6ca30146105dd578063e985e9c5146105fb578063ec5f752e1461062b578063f2fde38b1461065b576101fb565b8063bc8784b71461053d578063c5d67d5414610559578063c76fdfb514610575578063c87b56dd14610591576101fb565b8063a22cb465116100e9578063a22cb465146104a4578063b88d4fde146104c0578063b9c4d9fb146104dc578063bb3bafd61461050c576101fb565b806370a082311461042e578063715018a61461045e5780638da5cb5b1461046857806395d89b4114610486576101fb565b806325e0b16d11610192578063510ffc9b11610161578063510ffc9b146103ba57806355f804b3146103c45780636352211e146103e05780636c0360eb14610410576101fb565b806325e0b16d1461033457806332cb6b0c1461035057806340c1a0641461036e57806342842e0e1461039e576101fb565b80630ebd4c7f116101ce5780630ebd4c7f1461029a578063150b7a02146102ca57806318160ddd146102fa57806323b872dd14610318576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906129bd565b610677565b6040516102279190612a05565b60405180910390f35b610238610831565b6040516102459190612ab9565b60405180910390f35b61026860048036038101906102639190612b11565b6108c3565b6040516102759190612b7f565b60405180910390f35b61029860048036038101906102939190612bc6565b610948565b005b6102b460048036038101906102af9190612b11565b610a60565b6040516102c19190612cc4565b60405180910390f35b6102e460048036038101906102df9190612e1b565b610ad6565b6040516102f19190612ead565b60405180910390f35b610302610aea565b60405161030f9190612ed7565b60405180910390f35b610332600480360381019061032d9190612ef2565b610af0565b005b61034e60048036038101906103499190612f83565b610b50565b005b610358610c10565b6040516103659190612ed7565b60405180910390f35b61038860048036038101906103839190612b11565b610c34565b6040516103959190612fbf565b60405180910390f35b6103b860048036038101906103b39190612ef2565b610c60565b005b6103c2610c80565b005b6103de60048036038101906103d9919061307b565b610d41565b005b6103fa60048036038101906103f59190612b11565b610dd7565b6040516104079190612b7f565b60405180910390f35b610418610e89565b6040516104259190612ab9565b60405180910390f35b610448600480360381019061044391906130c4565b610f17565b6040516104559190612ed7565b60405180910390f35b610466610fcf565b005b610470611109565b60405161047d9190612b7f565b60405180910390f35b61048e611132565b60405161049b9190612ab9565b60405180910390f35b6104be60048036038101906104b9919061311d565b6111c4565b005b6104da60048036038101906104d59190612e1b565b611345565b005b6104f660048036038101906104f19190612b11565b6113a7565b604051610503919061321b565b60405180910390f35b61052660048036038101906105219190612b11565b61146b565b60405161053492919061323d565b60405180910390f35b6105576004803603810190610552919061333c565b61159f565b005b610573600480360381019061056e91906130c4565b611705565b005b61058f600480360381019061058a9190612b11565b611856565b005b6105ab60048036038101906105a69190612b11565b6118dc565b6040516105b89190612ab9565b60405180910390f35b6105db60048036038101906105d69190612f83565b611983565b005b6105e5611a43565b6040516105f29190612b7f565b60405180910390f35b61061560048036038101906106109190613398565b611a69565b6040516106229190612a05565b60405180910390f35b61064560048036038101906106409190612b11565b611afd565b6040516106529190612fbf565b60405180910390f35b610675600480360381019061067091906130c4565b611b29565b005b60007fbb3bafd6000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061074257507f40c1a064000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107aa57507fec5f752e000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061081257507fb7799584000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b15610820576001905061082c565b61082982611cd2565b90505b919050565b60606001805461084090613407565b80601f016020809104026020016040519081016040528092919081815260200182805461086c90613407565b80156108b95780601f1061088e576101008083540402835291602001916108b9565b820191906000526020600020905b81548152906001019060200180831161089c57829003601f168201915b5050505050905090565b60006108ce82611db4565b61090d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610904906134ab565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095382610dd7565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109c4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bb9061353d565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109e3611e20565b73ffffffffffffffffffffffffffffffffffffffff161480610a125750610a1181610a0c611e20565b611a69565b5b610a51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a48906135cf565b60405180910390fd5b610a5b8383611e28565b505050565b6060600167ffffffffffffffff811115610a7d57610a7c612cf0565b5b604051908082528060200260200182016040528015610aab5781602001602082028036833780820191505090505b509050600c5481600081518110610ac557610ac46135ef565b5b602002602001018181525050919050565b600063150b7a0260e01b9050949350505050565b60035481565b610b01610afb611e20565b82611ee1565b610b40576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3790613690565b60405180910390fd5b610b4b838383611fbf565b505050565b610b58611e20565b73ffffffffffffffffffffffffffffffffffffffff16610b76611109565b73ffffffffffffffffffffffffffffffffffffffff1614610bcc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc3906136fc565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b7f000000000000000000000000000000000000000000000000000000000000000081565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610c7b83838360405180602001604052806000815250611345565b505050565b610c88611e20565b73ffffffffffffffffffffffffffffffffffffffff16610ca6611109565b73ffffffffffffffffffffffffffffffffffffffff1614610cfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf3906136fc565b60405180910390fd5b61dead600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b610d49611e20565b73ffffffffffffffffffffffffffffffffffffffff16610d67611109565b73ffffffffffffffffffffffffffffffffffffffff1614610dbd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db4906136fc565b60405180910390fd5b8060099080519060200190610dd39291906128ae565b5050565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e80576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e779061378e565b60405180910390fd5b80915050919050565b60098054610e9690613407565b80601f0160208091040260200160405190810160405280929190818152602001828054610ec290613407565b8015610f0f5780601f10610ee457610100808354040283529160200191610f0f565b820191906000526020600020905b815481529060010190602001808311610ef257829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90613820565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610fd7611e20565b73ffffffffffffffffffffffffffffffffffffffff16610ff5611109565b73ffffffffffffffffffffffffffffffffffffffff161461104b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611042906136fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a360008060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606002805461114190613407565b80601f016020809104026020016040519081016040528092919081815260200182805461116d90613407565b80156111ba5780601f1061118f576101008083540402835291602001916111ba565b820191906000526020600020905b81548152906001019060200180831161119d57829003601f168201915b5050505050905090565b6111cc611e20565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561123a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112319061388c565b60405180910390fd5b8060076000611247611e20565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112f4611e20565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113399190612a05565b60405180910390a35050565b611356611350611e20565b83611ee1565b611395576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138c90613690565b60405180910390fd5b6113a18484848461221b565b50505050565b6060600167ffffffffffffffff8111156113c4576113c3612cf0565b5b6040519080825280602002602001820160405280156113f25781602001602082028036833780820191505090505b509050600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168160008151811061142c5761142b6135ef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050919050565b606080600167ffffffffffffffff81111561148957611488612cf0565b5b6040519080825280602002602001820160405280156114b75781602001602082028036833780820191505090505b509150600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16826000815181106114f1576114f06135ef565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600167ffffffffffffffff81111561154657611545612cf0565b5b6040519080825280602002602001820160405280156115745781602001602082028036833780820191505090505b509050600c548160008151811061158e5761158d6135ef565b5b602002602001018181525050915091565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461162f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611626906138f8565b60405180910390fd5b60008151905060005b818110156116f5576000838281518110611655576116546135ef565b5b6020026020010151141580156116a557507f000000000000000000000000000000000000000000000000000000000000000083828151811061169a576116996135ef565b5b602002602001015111155b6116e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116db90613964565b60405180910390fd5b806116ee906139b3565b9050611638565b506117008383612277565b505050565b61170d611e20565b73ffffffffffffffffffffffffffffffffffffffff1661172b611109565b73ffffffffffffffffffffffffffffffffffffffff1614611781576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611778906136fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611812576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180990613a48565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61185e611e20565b73ffffffffffffffffffffffffffffffffffffffff1661187c611109565b73ffffffffffffffffffffffffffffffffffffffff16146118d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c9906136fc565b60405180910390fd5b80600c8190555050565b60606118e782611db4565b611926576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191d90613ada565b60405180910390fd5b60006119306124a2565b90506000815111611950576040518060200160405280600081525061197b565b8061195a84612534565b60405160200161196b929190613b36565b6040516020818303038152906040525b915050919050565b61198b611e20565b73ffffffffffffffffffffffffffffffffffffffff166119a9611109565b73ffffffffffffffffffffffffffffffffffffffff16146119ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f6906136fc565b60405180910390fd5b80600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611b31611e20565b73ffffffffffffffffffffffffffffffffffffffff16611b4f611109565b73ffffffffffffffffffffffffffffffffffffffff1614611ba5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b9c906136fc565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611c15576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c0c90613bcc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1660008054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3806000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611d9d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611dad5750611dac82612695565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611e9b83610dd7565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611eec82611db4565b611f2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2290613c5e565b60405180910390fd5b6000611f3683610dd7565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611fa557508373ffffffffffffffffffffffffffffffffffffffff16611f8d846108c3565b73ffffffffffffffffffffffffffffffffffffffff16145b80611fb65750611fb58185611a69565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611fdf82610dd7565b73ffffffffffffffffffffffffffffffffffffffff1614612035576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161202c90613cf0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90613d82565b60405180910390fd5b6120b08383836126ff565b6120bb600082611e28565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461210b9190613da2565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121629190613dd6565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b612226848484611fbf565b61223284848484612704565b612271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226890613e9e565b60405180910390fd5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122de90613f0a565b60405180910390fd5b6000600354905060008251905080826123009190613dd6565b60038190555080600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123559190613dd6565b9250508190555060005b8181101561249b57600084828151811061237c5761237b6135ef565b5b6020026020010151905061238f81611db4565b156123cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c690613f76565b60405180910390fd5b6123db600087836126ff565b856004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45080612494906139b3565b905061235f565b5050505050565b6060600980546124b190613407565b80601f01602080910402602001604051908101604052809291908181526020018280546124dd90613407565b801561252a5780601f106124ff5761010080835404028352916020019161252a565b820191906000526020600020905b81548152906001019060200180831161250d57829003601f168201915b5050505050905090565b6060600082141561257c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612690565b600082905060005b600082146125ae578080612597906139b3565b915050600a826125a79190613fc5565b9150612584565b60008167ffffffffffffffff8111156125ca576125c9612cf0565b5b6040519080825280601f01601f1916602001820160405280156125fc5781602001600182028036833780820191505090505b5090505b60008514612689576001826126159190613da2565b9150600a856126249190613ff6565b60306126309190613dd6565b60f81b818381518110612646576126456135ef565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856126829190613fc5565b9450612600565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b60006127258473ffffffffffffffffffffffffffffffffffffffff1661289b565b1561288e578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261274e611e20565b8786866040518563ffffffff1660e01b8152600401612770949392919061407c565b602060405180830381600087803b15801561278a57600080fd5b505af19250505080156127bb57506040513d601f19601f820116820180604052508101906127b891906140dd565b60015b61283e573d80600081146127eb576040519150601f19603f3d011682016040523d82523d6000602084013e6127f0565b606091505b50600081511415612836576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161282d90613e9e565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612893565b600190505b949350505050565b600080823b905060008111915050919050565b8280546128ba90613407565b90600052602060002090601f0160209004810192826128dc5760008555612923565b82601f106128f557805160ff1916838001178555612923565b82800160010185558215612923579182015b82811115612922578251825591602001919060010190612907565b5b5090506129309190612934565b5090565b5b8082111561294d576000816000905550600101612935565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61299a81612965565b81146129a557600080fd5b50565b6000813590506129b781612991565b92915050565b6000602082840312156129d3576129d261295b565b5b60006129e1848285016129a8565b91505092915050565b60008115159050919050565b6129ff816129ea565b82525050565b6000602082019050612a1a60008301846129f6565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612a5a578082015181840152602081019050612a3f565b83811115612a69576000848401525b50505050565b6000601f19601f8301169050919050565b6000612a8b82612a20565b612a958185612a2b565b9350612aa5818560208601612a3c565b612aae81612a6f565b840191505092915050565b60006020820190508181036000830152612ad38184612a80565b905092915050565b6000819050919050565b612aee81612adb565b8114612af957600080fd5b50565b600081359050612b0b81612ae5565b92915050565b600060208284031215612b2757612b2661295b565b5b6000612b3584828501612afc565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612b6982612b3e565b9050919050565b612b7981612b5e565b82525050565b6000602082019050612b946000830184612b70565b92915050565b612ba381612b5e565b8114612bae57600080fd5b50565b600081359050612bc081612b9a565b92915050565b60008060408385031215612bdd57612bdc61295b565b5b6000612beb85828601612bb1565b9250506020612bfc85828601612afc565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612c3b81612adb565b82525050565b6000612c4d8383612c32565b60208301905092915050565b6000602082019050919050565b6000612c7182612c06565b612c7b8185612c11565b9350612c8683612c22565b8060005b83811015612cb7578151612c9e8882612c41565b9750612ca983612c59565b925050600181019050612c8a565b5085935050505092915050565b60006020820190508181036000830152612cde8184612c66565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d2882612a6f565b810181811067ffffffffffffffff82111715612d4757612d46612cf0565b5b80604052505050565b6000612d5a612951565b9050612d668282612d1f565b919050565b600067ffffffffffffffff821115612d8657612d85612cf0565b5b612d8f82612a6f565b9050602081019050919050565b82818337600083830152505050565b6000612dbe612db984612d6b565b612d50565b905082815260208101848484011115612dda57612dd9612ceb565b5b612de5848285612d9c565b509392505050565b600082601f830112612e0257612e01612ce6565b5b8135612e12848260208601612dab565b91505092915050565b60008060008060808587031215612e3557612e3461295b565b5b6000612e4387828801612bb1565b9450506020612e5487828801612bb1565b9350506040612e6587828801612afc565b925050606085013567ffffffffffffffff811115612e8657612e85612960565b5b612e9287828801612ded565b91505092959194509250565b612ea781612965565b82525050565b6000602082019050612ec26000830184612e9e565b92915050565b612ed181612adb565b82525050565b6000602082019050612eec6000830184612ec8565b92915050565b600080600060608486031215612f0b57612f0a61295b565b5b6000612f1986828701612bb1565b9350506020612f2a86828701612bb1565b9250506040612f3b86828701612afc565b9150509250925092565b6000612f5082612b3e565b9050919050565b612f6081612f45565b8114612f6b57600080fd5b50565b600081359050612f7d81612f57565b92915050565b600060208284031215612f9957612f9861295b565b5b6000612fa784828501612f6e565b91505092915050565b612fb981612f45565b82525050565b6000602082019050612fd46000830184612fb0565b92915050565b600067ffffffffffffffff821115612ff557612ff4612cf0565b5b612ffe82612a6f565b9050602081019050919050565b600061301e61301984612fda565b612d50565b90508281526020810184848401111561303a57613039612ceb565b5b613045848285612d9c565b509392505050565b600082601f83011261306257613061612ce6565b5b813561307284826020860161300b565b91505092915050565b6000602082840312156130915761309061295b565b5b600082013567ffffffffffffffff8111156130af576130ae612960565b5b6130bb8482850161304d565b91505092915050565b6000602082840312156130da576130d961295b565b5b60006130e884828501612bb1565b91505092915050565b6130fa816129ea565b811461310557600080fd5b50565b600081359050613117816130f1565b92915050565b600080604083850312156131345761313361295b565b5b600061314285828601612bb1565b925050602061315385828601613108565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61319281612f45565b82525050565b60006131a48383613189565b60208301905092915050565b6000602082019050919050565b60006131c88261315d565b6131d28185613168565b93506131dd83613179565b8060005b8381101561320e5781516131f58882613198565b9750613200836131b0565b9250506001810190506131e1565b5085935050505092915050565b6000602082019050818103600083015261323581846131bd565b905092915050565b6000604082019050818103600083015261325781856131bd565b9050818103602083015261326b8184612c66565b90509392505050565b600067ffffffffffffffff82111561328f5761328e612cf0565b5b602082029050602081019050919050565b600080fd5b60006132b86132b384613274565b612d50565b905080838252602082019050602084028301858111156132db576132da6132a0565b5b835b8181101561330457806132f08882612afc565b8452602084019350506020810190506132dd565b5050509392505050565b600082601f83011261332357613322612ce6565b5b81356133338482602086016132a5565b91505092915050565b600080604083850312156133535761335261295b565b5b600061336185828601612bb1565b925050602083013567ffffffffffffffff81111561338257613381612960565b5b61338e8582860161330e565b9150509250929050565b600080604083850312156133af576133ae61295b565b5b60006133bd85828601612bb1565b92505060206133ce85828601612bb1565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061341f57607f821691505b60208210811415613433576134326133d8565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613495602c83612a2b565b91506134a082613439565b604082019050919050565b600060208201905081810360008301526134c481613488565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613527602183612a2b565b9150613532826134cb565b604082019050919050565b600060208201905081810360008301526135568161351a565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b60006135b9603883612a2b565b91506135c48261355d565b604082019050919050565b600060208201905081810360008301526135e8816135ac565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061367a603183612a2b565b91506136858261361e565b604082019050919050565b600060208201905081810360008301526136a98161366d565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006136e6602083612a2b565b91506136f1826136b0565b602082019050919050565b60006020820190508181036000830152613715816136d9565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613778602983612a2b565b91506137838261371c565b604082019050919050565b600060208201905081810360008301526137a78161376b565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600061380a602a83612a2b565b9150613815826137ae565b604082019050919050565b60006020820190508181036000830152613839816137fd565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613876601983612a2b565b915061388182613840565b602082019050919050565b600060208201905081810360008301526138a581613869565b9050919050565b7f4e69636520747279206c6f6c0000000000000000000000000000000000000000600082015250565b60006138e2600c83612a2b565b91506138ed826138ac565b602082019050919050565b60006020820190508181036000830152613911816138d5565b9050919050565b7f4944203e204d41585f535550504c590000000000000000000000000000000000600082015250565b600061394e600f83612a2b565b915061395982613918565b602082019050919050565b6000602082019050818103600083015261397d81613941565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006139be82612adb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156139f1576139f0613984565b5b600182019050919050565b7f496d6d757461626c650000000000000000000000000000000000000000000000600082015250565b6000613a32600983612a2b565b9150613a3d826139fc565b602082019050919050565b60006020820190508181036000830152613a6181613a25565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613ac4602f83612a2b565b9150613acf82613a68565b604082019050919050565b60006020820190508181036000830152613af381613ab7565b9050919050565b600081905092915050565b6000613b1082612a20565b613b1a8185613afa565b9350613b2a818560208601612a3c565b80840191505092915050565b6000613b428285613b05565b9150613b4e8284613b05565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613bb6602683612a2b565b9150613bc182613b5a565b604082019050919050565b60006020820190508181036000830152613be581613ba9565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c48602c83612a2b565b9150613c5382613bec565b604082019050919050565b60006020820190508181036000830152613c7781613c3b565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613cda602983612a2b565b9150613ce582613c7e565b604082019050919050565b60006020820190508181036000830152613d0981613ccd565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d6c602483612a2b565b9150613d7782613d10565b604082019050919050565b60006020820190508181036000830152613d9b81613d5f565b9050919050565b6000613dad82612adb565b9150613db883612adb565b925082821015613dcb57613dca613984565b5b828203905092915050565b6000613de182612adb565b9150613dec83612adb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613e2157613e20613984565b5b828201905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e88603283612a2b565b9150613e9382613e2c565b604082019050919050565b60006020820190508181036000830152613eb781613e7b565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000613ef4602083612a2b565b9150613eff82613ebe565b602082019050919050565b60006020820190508181036000830152613f2381613ee7565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000613f60601c83612a2b565b9150613f6b82613f2a565b602082019050919050565b60006020820190508181036000830152613f8f81613f53565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613fd082612adb565b9150613fdb83612adb565b925082613feb57613fea613f96565b5b828204905092915050565b600061400182612adb565b915061400c83612adb565b92508261401c5761401b613f96565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b600061404e82614027565b6140588185614032565b9350614068818560208601612a3c565b61407181612a6f565b840191505092915050565b60006080820190506140916000830187612b70565b61409e6020830186612b70565b6140ab6040830185612ec8565b81810360608301526140bd8184614043565b905095945050505050565b6000815190506140d781612991565b92915050565b6000602082840312156140f3576140f261295b565b5b6000614101848285016140c8565b9150509291505056fea2646970667358221220535bf5bddfc723c215dca5e37988eb3113f654dbeee6d181907e311faf3d039c64736f6c63430008080033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000000000094b696c6c6572204746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b47460000000000000000000000000000000000000000000000000000000000

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000001e6100000000000000000000000000000000000000000000000000000000000000094b696c6c6572204746000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000034b47460000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Killer GF
Arg [1] : _symbol (string): KGF
Arg [2] : maxSupply (uint256): 7777

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000001e61
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4b696c6c65722047460000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 4b47460000000000000000000000000000000000000000000000000000000000


Deployed ByteCode Sourcemap

38433:4243:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39134:427;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23713:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25272:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24795:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41397:206;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21249:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21988:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26162:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40190:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38544:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42149:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26572:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40070:114;;;:::i;:::-;;40624:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23407:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38620:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23137:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37014:148;;;:::i;:::-;;36363:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23882:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25565:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26828:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41017:197;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41699:346;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;39567:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39907:157;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40479:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24057:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40307:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38586:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25931:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42513:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37317:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39134:427;39219:4;39259:31;39244:46;;;:11;:46;;;;:103;;;;39316:31;39301:46;;;:11;:46;;;;39244:103;:174;;;;39373:45;39358:60;;;:11;:60;;;;39244:174;:226;;;;39444:26;39429:41;;;:11;:41;;;;39244:226;39232:274;;;39494:4;39487:11;;;;39232:274;39519:36;39543:11;39519:23;:36::i;:::-;39512:43;;39134:427;;;;:::o;23713:100::-;23767:13;23800:5;23793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:100;:::o;25272:221::-;25348:7;25376:16;25384:7;25376;:16::i;:::-;25368:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25461:15;:24;25477:7;25461:24;;;;;;;;;;;;;;;;;;;;;25454:31;;25272:221;;;:::o;24795:411::-;24876:13;24892:23;24907:7;24892:14;:23::i;:::-;24876:39;;24940:5;24934:11;;:2;:11;;;;24926:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;25034:5;25018:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;25043:37;25060:5;25067:12;:10;:12::i;:::-;25043:16;:37::i;:::-;25018:62;24996:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;25177:21;25186:2;25190:7;25177:8;:21::i;:::-;24865:341;24795:411;;:::o;41397:206::-;41467:34;41544:1;41530:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41510:36;;41576:21;;41553:17;41571:1;41553:20;;;;;;;;:::i;:::-;;;;;;;:44;;;;;41397:206;;;:::o;21249:207::-;21392:6;21418:30;;;21411:37;;21249:207;;;;;;:::o;21988:26::-;;;;:::o;26162:339::-;26357:41;26376:12;:10;:12::i;:::-;26390:7;26357:18;:41::i;:::-;26349:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26465:28;26475:4;26481:2;26485:7;26465:9;:28::i;:::-;26162:339;;;:::o;40190:111::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40285:10:::1;40269:13;;:26;;;;;;;;;;;;;;;;;;40190:111:::0;:::o;38544:35::-;;;:::o;42149:128::-;42227:15;42258:13;;;;;;;;;;;42251:20;;42149:128;;;:::o;26572:185::-;26710:39;26727:4;26733:2;26737:7;26710:39;;;;;;;;;;;;:16;:39::i;:::-;26572:185;;;:::o;40070:114::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40136:42:::1;40121:12;;:57;;;;;;;;;;;;;;;;;;40070:114::o:0;40624:88::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40700:6:::1;40690:7;:16;;;;;;;;;;;;:::i;:::-;;40624:88:::0;:::o;23407:239::-;23479:7;23499:13;23515:7;:16;23523:7;23515:16;;;;;;;;;;;;;;;;;;;;;23499:32;;23567:1;23550:19;;:5;:19;;;;23542:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23633:5;23626:12;;;23407:239;;;:::o;38620:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;23137:208::-;23209:7;23254:1;23237:19;;:5;:19;;;;23229:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;23321:9;:16;23331:5;23321:16;;;;;;;;;;;;;;;;23314:23;;23137:208;;;:::o;37014:148::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37121:1:::1;37084:40;;37105:6;::::0;::::1;;;;;;;;37084:40;;;;;;;;;;;;37152:1;37135:6:::0;::::1;:19;;;;;;;;;;;;;;;;;;37014:148::o:0;36363:87::-;36409:7;36436:6;;;;;;;;;;;36429:13;;36363:87;:::o;23882:104::-;23938:13;23971:7;23964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23882:104;:::o;25565:295::-;25680:12;:10;:12::i;:::-;25668:24;;:8;:24;;;;25660:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;25780:8;25735:18;:32;25754:12;:10;:12::i;:::-;25735:32;;;;;;;;;;;;;;;:42;25768:8;25735:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;25833:8;25804:48;;25819:12;:10;:12::i;:::-;25804:48;;;25843:8;25804:48;;;;;;:::i;:::-;;;;;;;;25565:295;;:::o;26828:328::-;27003:41;27022:12;:10;:12::i;:::-;27036:7;27003:18;:41::i;:::-;26995:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;27109:39;27123:4;27129:2;27133:7;27142:5;27109:13;:39::i;:::-;26828:328;;;;:::o;41017:197::-;41082:35;41161:1;41139:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41126:37;;41186:22;;;;;;;;;;;41170:10;41181:1;41170:13;;;;;;;;:::i;:::-;;;;;;;:38;;;;;;;;;;;41017:197;;;:::o;41699:346::-;41780:35;41817:34;41898:1;41876:24;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41863:37;;41923:22;;;;;;;;;;;41907:10;41918:1;41907:13;;;;;;;;:::i;:::-;;;;;;;:38;;;;;;;;;;;41986:1;41972:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41952:36;;42018:21;;41995:17;42013:1;41995:20;;;;;;;;:::i;:::-;;;;;;;:44;;;;;41699:346;;;:::o;39567:334::-;39668:12;;;;;;;;;;;39654:26;;:10;:26;;;39646:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;39704:14;39721:8;:15;39704:32;;39748:9;39743:123;39763:6;39759:1;:10;39743:123;;;39808:1;39793:8;39802:1;39793:11;;;;;;;;:::i;:::-;;;;;;;;:16;;:45;;;;;39828:10;39813:8;39822:1;39813:11;;;;;;;;:::i;:::-;;;;;;;;:25;;39793:45;39785:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;39771:3;;;;:::i;:::-;;;39743:123;;;;39872:23;39882:2;39886:8;39872:9;:23::i;:::-;39639:262;39567:334;;:::o;39907:157::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40007:1:::1;39983:26;;:12;;;;;;;;;;;:26;;;39975:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;40045:13;40030:12;;:28;;;;;;;;;;;;;;;;;;39907:157:::0;:::o;40479:139::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40592:20:::1;40568:21;:44;;;;40479:139:::0;:::o;24057:334::-;24130:13;24164:16;24172:7;24164;:16::i;:::-;24156:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;24245:21;24269:10;:8;:10::i;:::-;24245:34;;24321:1;24303:7;24297:21;:25;:86;;;;;;;;;;;;;;;;;24349:7;24358:18;:7;:16;:18::i;:::-;24332:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;24297:86;24290:93;;;24057:334;;;:::o;40307:166::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;40441:26:::1;40416:22;;:51;;;;;;;;;;;;;;;;;;40307:166:::0;:::o;38586:27::-;;;;;;;;;;;;;:::o;25931:164::-;26028:4;26052:18;:25;26071:5;26052:25;;;;;;;;;;;;;;;:35;26078:8;26052:35;;;;;;;;;;;;;;;;;;;;;;;;;26045:42;;25931:164;;;;:::o;42513:160::-;42611:15;42645:22;;;;;;;;;;;42638:29;;42513:160;;;:::o;37317:244::-;36594:12;:10;:12::i;:::-;36583:23;;:7;:5;:7::i;:::-;:23;;;36575:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;37426:1:::1;37406:22;;:8;:22;;;;37398:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37516:8;37487:38;;37508:6;::::0;::::1;;;;;;;;37487:38;;;;;;;;;;;;37545:8;37536:6;::::0;:17:::1;;;;;;;;;;;;;;;;;;37317:244:::0;:::o;22768:305::-;22870:4;22922:25;22907:40;;;:11;:40;;;;:105;;;;22979:33;22964:48;;;:11;:48;;;;22907:105;:158;;;;23029:36;23053:11;23029:23;:36::i;:::-;22907:158;22887:178;;22768:305;;;:::o;28666:127::-;28731:4;28783:1;28755:30;;:7;:16;28763:7;28755:16;;;;;;;;;;;;;;;;;;;;;:30;;;;28748:37;;28666:127;;;:::o;10678:98::-;10731:7;10758:10;10751:17;;10678:98;:::o;33113:174::-;33215:2;33188:15;:24;33204:7;33188:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;33271:7;33267:2;33233:46;;33242:23;33257:7;33242:14;:23::i;:::-;33233:46;;;;;;;;;;;;33113:174;;:::o;28960:348::-;29053:4;29078:16;29086:7;29078;:16::i;:::-;29070:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29154:13;29170:23;29185:7;29170:14;:23::i;:::-;29154:39;;29223:5;29212:16;;:7;:16;;;:51;;;;29256:7;29232:31;;:20;29244:7;29232:11;:20::i;:::-;:31;;;29212:51;:87;;;;29267:32;29284:5;29291:7;29267:16;:32::i;:::-;29212:87;29204:96;;;28960:348;;;;:::o;32417:578::-;32576:4;32549:31;;:23;32564:7;32549:14;:23::i;:::-;:31;;;32541:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;32659:1;32645:16;;:2;:16;;;;32637:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;32715:39;32736:4;32742:2;32746:7;32715:20;:39::i;:::-;32819:29;32836:1;32840:7;32819:8;:29::i;:::-;32880:1;32861:9;:15;32871:4;32861:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;32909:1;32892:9;:13;32902:2;32892:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32940:2;32921:7;:16;32929:7;32921:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32979:7;32975:2;32960:27;;32969:4;32960:27;;;;;;;;;;;;32417:578;;;:::o;28038:315::-;28195:28;28205:4;28211:2;28215:7;28195:9;:28::i;:::-;28242:48;28265:4;28271:2;28275:7;28284:5;28242:22;:48::i;:::-;28234:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;28038:315;;;;:::o;30827:664::-;30935:1;30921:16;;:2;:16;;;;30913:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;30987:20;31010:11;;30987:34;;31032:15;31050:8;:15;31032:33;;31107:7;31092:12;:22;;;;:::i;:::-;31078:11;:36;;;;31142:7;31125:9;:13;31135:2;31125:13;;;;;;;;;;;;;;;;:24;;;;;;;:::i;:::-;;;;;;;;31175:9;31170:314;31190:7;31186:1;:11;31170:314;;;31219:15;31237:8;31246:1;31237:11;;;;;;;;:::i;:::-;;;;;;;;31219:29;;31272:16;31280:7;31272;:16::i;:::-;31271:17;31263:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;31336:45;31365:1;31369:2;31373:7;31336:20;:45::i;:::-;31417:2;31398:7;:16;31406:7;31398:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31464:7;31460:2;31439:33;;31456:1;31439:33;;;;;;;;;;;;31204:280;31199:3;;;;:::i;:::-;;;31170:314;;;;30902:589;;30827:664;;:::o;40718:102::-;40778:13;40807:7;40800:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40718:102;:::o;11250:723::-;11306:13;11536:1;11527:5;:10;11523:53;;;11554:10;;;;;;;;;;;;;;;;;;;;;11523:53;11586:12;11601:5;11586:20;;11617:14;11642:78;11657:1;11649:4;:9;11642:78;;11675:8;;;;;:::i;:::-;;;;11706:2;11698:10;;;;;:::i;:::-;;;11642:78;;;11730:19;11762:6;11752:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11730:39;;11780:154;11796:1;11787:5;:10;11780:154;;11824:1;11814:11;;;;;:::i;:::-;;;11891:2;11883:5;:10;;;;:::i;:::-;11870:2;:24;;;;:::i;:::-;11857:39;;11840:6;11847;11840:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;11920:2;11911:11;;;;;:::i;:::-;;;11780:154;;;11958:6;11944:21;;;;;11250:723;;;;:::o;20648:157::-;20733:4;20772:25;20757:40;;;:11;:40;;;;20750:47;;20648:157;;;:::o;35223:126::-;;;;:::o;33852:799::-;34007:4;34028:15;:2;:13;;;:15::i;:::-;34024:620;;;34080:2;34064:36;;;34101:12;:10;:12::i;:::-;34115:4;34121:7;34130:5;34064:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34060:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34323:1;34306:6;:13;:18;34302:272;;;34349:60;;;;;;;;;;:::i;:::-;;;;;;;;34302:272;34524:6;34518:13;34509:6;34505:2;34501:15;34494:38;34060:529;34197:41;;;34187:51;;;:6;:51;;;;34180:58;;;;;34024:620;34628:4;34621:11;;33852:799;;;;;;;:::o;2880:422::-;2940:4;3148:12;3259:7;3247:20;3239:28;;3293:1;3286:4;:8;3279:15;;;2880:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:114::-;5005:6;5039:5;5033:12;5023:22;;4938:114;;;:::o;5058:184::-;5157:11;5191:6;5186:3;5179:19;5231:4;5226:3;5222:14;5207:29;;5058:184;;;;:::o;5248:132::-;5315:4;5338:3;5330:11;;5368:4;5363:3;5359:14;5351:22;;5248:132;;;:::o;5386:108::-;5463:24;5481:5;5463:24;:::i;:::-;5458:3;5451:37;5386:108;;:::o;5500:179::-;5569:10;5590:46;5632:3;5624:6;5590:46;:::i;:::-;5668:4;5663:3;5659:14;5645:28;;5500:179;;;;:::o;5685:113::-;5755:4;5787;5782:3;5778:14;5770:22;;5685:113;;;:::o;5834:732::-;5953:3;5982:54;6030:5;5982:54;:::i;:::-;6052:86;6131:6;6126:3;6052:86;:::i;:::-;6045:93;;6162:56;6212:5;6162:56;:::i;:::-;6241:7;6272:1;6257:284;6282:6;6279:1;6276:13;6257:284;;;6358:6;6352:13;6385:63;6444:3;6429:13;6385:63;:::i;:::-;6378:70;;6471:60;6524:6;6471:60;:::i;:::-;6461:70;;6317:224;6304:1;6301;6297:9;6292:14;;6257:284;;;6261:14;6557:3;6550:10;;5958:608;;;5834:732;;;;:::o;6572:373::-;6715:4;6753:2;6742:9;6738:18;6730:26;;6802:9;6796:4;6792:20;6788:1;6777:9;6773:17;6766:47;6830:108;6933:4;6924:6;6830:108;:::i;:::-;6822:116;;6572:373;;;;:::o;6951:117::-;7060:1;7057;7050:12;7074:117;7183:1;7180;7173:12;7197:180;7245:77;7242:1;7235:88;7342:4;7339:1;7332:15;7366:4;7363:1;7356:15;7383:281;7466:27;7488:4;7466:27;:::i;:::-;7458:6;7454:40;7596:6;7584:10;7581:22;7560:18;7548:10;7545:34;7542:62;7539:88;;;7607:18;;:::i;:::-;7539:88;7647:10;7643:2;7636:22;7426:238;7383:281;;:::o;7670:129::-;7704:6;7731:20;;:::i;:::-;7721:30;;7760:33;7788:4;7780:6;7760:33;:::i;:::-;7670:129;;;:::o;7805:307::-;7866:4;7956:18;7948:6;7945:30;7942:56;;;7978:18;;:::i;:::-;7942:56;8016:29;8038:6;8016:29;:::i;:::-;8008:37;;8100:4;8094;8090:15;8082:23;;7805:307;;;:::o;8118:154::-;8202:6;8197:3;8192;8179:30;8264:1;8255:6;8250:3;8246:16;8239:27;8118:154;;;:::o;8278:410::-;8355:5;8380:65;8396:48;8437:6;8396:48;:::i;:::-;8380:65;:::i;:::-;8371:74;;8468:6;8461:5;8454:21;8506:4;8499:5;8495:16;8544:3;8535:6;8530:3;8526:16;8523:25;8520:112;;;8551:79;;:::i;:::-;8520:112;8641:41;8675:6;8670:3;8665;8641:41;:::i;:::-;8361:327;8278:410;;;;;:::o;8707:338::-;8762:5;8811:3;8804:4;8796:6;8792:17;8788:27;8778:122;;8819:79;;:::i;:::-;8778:122;8936:6;8923:20;8961:78;9035:3;9027:6;9020:4;9012:6;9008:17;8961:78;:::i;:::-;8952:87;;8768:277;8707:338;;;;:::o;9051:943::-;9146:6;9154;9162;9170;9219:3;9207:9;9198:7;9194:23;9190:33;9187:120;;;9226:79;;:::i;:::-;9187:120;9346:1;9371:53;9416:7;9407:6;9396:9;9392:22;9371:53;:::i;:::-;9361:63;;9317:117;9473:2;9499:53;9544:7;9535:6;9524:9;9520:22;9499:53;:::i;:::-;9489:63;;9444:118;9601:2;9627:53;9672:7;9663:6;9652:9;9648:22;9627:53;:::i;:::-;9617:63;;9572:118;9757:2;9746:9;9742:18;9729:32;9788:18;9780:6;9777:30;9774:117;;;9810:79;;:::i;:::-;9774:117;9915:62;9969:7;9960:6;9949:9;9945:22;9915:62;:::i;:::-;9905:72;;9700:287;9051:943;;;;;;;:::o;10000:115::-;10085:23;10102:5;10085:23;:::i;:::-;10080:3;10073:36;10000:115;;:::o;10121:218::-;10212:4;10250:2;10239:9;10235:18;10227:26;;10263:69;10329:1;10318:9;10314:17;10305:6;10263:69;:::i;:::-;10121:218;;;;:::o;10345:118::-;10432:24;10450:5;10432:24;:::i;:::-;10427:3;10420:37;10345:118;;:::o;10469:222::-;10562:4;10600:2;10589:9;10585:18;10577:26;;10613:71;10681:1;10670:9;10666:17;10657:6;10613:71;:::i;:::-;10469:222;;;;:::o;10697:619::-;10774:6;10782;10790;10839:2;10827:9;10818:7;10814:23;10810:32;10807:119;;;10845:79;;:::i;:::-;10807:119;10965:1;10990:53;11035:7;11026:6;11015:9;11011:22;10990:53;:::i;:::-;10980:63;;10936:117;11092:2;11118:53;11163:7;11154:6;11143:9;11139:22;11118:53;:::i;:::-;11108:63;;11063:118;11220:2;11246:53;11291:7;11282:6;11271:9;11267:22;11246:53;:::i;:::-;11236:63;;11191:118;10697:619;;;;;:::o;11322:104::-;11367:7;11396:24;11414:5;11396:24;:::i;:::-;11385:35;;11322:104;;;:::o;11432:138::-;11513:32;11539:5;11513:32;:::i;:::-;11506:5;11503:43;11493:71;;11560:1;11557;11550:12;11493:71;11432:138;:::o;11576:155::-;11630:5;11668:6;11655:20;11646:29;;11684:41;11719:5;11684:41;:::i;:::-;11576:155;;;;:::o;11737:345::-;11804:6;11853:2;11841:9;11832:7;11828:23;11824:32;11821:119;;;11859:79;;:::i;:::-;11821:119;11979:1;12004:61;12057:7;12048:6;12037:9;12033:22;12004:61;:::i;:::-;11994:71;;11950:125;11737:345;;;;:::o;12088:142::-;12191:32;12217:5;12191:32;:::i;:::-;12186:3;12179:45;12088:142;;:::o;12236:254::-;12345:4;12383:2;12372:9;12368:18;12360:26;;12396:87;12480:1;12469:9;12465:17;12456:6;12396:87;:::i;:::-;12236:254;;;;:::o;12496:308::-;12558:4;12648:18;12640:6;12637:30;12634:56;;;12670:18;;:::i;:::-;12634:56;12708:29;12730:6;12708:29;:::i;:::-;12700:37;;12792:4;12786;12782:15;12774:23;;12496:308;;;:::o;12810:412::-;12888:5;12913:66;12929:49;12971:6;12929:49;:::i;:::-;12913:66;:::i;:::-;12904:75;;13002:6;12995:5;12988:21;13040:4;13033:5;13029:16;13078:3;13069:6;13064:3;13060:16;13057:25;13054:112;;;13085:79;;:::i;:::-;13054:112;13175:41;13209:6;13204:3;13199;13175:41;:::i;:::-;12894:328;12810:412;;;;;:::o;13242:340::-;13298:5;13347:3;13340:4;13332:6;13328:17;13324:27;13314:122;;13355:79;;:::i;:::-;13314:122;13472:6;13459:20;13497:79;13572:3;13564:6;13557:4;13549:6;13545:17;13497:79;:::i;:::-;13488:88;;13304:278;13242:340;;;;:::o;13588:509::-;13657:6;13706:2;13694:9;13685:7;13681:23;13677:32;13674:119;;;13712:79;;:::i;:::-;13674:119;13860:1;13849:9;13845:17;13832:31;13890:18;13882:6;13879:30;13876:117;;;13912:79;;:::i;:::-;13876:117;14017:63;14072:7;14063:6;14052:9;14048:22;14017:63;:::i;:::-;14007:73;;13803:287;13588:509;;;;:::o;14103:329::-;14162:6;14211:2;14199:9;14190:7;14186:23;14182:32;14179:119;;;14217:79;;:::i;:::-;14179:119;14337:1;14362:53;14407:7;14398:6;14387:9;14383:22;14362:53;:::i;:::-;14352:63;;14308:117;14103:329;;;;:::o;14438:116::-;14508:21;14523:5;14508:21;:::i;:::-;14501:5;14498:32;14488:60;;14544:1;14541;14534:12;14488:60;14438:116;:::o;14560:133::-;14603:5;14641:6;14628:20;14619:29;;14657:30;14681:5;14657:30;:::i;:::-;14560:133;;;;:::o;14699:468::-;14764:6;14772;14821:2;14809:9;14800:7;14796:23;14792:32;14789:119;;;14827:79;;:::i;:::-;14789:119;14947:1;14972:53;15017:7;15008:6;14997:9;14993:22;14972:53;:::i;:::-;14962:63;;14918:117;15074:2;15100:50;15142:7;15133:6;15122:9;15118:22;15100:50;:::i;:::-;15090:60;;15045:115;14699:468;;;;;:::o;15173:122::-;15248:6;15282:5;15276:12;15266:22;;15173:122;;;:::o;15301:192::-;15408:11;15442:6;15437:3;15430:19;15482:4;15477:3;15473:14;15458:29;;15301:192;;;;:::o;15499:140::-;15574:4;15597:3;15589:11;;15627:4;15622:3;15618:14;15610:22;;15499:140;;;:::o;15645:132::-;15738:32;15764:5;15738:32;:::i;:::-;15733:3;15726:45;15645:132;;:::o;15783:211::-;15868:10;15889:62;15947:3;15939:6;15889:62;:::i;:::-;15983:4;15978:3;15974:14;15960:28;;15783:211;;;;:::o;16000:121::-;16078:4;16110;16105:3;16101:14;16093:22;;16000:121;;;:::o;16173:796::-;16308:3;16337:62;16393:5;16337:62;:::i;:::-;16415:94;16502:6;16497:3;16415:94;:::i;:::-;16408:101;;16533:64;16591:5;16533:64;:::i;:::-;16620:7;16651:1;16636:308;16661:6;16658:1;16655:13;16636:308;;;16737:6;16731:13;16764:79;16839:3;16824:13;16764:79;:::i;:::-;16757:86;;16866:68;16927:6;16866:68;:::i;:::-;16856:78;;16696:248;16683:1;16680;16676:9;16671:14;;16636:308;;;16640:14;16960:3;16953:10;;16313:656;;;16173:796;;;;:::o;16975:405::-;17134:4;17172:2;17161:9;17157:18;17149:26;;17221:9;17215:4;17211:20;17207:1;17196:9;17192:17;17185:47;17249:124;17368:4;17359:6;17249:124;:::i;:::-;17241:132;;16975:405;;;;:::o;17386:666::-;17623:4;17661:2;17650:9;17646:18;17638:26;;17710:9;17704:4;17700:20;17696:1;17685:9;17681:17;17674:47;17738:124;17857:4;17848:6;17738:124;:::i;:::-;17730:132;;17909:9;17903:4;17899:20;17894:2;17883:9;17879:18;17872:48;17937:108;18040:4;18031:6;17937:108;:::i;:::-;17929:116;;17386:666;;;;;:::o;18058:311::-;18135:4;18225:18;18217:6;18214:30;18211:56;;;18247:18;;:::i;:::-;18211:56;18297:4;18289:6;18285:17;18277:25;;18357:4;18351;18347:15;18339:23;;18058:311;;;:::o;18375:117::-;18484:1;18481;18474:12;18515:710;18611:5;18636:81;18652:64;18709:6;18652:64;:::i;:::-;18636:81;:::i;:::-;18627:90;;18737:5;18766:6;18759:5;18752:21;18800:4;18793:5;18789:16;18782:23;;18853:4;18845:6;18841:17;18833:6;18829:30;18882:3;18874:6;18871:15;18868:122;;;18901:79;;:::i;:::-;18868:122;19016:6;18999:220;19033:6;19028:3;19025:15;18999:220;;;19108:3;19137:37;19170:3;19158:10;19137:37;:::i;:::-;19132:3;19125:50;19204:4;19199:3;19195:14;19188:21;;19075:144;19059:4;19054:3;19050:14;19043:21;;18999:220;;;19003:21;18617:608;;18515:710;;;;;:::o;19248:370::-;19319:5;19368:3;19361:4;19353:6;19349:17;19345:27;19335:122;;19376:79;;:::i;:::-;19335:122;19493:6;19480:20;19518:94;19608:3;19600:6;19593:4;19585:6;19581:17;19518:94;:::i;:::-;19509:103;;19325:293;19248:370;;;;:::o;19624:684::-;19717:6;19725;19774:2;19762:9;19753:7;19749:23;19745:32;19742:119;;;19780:79;;:::i;:::-;19742:119;19900:1;19925:53;19970:7;19961:6;19950:9;19946:22;19925:53;:::i;:::-;19915:63;;19871:117;20055:2;20044:9;20040:18;20027:32;20086:18;20078:6;20075:30;20072:117;;;20108:79;;:::i;:::-;20072:117;20213:78;20283:7;20274:6;20263:9;20259:22;20213:78;:::i;:::-;20203:88;;19998:303;19624:684;;;;;:::o;20314:474::-;20382:6;20390;20439:2;20427:9;20418:7;20414:23;20410:32;20407:119;;;20445:79;;:::i;:::-;20407:119;20565:1;20590:53;20635:7;20626:6;20615:9;20611:22;20590:53;:::i;:::-;20580:63;;20536:117;20692:2;20718:53;20763:7;20754:6;20743:9;20739:22;20718:53;:::i;:::-;20708:63;;20663:118;20314:474;;;;;:::o;20794:180::-;20842:77;20839:1;20832:88;20939:4;20936:1;20929:15;20963:4;20960:1;20953:15;20980:320;21024:6;21061:1;21055:4;21051:12;21041:22;;21108:1;21102:4;21098:12;21129:18;21119:81;;21185:4;21177:6;21173:17;21163:27;;21119:81;21247:2;21239:6;21236:14;21216:18;21213:38;21210:84;;;21266:18;;:::i;:::-;21210:84;21031:269;20980:320;;;:::o;21306:231::-;21446:34;21442:1;21434:6;21430:14;21423:58;21515:14;21510:2;21502:6;21498:15;21491:39;21306:231;:::o;21543:366::-;21685:3;21706:67;21770:2;21765:3;21706:67;:::i;:::-;21699:74;;21782:93;21871:3;21782:93;:::i;:::-;21900:2;21895:3;21891:12;21884:19;;21543:366;;;:::o;21915:419::-;22081:4;22119:2;22108:9;22104:18;22096:26;;22168:9;22162:4;22158:20;22154:1;22143:9;22139:17;22132:47;22196:131;22322:4;22196:131;:::i;:::-;22188:139;;21915:419;;;:::o;22340:220::-;22480:34;22476:1;22468:6;22464:14;22457:58;22549:3;22544:2;22536:6;22532:15;22525:28;22340:220;:::o;22566:366::-;22708:3;22729:67;22793:2;22788:3;22729:67;:::i;:::-;22722:74;;22805:93;22894:3;22805:93;:::i;:::-;22923:2;22918:3;22914:12;22907:19;;22566:366;;;:::o;22938:419::-;23104:4;23142:2;23131:9;23127:18;23119:26;;23191:9;23185:4;23181:20;23177:1;23166:9;23162:17;23155:47;23219:131;23345:4;23219:131;:::i;:::-;23211:139;;22938:419;;;:::o;23363:243::-;23503:34;23499:1;23491:6;23487:14;23480:58;23572:26;23567:2;23559:6;23555:15;23548:51;23363:243;:::o;23612:366::-;23754:3;23775:67;23839:2;23834:3;23775:67;:::i;:::-;23768:74;;23851:93;23940:3;23851:93;:::i;:::-;23969:2;23964:3;23960:12;23953:19;;23612:366;;;:::o;23984:419::-;24150:4;24188:2;24177:9;24173:18;24165:26;;24237:9;24231:4;24227:20;24223:1;24212:9;24208:17;24201:47;24265:131;24391:4;24265:131;:::i;:::-;24257:139;;23984:419;;;:::o;24409:180::-;24457:77;24454:1;24447:88;24554:4;24551:1;24544:15;24578:4;24575:1;24568:15;24595:236;24735:34;24731:1;24723:6;24719:14;24712:58;24804:19;24799:2;24791:6;24787:15;24780:44;24595:236;:::o;24837:366::-;24979:3;25000:67;25064:2;25059:3;25000:67;:::i;:::-;24993:74;;25076:93;25165:3;25076:93;:::i;:::-;25194:2;25189:3;25185:12;25178:19;;24837:366;;;:::o;25209:419::-;25375:4;25413:2;25402:9;25398:18;25390:26;;25462:9;25456:4;25452:20;25448:1;25437:9;25433:17;25426:47;25490:131;25616:4;25490:131;:::i;:::-;25482:139;;25209:419;;;:::o;25634:182::-;25774:34;25770:1;25762:6;25758:14;25751:58;25634:182;:::o;25822:366::-;25964:3;25985:67;26049:2;26044:3;25985:67;:::i;:::-;25978:74;;26061:93;26150:3;26061:93;:::i;:::-;26179:2;26174:3;26170:12;26163:19;;25822:366;;;:::o;26194:419::-;26360:4;26398:2;26387:9;26383:18;26375:26;;26447:9;26441:4;26437:20;26433:1;26422:9;26418:17;26411:47;26475:131;26601:4;26475:131;:::i;:::-;26467:139;;26194:419;;;:::o;26619:228::-;26759:34;26755:1;26747:6;26743:14;26736:58;26828:11;26823:2;26815:6;26811:15;26804:36;26619:228;:::o;26853:366::-;26995:3;27016:67;27080:2;27075:3;27016:67;:::i;:::-;27009:74;;27092:93;27181:3;27092:93;:::i;:::-;27210:2;27205:3;27201:12;27194:19;;26853:366;;;:::o;27225:419::-;27391:4;27429:2;27418:9;27414:18;27406:26;;27478:9;27472:4;27468:20;27464:1;27453:9;27449:17;27442:47;27506:131;27632:4;27506:131;:::i;:::-;27498:139;;27225:419;;;:::o;27650:229::-;27790:34;27786:1;27778:6;27774:14;27767:58;27859:12;27854:2;27846:6;27842:15;27835:37;27650:229;:::o;27885:366::-;28027:3;28048:67;28112:2;28107:3;28048:67;:::i;:::-;28041:74;;28124:93;28213:3;28124:93;:::i;:::-;28242:2;28237:3;28233:12;28226:19;;27885:366;;;:::o;28257:419::-;28423:4;28461:2;28450:9;28446:18;28438:26;;28510:9;28504:4;28500:20;28496:1;28485:9;28481:17;28474:47;28538:131;28664:4;28538:131;:::i;:::-;28530:139;;28257:419;;;:::o;28682:175::-;28822:27;28818:1;28810:6;28806:14;28799:51;28682:175;:::o;28863:366::-;29005:3;29026:67;29090:2;29085:3;29026:67;:::i;:::-;29019:74;;29102:93;29191:3;29102:93;:::i;:::-;29220:2;29215:3;29211:12;29204:19;;28863:366;;;:::o;29235:419::-;29401:4;29439:2;29428:9;29424:18;29416:26;;29488:9;29482:4;29478:20;29474:1;29463:9;29459:17;29452:47;29516:131;29642:4;29516:131;:::i;:::-;29508:139;;29235:419;;;:::o;29660:162::-;29800:14;29796:1;29788:6;29784:14;29777:38;29660:162;:::o;29828:366::-;29970:3;29991:67;30055:2;30050:3;29991:67;:::i;:::-;29984:74;;30067:93;30156:3;30067:93;:::i;:::-;30185:2;30180:3;30176:12;30169:19;;29828:366;;;:::o;30200:419::-;30366:4;30404:2;30393:9;30389:18;30381:26;;30453:9;30447:4;30443:20;30439:1;30428:9;30424:17;30417:47;30481:131;30607:4;30481:131;:::i;:::-;30473:139;;30200:419;;;:::o;30625:165::-;30765:17;30761:1;30753:6;30749:14;30742:41;30625:165;:::o;30796:366::-;30938:3;30959:67;31023:2;31018:3;30959:67;:::i;:::-;30952:74;;31035:93;31124:3;31035:93;:::i;:::-;31153:2;31148:3;31144:12;31137:19;;30796:366;;;:::o;31168:419::-;31334:4;31372:2;31361:9;31357:18;31349:26;;31421:9;31415:4;31411:20;31407:1;31396:9;31392:17;31385:47;31449:131;31575:4;31449:131;:::i;:::-;31441:139;;31168:419;;;:::o;31593:180::-;31641:77;31638:1;31631:88;31738:4;31735:1;31728:15;31762:4;31759:1;31752:15;31779:233;31818:3;31841:24;31859:5;31841:24;:::i;:::-;31832:33;;31887:66;31880:5;31877:77;31874:103;;;31957:18;;:::i;:::-;31874:103;32004:1;31997:5;31993:13;31986:20;;31779:233;;;:::o;32018:159::-;32158:11;32154:1;32146:6;32142:14;32135:35;32018:159;:::o;32183:365::-;32325:3;32346:66;32410:1;32405:3;32346:66;:::i;:::-;32339:73;;32421:93;32510:3;32421:93;:::i;:::-;32539:2;32534:3;32530:12;32523:19;;32183:365;;;:::o;32554:419::-;32720:4;32758:2;32747:9;32743:18;32735:26;;32807:9;32801:4;32797:20;32793:1;32782:9;32778:17;32771:47;32835:131;32961:4;32835:131;:::i;:::-;32827:139;;32554:419;;;:::o;32979:234::-;33119:34;33115:1;33107:6;33103:14;33096:58;33188:17;33183:2;33175:6;33171:15;33164:42;32979:234;:::o;33219:366::-;33361:3;33382:67;33446:2;33441:3;33382:67;:::i;:::-;33375:74;;33458:93;33547:3;33458:93;:::i;:::-;33576:2;33571:3;33567:12;33560:19;;33219:366;;;:::o;33591:419::-;33757:4;33795:2;33784:9;33780:18;33772:26;;33844:9;33838:4;33834:20;33830:1;33819:9;33815:17;33808:47;33872:131;33998:4;33872:131;:::i;:::-;33864:139;;33591:419;;;:::o;34016:148::-;34118:11;34155:3;34140:18;;34016:148;;;;:::o;34170:377::-;34276:3;34304:39;34337:5;34304:39;:::i;:::-;34359:89;34441:6;34436:3;34359:89;:::i;:::-;34352:96;;34457:52;34502:6;34497:3;34490:4;34483:5;34479:16;34457:52;:::i;:::-;34534:6;34529:3;34525:16;34518:23;;34280:267;34170:377;;;;:::o;34553:435::-;34733:3;34755:95;34846:3;34837:6;34755:95;:::i;:::-;34748:102;;34867:95;34958:3;34949:6;34867:95;:::i;:::-;34860:102;;34979:3;34972:10;;34553:435;;;;;:::o;34994:225::-;35134:34;35130:1;35122:6;35118:14;35111:58;35203:8;35198:2;35190:6;35186:15;35179:33;34994:225;:::o;35225:366::-;35367:3;35388:67;35452:2;35447:3;35388:67;:::i;:::-;35381:74;;35464:93;35553:3;35464:93;:::i;:::-;35582:2;35577:3;35573:12;35566:19;;35225:366;;;:::o;35597:419::-;35763:4;35801:2;35790:9;35786:18;35778:26;;35850:9;35844:4;35840:20;35836:1;35825:9;35821:17;35814:47;35878:131;36004:4;35878:131;:::i;:::-;35870:139;;35597:419;;;:::o;36022:231::-;36162:34;36158:1;36150:6;36146:14;36139:58;36231:14;36226:2;36218:6;36214:15;36207:39;36022:231;:::o;36259:366::-;36401:3;36422:67;36486:2;36481:3;36422:67;:::i;:::-;36415:74;;36498:93;36587:3;36498:93;:::i;:::-;36616:2;36611:3;36607:12;36600:19;;36259:366;;;:::o;36631:419::-;36797:4;36835:2;36824:9;36820:18;36812:26;;36884:9;36878:4;36874:20;36870:1;36859:9;36855:17;36848:47;36912:131;37038:4;36912:131;:::i;:::-;36904:139;;36631:419;;;:::o;37056:228::-;37196:34;37192:1;37184:6;37180:14;37173:58;37265:11;37260:2;37252:6;37248:15;37241:36;37056:228;:::o;37290:366::-;37432:3;37453:67;37517:2;37512:3;37453:67;:::i;:::-;37446:74;;37529:93;37618:3;37529:93;:::i;:::-;37647:2;37642:3;37638:12;37631:19;;37290:366;;;:::o;37662:419::-;37828:4;37866:2;37855:9;37851:18;37843:26;;37915:9;37909:4;37905:20;37901:1;37890:9;37886:17;37879:47;37943:131;38069:4;37943:131;:::i;:::-;37935:139;;37662:419;;;:::o;38087:223::-;38227:34;38223:1;38215:6;38211:14;38204:58;38296:6;38291:2;38283:6;38279:15;38272:31;38087:223;:::o;38316:366::-;38458:3;38479:67;38543:2;38538:3;38479:67;:::i;:::-;38472:74;;38555:93;38644:3;38555:93;:::i;:::-;38673:2;38668:3;38664:12;38657:19;;38316:366;;;:::o;38688:419::-;38854:4;38892:2;38881:9;38877:18;38869:26;;38941:9;38935:4;38931:20;38927:1;38916:9;38912:17;38905:47;38969:131;39095:4;38969:131;:::i;:::-;38961:139;;38688:419;;;:::o;39113:191::-;39153:4;39173:20;39191:1;39173:20;:::i;:::-;39168:25;;39207:20;39225:1;39207:20;:::i;:::-;39202:25;;39246:1;39243;39240:8;39237:34;;;39251:18;;:::i;:::-;39237:34;39296:1;39293;39289:9;39281:17;;39113:191;;;;:::o;39310:305::-;39350:3;39369:20;39387:1;39369:20;:::i;:::-;39364:25;;39403:20;39421:1;39403:20;:::i;:::-;39398:25;;39557:1;39489:66;39485:74;39482:1;39479:81;39476:107;;;39563:18;;:::i;:::-;39476:107;39607:1;39604;39600:9;39593:16;;39310:305;;;;:::o;39621:237::-;39761:34;39757:1;39749:6;39745:14;39738:58;39830:20;39825:2;39817:6;39813:15;39806:45;39621:237;:::o;39864:366::-;40006:3;40027:67;40091:2;40086:3;40027:67;:::i;:::-;40020:74;;40103:93;40192:3;40103:93;:::i;:::-;40221:2;40216:3;40212:12;40205:19;;39864:366;;;:::o;40236:419::-;40402:4;40440:2;40429:9;40425:18;40417:26;;40489:9;40483:4;40479:20;40475:1;40464:9;40460:17;40453:47;40517:131;40643:4;40517:131;:::i;:::-;40509:139;;40236:419;;;:::o;40661:182::-;40801:34;40797:1;40789:6;40785:14;40778:58;40661:182;:::o;40849:366::-;40991:3;41012:67;41076:2;41071:3;41012:67;:::i;:::-;41005:74;;41088:93;41177:3;41088:93;:::i;:::-;41206:2;41201:3;41197:12;41190:19;;40849:366;;;:::o;41221:419::-;41387:4;41425:2;41414:9;41410:18;41402:26;;41474:9;41468:4;41464:20;41460:1;41449:9;41445:17;41438:47;41502:131;41628:4;41502:131;:::i;:::-;41494:139;;41221:419;;;:::o;41646:178::-;41786:30;41782:1;41774:6;41770:14;41763:54;41646:178;:::o;41830:366::-;41972:3;41993:67;42057:2;42052:3;41993:67;:::i;:::-;41986:74;;42069:93;42158:3;42069:93;:::i;:::-;42187:2;42182:3;42178:12;42171:19;;41830:366;;;:::o;42202:419::-;42368:4;42406:2;42395:9;42391:18;42383:26;;42455:9;42449:4;42445:20;42441:1;42430:9;42426:17;42419:47;42483:131;42609:4;42483:131;:::i;:::-;42475:139;;42202:419;;;:::o;42627:180::-;42675:77;42672:1;42665:88;42772:4;42769:1;42762:15;42796:4;42793:1;42786:15;42813:185;42853:1;42870:20;42888:1;42870:20;:::i;:::-;42865:25;;42904:20;42922:1;42904:20;:::i;:::-;42899:25;;42943:1;42933:35;;42948:18;;:::i;:::-;42933:35;42990:1;42987;42983:9;42978:14;;42813:185;;;;:::o;43004:176::-;43036:1;43053:20;43071:1;43053:20;:::i;:::-;43048:25;;43087:20;43105:1;43087:20;:::i;:::-;43082:25;;43126:1;43116:35;;43131:18;;:::i;:::-;43116:35;43172:1;43169;43165:9;43160:14;;43004:176;;;;:::o;43186:98::-;43237:6;43271:5;43265:12;43255:22;;43186:98;;;:::o;43290:168::-;43373:11;43407:6;43402:3;43395:19;43447:4;43442:3;43438:14;43423:29;;43290:168;;;;:::o;43464:360::-;43550:3;43578:38;43610:5;43578:38;:::i;:::-;43632:70;43695:6;43690:3;43632:70;:::i;:::-;43625:77;;43711:52;43756:6;43751:3;43744:4;43737:5;43733:16;43711:52;:::i;:::-;43788:29;43810:6;43788:29;:::i;:::-;43783:3;43779:39;43772:46;;43554:270;43464:360;;;;:::o;43830:640::-;44025:4;44063:3;44052:9;44048:19;44040:27;;44077:71;44145:1;44134:9;44130:17;44121:6;44077:71;:::i;:::-;44158:72;44226:2;44215:9;44211:18;44202:6;44158:72;:::i;:::-;44240;44308:2;44297:9;44293:18;44284:6;44240:72;:::i;:::-;44359:9;44353:4;44349:20;44344:2;44333:9;44329:18;44322:48;44387:76;44458:4;44449:6;44387:76;:::i;:::-;44379:84;;43830:640;;;;;;;:::o;44476:141::-;44532:5;44563:6;44557:13;44548:22;;44579:32;44605:5;44579:32;:::i;:::-;44476:141;;;;:::o;44623:349::-;44692:6;44741:2;44729:9;44720:7;44716:23;44712:32;44709:119;;;44747:79;;:::i;:::-;44709:119;44867:1;44892:63;44947:7;44938:6;44927:9;44923:22;44892:63;:::i;:::-;44882:73;;44838:127;44623:349;;;;:::o

Swarm Source

ipfs://535bf5bddfc723c215dca5e37988eb3113f654dbeee6d181907e311faf3d039c

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.