ETH Price: $3,406.47 (+3.38%)

Token

BYOPills (BYOPILL)
 

Overview

Max Total Supply

10,000 BYOPILL

Holders

2,793

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
the73.eth
Balance
2 BYOPILL
0x74e225269EFfAcEE134aadb51aa135ad066F55b8
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

10,000 UNIQUE PROCEDURALLY GENERATED PILLS.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
BYOPill

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-07-15
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol

/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 tokenId) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
      * @dev Safely transfers `tokenId` token from `from` to `to`.
      *
      * Requirements:
      *
      * - `from` cannot be the zero address.
      * - `to` cannot be the zero address.
      * - `tokenId` token must exist and be owned by `from`.
      * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
      * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
      *
      * Emits a {Transfer} event.
      */
    function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol

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

// File: @openzeppelin/contracts/utils/Context.sol

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

// File: @openzeppelin/contracts/utils/Strings.sol

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

}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/ERC721/ERC721.sol

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. 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 {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev 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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    // solhint-disable-next-line no-inline-assembly
                    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` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol

/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol

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

// File: contracts/BYOPill.sol
// ,,,,,,................ THE BYOPILL RESEARCH FACILITY ,,,,,,.....................
// ,,,,,,................                                       ................,.,
// ,,..............                                                 . .............
// .............                                                        ...........
// ...........                                                            .........
// ........ .                                                               .......
// ........         (#////*(#(/#/#                                          .......
// ......         ###(((((.((////////*(/,/&/(((*                             ......
// ....         ,######((((.(*******(&&&&###........,,,..//%                  .....
//              (######(#####((****(((((((((,*,,,*/(//(,..,,*/(                 ...
//              *((((((((,### .##(&&&&&&&&**,***,**,/*/*/%,,***/               ....
//               ,(((((((((((.((((%%%&&&&#((((//(/(#%#*(##,,***/*               ...
//                . (/(((*((/((((/#%####%(//(///(#%######(,******                ..
//               ..,**/////(/(///.(#######//(//(/(((/((((,******,                ..
//                     ....,,**//////%/((((((**//////////////(/....             ...
//                               ....,,,**//////(#(####((((/,,,,,........       ...
//                                         ...,,****////////***,,......          ..
//                                                   ............                 .
//                                                                                .
// ,,,,,,.............................,,,,.....,,,,,,...,,,,,,.....................
// Uh-oh, you found our synthesis composition ...
// Visit our discord: https://discord.gg/byopills

contract BYOPill is ERC721Enumerable, Ownable {

    // Safemath or else things go wrong ...
    using SafeMath for uint256;

    // Struct definitions
    struct PillInfo {
        uint256 synthesis_date;
    }

    // Keep track of information .......
    mapping(uint256 => PillInfo) private m_PillDetails;         // Mapping of each token to its details
    
    // Private members
    string private m_BaseURI = "";                              // Base URI

    // Public members
    uint256 public MAX_PILLS;                                   // Max pill supply
    uint256 public m_PillPrice = 60000000000000000;             // 0.06 ETH
                            
    uint public m_MaxPillPurchase = 15;                         // Max pill quantity purchase per mint call
    bool public m_IsSaleActive = false;                         // Is sale active ?
    string public m_Provenance = "";                            // Concatenation of hash data for all pills.

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI,
        uint256 maxSupply
    ) ERC721(name, symbol) {
        MAX_PILLS = maxSupply;
        m_BaseURI = baseURI;
    }

    // withdrawBalance
    //  -   Standard withdraw function for contract balance
    function withdrawBalance() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    // Reserve pills
    //  -   Reserves and mints pill to owner
    //  -   Can only happen pre-sale
    function reservePills(uint256 quantity) public onlyOwner {
        uint256 synthesisDate = block.timestamp;
        for(uint i = 0; i < quantity; i++) {
            uint mintIndex = totalSupply();
            if (mintIndex < MAX_PILLS) {
                _safeMint(msg.sender, mintIndex);
                m_PillDetails[mintIndex] = PillInfo (synthesisDate);
            }
        }
    }

    // Mint pill
    //  -   Mints pills by quantities
    //  -   Can only happen during sale
    function mintPill(uint numberOfTokens) public payable  {
        // Perform some stress checks before proceeding
        require(numberOfTokens > 0, "Quantity must be at least 1");
        require(m_IsSaleActive, "Sale must be active to mint pill.");
        require(
            totalSupply().add(numberOfTokens) <= MAX_PILLS,
            'Only 10,000 pills are mintable !'
        );
        require(numberOfTokens <= m_MaxPillPurchase, "Can only mint set pills at a time.");
        require(m_PillPrice.mul(numberOfTokens) <= msg.value, 'Ethereum sent is not sufficient.');

        // Perform the minting process
        uint256 synthesisDate = block.timestamp;
        for(uint i = 0; i < numberOfTokens; i++) {
            uint mintIndex = totalSupply();
            if (totalSupply() < MAX_PILLS) {
                _safeMint(msg.sender, mintIndex);
                 m_PillDetails[mintIndex] = PillInfo (synthesisDate);
            }
        }
    }

    // toggleSale
    //  -   Toggles sale on/off
    function toggleSale() public onlyOwner {
        m_IsSaleActive = !m_IsSaleActive;
    }

    // setMaxQuantityPerMint
    //  -   Sets the max quantity of pills that can be minted at once
    function setMaxQuantityPerMint (uint256 quantity) public onlyOwner {
        m_MaxPillPurchase = quantity;
    }
    
    // setBaseURI
    //  -   Sets the base URL for NFT metadata
    function setBaseURI(string memory baseURI) external onlyOwner() {
        m_BaseURI = baseURI;
    }

    // _baseURI
    //  -  Returns the current base URL
    function _baseURI() internal view override returns (string memory) {
        return m_BaseURI;
    }

    // setProvenance
    //  -   Sets the provenance hash
    function setProvenance(string memory _provenance)
        external
        onlyOwner
    {
        m_Provenance = _provenance;
    }

    // getPillInfo
    //  -   Returns on chain pill information
    function getPillInfo(uint256 tokenId) public view returns(PillInfo memory info) {
        require(_exists(tokenId), "That pill has not been minted yet.");
        return m_PillDetails[tokenId];
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI","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_PILLS","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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPillInfo","outputs":[{"components":[{"internalType":"uint256","name":"synthesis_date","type":"uint256"}],"internalType":"struct BYOPill.PillInfo","name":"info","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m_IsSaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m_MaxPillPurchase","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m_PillPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"m_Provenance","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPill","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"reservePills","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setMaxQuantityPerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_provenance","type":"string"}],"name":"setProvenance","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawBalance","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600c90805190602001906200002b929190620001ca565b5066d529ae9e860000600e55600f80556000601060006101000a81548160ff02191690831515021790555060405180602001604052806000815250601190805190602001906200007d929190620001ca565b503480156200008b57600080fd5b506040516200499e3803806200499e8339818101604052810190620000b1919062000303565b83838160009080519060200190620000cb929190620001ca565b508060019080519060200190620000e4929190620001ca565b5050506000620000f9620001c260201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35080600d8190555081600c9080519060200190620001b7929190620001ca565b50505050506200054e565b600033905090565b828054620001d89062000459565b90600052602060002090601f016020900481019282620001fc576000855562000248565b82601f106200021757805160ff191683800117855562000248565b8280016001018555821562000248579182015b82811115620002475782518255916020019190600101906200022a565b5b5090506200025791906200025b565b5090565b5b80821115620002765760008160009055506001016200025c565b5090565b6000620002916200028b84620003e3565b620003ba565b905082815260208101848484011115620002aa57600080fd5b620002b784828562000423565b509392505050565b600082601f830112620002d157600080fd5b8151620002e38482602086016200027a565b91505092915050565b600081519050620002fd8162000534565b92915050565b600080600080608085870312156200031a57600080fd5b600085015167ffffffffffffffff8111156200033557600080fd5b6200034387828801620002bf565b945050602085015167ffffffffffffffff8111156200036157600080fd5b6200036f87828801620002bf565b935050604085015167ffffffffffffffff8111156200038d57600080fd5b6200039b87828801620002bf565b9250506060620003ae87828801620002ec565b91505092959194509250565b6000620003c6620003d9565b9050620003d482826200048f565b919050565b6000604051905090565b600067ffffffffffffffff821115620004015762000400620004f4565b5b6200040c8262000523565b9050602081019050919050565b6000819050919050565b60005b838110156200044357808201518184015260208101905062000426565b8381111562000453576000848401525b50505050565b600060028204905060018216806200047257607f821691505b60208210811415620004895762000488620004c5565b5b50919050565b6200049a8262000523565b810181811067ffffffffffffffff82111715620004bc57620004bb620004f4565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b6200053f8162000419565b81146200054b57600080fd5b50565b614440806200055e6000396000f3fe6080604052600436106101e35760003560e01c806370a0823111610102578063be8baa4f11610095578063de4d12b311610064578063de4d12b3146106d1578063e985e9c5146106fc578063f2fde38b14610739578063ffe630b514610762576101e3565b8063be8baa4f14610624578063c82c0ced1461064d578063c87b56dd14610678578063d489b548146106b5576101e3565b806395d89b41116100d157806395d89b411461056a578063a22cb46514610595578063b4f90dab146105be578063b88d4fde146105fb576101e3565b806370a08231146104d4578063715018a6146105115780637d8966e4146105285780638da5cb5b1461053f576101e3565b806331e15e5c1161017a5780634f6ccce7116101495780634f6ccce71461041a57806355f804b3146104575780635fd8c710146104805780636352211e14610497576101e3565b806331e15e5c1461037057806342842e0e1461039b57806342e2c566146103c457806347de1525146103ef576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e1578063290b2a0f1461030a5780632f745c5914610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613014565b61078b565b60405161021c919061359e565b60405180910390f35b34801561023157600080fd5b5061023a610805565b60405161024791906135b9565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130a7565b610897565b6040516102849190613537565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612fd8565b61091c565b005b3480156102c257600080fd5b506102cb610a34565b6040516102d891906138f6565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612ed2565b610a41565b005b34801561031657600080fd5b50610331600480360381019061032c91906130a7565b610aa1565b005b34801561033f57600080fd5b5061035a60048036038101906103559190612fd8565b610b27565b60405161036791906138f6565b60405180910390f35b34801561037c57600080fd5b50610385610bcc565b60405161039291906135b9565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190612ed2565b610c5a565b005b3480156103d057600080fd5b506103d9610c7a565b6040516103e691906138f6565b60405180910390f35b3480156103fb57600080fd5b50610404610c80565b604051610411919061359e565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c91906130a7565b610c93565b60405161044e91906138f6565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613066565b610d2a565b005b34801561048c57600080fd5b50610495610dc0565b005b3480156104a357600080fd5b506104be60048036038101906104b991906130a7565b610e8b565b6040516104cb9190613537565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e6d565b610f3d565b60405161050891906138f6565b60405180910390f35b34801561051d57600080fd5b50610526610ff5565b005b34801561053457600080fd5b5061053d611132565b005b34801561054b57600080fd5b506105546111da565b6040516105619190613537565b60405180910390f35b34801561057657600080fd5b5061057f611204565b60405161058c91906135b9565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612f9c565b611296565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906130a7565b611417565b6040516105f291906138db565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612f21565b611496565b005b34801561063057600080fd5b5061064b600480360381019061064691906130a7565b6114f8565b005b34801561065957600080fd5b506106626115ed565b60405161066f91906138f6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906130a7565b6115f3565b6040516106ac91906135b9565b60405180910390f35b6106cf60048036038101906106ca91906130a7565b61169a565b005b3480156106dd57600080fd5b506106e66118a6565b6040516106f391906138f6565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612e96565b6118ac565b604051610730919061359e565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190612e6d565b611940565b005b34801561076e57600080fd5b5061078960048036038101906107849190613066565b611aec565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fe57506107fd82611b82565b5b9050919050565b60606000805461081490613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461084090613ba6565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611c64565b6108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906137bb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092782610e8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f9061385b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b7611cd0565b73ffffffffffffffffffffffffffffffffffffffff1614806109e657506109e5816109e0611cd0565b6118ac565b5b610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061371b565b60405180910390fd5b610a2f8383611cd8565b505050565b6000600880549050905090565b610a52610a4c611cd0565b82611d91565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a889061389b565b60405180910390fd5b610a9c838383611e6f565b505050565b610aa9611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610ac76111da565b73ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b14906137db565b60405180910390fd5b80600f8190555050565b6000610b3283610f3d565b8210610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906135fb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60118054610bd990613ba6565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590613ba6565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b505050505081565b610c7583838360405180602001604052806000815250611496565b505050565b600f5481565b601060009054906101000a900460ff1681565b6000610c9d610a34565b8210610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd5906138bb565b60405180910390fd5b60088281548110610d18577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d32611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610d506111da565b73ffffffffffffffffffffffffffffffffffffffff1614610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906137db565b60405180910390fd5b80600c9080519060200190610dbc929190612c7e565b5050565b610dc8611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610de66111da565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906137db565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e87573d6000803e3d6000fd5b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b9061375b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa59061373b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ffd611cd0565b73ffffffffffffffffffffffffffffffffffffffff1661101b6111da565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61113a611cd0565b73ffffffffffffffffffffffffffffffffffffffff166111586111da565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a5906137db565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461121390613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461123f90613ba6565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b5050505050905090565b61129e611cd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611303906136bb565b60405180910390fd5b8060056000611319611cd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113c6611cd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161140b919061359e565b60405180910390a35050565b61141f612d04565b61142882611c64565b611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e906136db565b60405180910390fd5b600b60008381526020019081526020016000206040518060200160405290816000820154815250509050919050565b6114a76114a1611cd0565b83611d91565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd9061389b565b60405180910390fd5b6114f2848484846120cb565b50505050565b611500611cd0565b73ffffffffffffffffffffffffffffffffffffffff1661151e6111da565b73ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906137db565b60405180910390fd5b600042905060005b828110156115e857600061158e610a34565b9050600d548110156115d4576115a43382612127565b604051806020016040528084815250600b6000838152602001908152602001600020600082015181600001559050505b5080806115e090613c09565b91505061157c565b505050565b600d5481565b60606115fe82611c64565b61163d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116349061381b565b60405180910390fd5b6000611647612145565b905060008151116116675760405180602001604052806000815250611692565b80611671846121d7565b604051602001611682929190613513565b6040516020818303038152906040525b915050919050565b600081116116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061387b565b60405180910390fd5b601060009054906101000a900460ff1661172c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117239061383b565b60405180910390fd5b600d546117498261173b610a34565b61238490919063ffffffff16565b111561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061363b565b60405180910390fd5b600f548111156117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906135db565b60405180910390fd5b346117e582600e5461239a90919063ffffffff16565b1115611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d9061379b565b60405180910390fd5b600042905060005b828110156118a1576000611840610a34565b9050600d5461184d610a34565b101561188d5761185d3382612127565b604051806020016040528084815250600b6000838152602001908152602001600020600082015181600001559050505b50808061189990613c09565b91505061182e565b505050565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611948611cd0565b73ffffffffffffffffffffffffffffffffffffffff166119666111da565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061365b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611af4611cd0565b73ffffffffffffffffffffffffffffffffffffffff16611b126111da565b73ffffffffffffffffffffffffffffffffffffffff1614611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906137db565b60405180910390fd5b8060119080519060200190611b7e929190612c7e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c4d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c5d5750611c5c826123b0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4b83610e8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9c82611c64565b611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906136fb565b60405180910390fd5b6000611de683610e8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5557508373ffffffffffffffffffffffffffffffffffffffff16611e3d84610897565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e665750611e6581856118ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8f82610e8b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906137fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061369b565b60405180910390fd5b611f6083838361241a565b611f6b600082611cd8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbb9190613abc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201291906139db565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120d6848484611e6f565b6120e28484848461252e565b612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121189061361b565b60405180910390fd5b50505050565b6121418282604051806020016040528060008152506126c5565b5050565b6060600c805461215490613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461218090613ba6565b80156121cd5780601f106121a2576101008083540402835291602001916121cd565b820191906000526020600020905b8154815290600101906020018083116121b057829003601f168201915b5050505050905090565b6060600082141561221f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061237f565b600082905060005b6000821461225157808061223a90613c09565b915050600a8261224a9190613a31565b9150612227565b60008167ffffffffffffffff811115612293577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122c55781602001600182028036833780820191505090505b5090505b60008514612378576001826122de9190613abc565b9150600a856122ed9190613c52565b60306122f991906139db565b60f81b818381518110612335577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123719190613a31565b94506122c9565b8093505050505b919050565b6000818361239291906139db565b905092915050565b600081836123a89190613a62565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612425838383612720565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124685761246381612725565b6124a7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124a6576124a5838261276e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ea576124e5816128db565b612529565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612528576125278282612a1e565b5b5b505050565b600061254f8473ffffffffffffffffffffffffffffffffffffffff16612a9d565b156126b8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612578611cd0565b8786866040518563ffffffff1660e01b815260040161259a9493929190613552565b602060405180830381600087803b1580156125b457600080fd5b505af19250505080156125e557506040513d601f19601f820116820180604052508101906125e2919061303d565b60015b612668573d8060008114612615576040519150601f19603f3d011682016040523d82523d6000602084013e61261a565b606091505b50600081511415612660576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126579061361b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126bd565b600190505b949350505050565b6126cf8383612ab0565b6126dc600084848461252e565b61271b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127129061361b565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161277b84610f3d565b6127859190613abc565b905060006007600084815260200190815260200160002054905081811461286a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128ef9190613abc565b9050600060096000848152602001908152602001600020549050600060088381548110612945577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061298d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a2983610f3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b179061377b565b60405180910390fd5b612b2981611c64565b15612b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b609061367b565b60405180910390fd5b612b756000838361241a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc591906139db565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c8a90613ba6565b90600052602060002090601f016020900481019282612cac5760008555612cf3565b82601f10612cc557805160ff1916838001178555612cf3565b82800160010185558215612cf3579182015b82811115612cf2578251825591602001919060010190612cd7565b5b509050612d009190612d17565b5090565b6040518060200160405280600081525090565b5b80821115612d30576000816000905550600101612d18565b5090565b6000612d47612d4284613936565b613911565b905082815260208101848484011115612d5f57600080fd5b612d6a848285613b64565b509392505050565b6000612d85612d8084613967565b613911565b905082815260208101848484011115612d9d57600080fd5b612da8848285613b64565b509392505050565b600081359050612dbf816143ae565b92915050565b600081359050612dd4816143c5565b92915050565b600081359050612de9816143dc565b92915050565b600081519050612dfe816143dc565b92915050565b600082601f830112612e1557600080fd5b8135612e25848260208601612d34565b91505092915050565b600082601f830112612e3f57600080fd5b8135612e4f848260208601612d72565b91505092915050565b600081359050612e67816143f3565b92915050565b600060208284031215612e7f57600080fd5b6000612e8d84828501612db0565b91505092915050565b60008060408385031215612ea957600080fd5b6000612eb785828601612db0565b9250506020612ec885828601612db0565b9150509250929050565b600080600060608486031215612ee757600080fd5b6000612ef586828701612db0565b9350506020612f0686828701612db0565b9250506040612f1786828701612e58565b9150509250925092565b60008060008060808587031215612f3757600080fd5b6000612f4587828801612db0565b9450506020612f5687828801612db0565b9350506040612f6787828801612e58565b925050606085013567ffffffffffffffff811115612f8457600080fd5b612f9087828801612e04565b91505092959194509250565b60008060408385031215612faf57600080fd5b6000612fbd85828601612db0565b9250506020612fce85828601612dc5565b9150509250929050565b60008060408385031215612feb57600080fd5b6000612ff985828601612db0565b925050602061300a85828601612e58565b9150509250929050565b60006020828403121561302657600080fd5b600061303484828501612dda565b91505092915050565b60006020828403121561304f57600080fd5b600061305d84828501612def565b91505092915050565b60006020828403121561307857600080fd5b600082013567ffffffffffffffff81111561309257600080fd5b61309e84828501612e2e565b91505092915050565b6000602082840312156130b957600080fd5b60006130c784828501612e58565b91505092915050565b6130d981613af0565b82525050565b6130e881613b02565b82525050565b60006130f982613998565b61310381856139ae565b9350613113818560208601613b73565b61311c81613d3f565b840191505092915050565b6000613132826139a3565b61313c81856139bf565b935061314c818560208601613b73565b61315581613d3f565b840191505092915050565b600061316b826139a3565b61317581856139d0565b9350613185818560208601613b73565b80840191505092915050565b600061319e6022836139bf565b91506131a982613d50565b604082019050919050565b60006131c1602b836139bf565b91506131cc82613d9f565b604082019050919050565b60006131e46032836139bf565b91506131ef82613dee565b604082019050919050565b60006132076020836139bf565b915061321282613e3d565b602082019050919050565b600061322a6026836139bf565b915061323582613e66565b604082019050919050565b600061324d601c836139bf565b915061325882613eb5565b602082019050919050565b60006132706024836139bf565b915061327b82613ede565b604082019050919050565b60006132936019836139bf565b915061329e82613f2d565b602082019050919050565b60006132b66022836139bf565b91506132c182613f56565b604082019050919050565b60006132d9602c836139bf565b91506132e482613fa5565b604082019050919050565b60006132fc6038836139bf565b915061330782613ff4565b604082019050919050565b600061331f602a836139bf565b915061332a82614043565b604082019050919050565b60006133426029836139bf565b915061334d82614092565b604082019050919050565b60006133656020836139bf565b9150613370826140e1565b602082019050919050565b60006133886020836139bf565b91506133938261410a565b602082019050919050565b60006133ab602c836139bf565b91506133b682614133565b604082019050919050565b60006133ce6020836139bf565b91506133d982614182565b602082019050919050565b60006133f16029836139bf565b91506133fc826141ab565b604082019050919050565b6000613414602f836139bf565b915061341f826141fa565b604082019050919050565b60006134376021836139bf565b915061344282614249565b604082019050919050565b600061345a6021836139bf565b915061346582614298565b604082019050919050565b600061347d601b836139bf565b9150613488826142e7565b602082019050919050565b60006134a06031836139bf565b91506134ab82614310565b604082019050919050565b60006134c3602c836139bf565b91506134ce8261435f565b604082019050919050565b6020820160008201516134ef60008501826134f5565b50505050565b6134fe81613b5a565b82525050565b61350d81613b5a565b82525050565b600061351f8285613160565b915061352b8284613160565b91508190509392505050565b600060208201905061354c60008301846130d0565b92915050565b600060808201905061356760008301876130d0565b61357460208301866130d0565b6135816040830185613504565b818103606083015261359381846130ee565b905095945050505050565b60006020820190506135b360008301846130df565b92915050565b600060208201905081810360008301526135d38184613127565b905092915050565b600060208201905081810360008301526135f481613191565b9050919050565b60006020820190508181036000830152613614816131b4565b9050919050565b60006020820190508181036000830152613634816131d7565b9050919050565b60006020820190508181036000830152613654816131fa565b9050919050565b600060208201905081810360008301526136748161321d565b9050919050565b6000602082019050818103600083015261369481613240565b9050919050565b600060208201905081810360008301526136b481613263565b9050919050565b600060208201905081810360008301526136d481613286565b9050919050565b600060208201905081810360008301526136f4816132a9565b9050919050565b60006020820190508181036000830152613714816132cc565b9050919050565b60006020820190508181036000830152613734816132ef565b9050919050565b6000602082019050818103600083015261375481613312565b9050919050565b6000602082019050818103600083015261377481613335565b9050919050565b6000602082019050818103600083015261379481613358565b9050919050565b600060208201905081810360008301526137b48161337b565b9050919050565b600060208201905081810360008301526137d48161339e565b9050919050565b600060208201905081810360008301526137f4816133c1565b9050919050565b60006020820190508181036000830152613814816133e4565b9050919050565b6000602082019050818103600083015261383481613407565b9050919050565b600060208201905081810360008301526138548161342a565b9050919050565b600060208201905081810360008301526138748161344d565b9050919050565b6000602082019050818103600083015261389481613470565b9050919050565b600060208201905081810360008301526138b481613493565b9050919050565b600060208201905081810360008301526138d4816134b6565b9050919050565b60006020820190506138f060008301846134d9565b92915050565b600060208201905061390b6000830184613504565b92915050565b600061391b61392c565b90506139278282613bd8565b919050565b6000604051905090565b600067ffffffffffffffff82111561395157613950613d10565b5b61395a82613d3f565b9050602081019050919050565b600067ffffffffffffffff82111561398257613981613d10565b5b61398b82613d3f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139e682613b5a565b91506139f183613b5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2657613a25613c83565b5b828201905092915050565b6000613a3c82613b5a565b9150613a4783613b5a565b925082613a5757613a56613cb2565b5b828204905092915050565b6000613a6d82613b5a565b9150613a7883613b5a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ab157613ab0613c83565b5b828202905092915050565b6000613ac782613b5a565b9150613ad283613b5a565b925082821015613ae557613ae4613c83565b5b828203905092915050565b6000613afb82613b3a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b91578082015181840152602081019050613b76565b83811115613ba0576000848401525b50505050565b60006002820490506001821680613bbe57607f821691505b60208210811415613bd257613bd1613ce1565b5b50919050565b613be182613d3f565b810181811067ffffffffffffffff82111715613c0057613bff613d10565b5b80604052505050565b6000613c1482613b5a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c4757613c46613c83565b5b600182019050919050565b6000613c5d82613b5a565b9150613c6883613b5a565b925082613c7857613c77613cb2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e74207365742070696c6c7320617420612074696d60008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f6e6c792031302c3030302070696c6c7320617265206d696e7461626c652021600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546861742070696c6c20686173206e6f74206265656e206d696e74656420796560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f457468657265756d2073656e74206973206e6f742073756666696369656e742e600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742070696c6c60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206d757374206265206174206c6561737420310000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6143b781613af0565b81146143c257600080fd5b50565b6143ce81613b02565b81146143d957600080fd5b50565b6143e581613b0e565b81146143f057600080fd5b50565b6143fc81613b5a565b811461440757600080fd5b5056fea264697066735822122065f89d5d552cf2f2ae138cfa6772e525959417616be4b82fc7db97f284145d9a64736f6c63430008040033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000842594f50696c6c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000742594f50494c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806370a0823111610102578063be8baa4f11610095578063de4d12b311610064578063de4d12b3146106d1578063e985e9c5146106fc578063f2fde38b14610739578063ffe630b514610762576101e3565b8063be8baa4f14610624578063c82c0ced1461064d578063c87b56dd14610678578063d489b548146106b5576101e3565b806395d89b41116100d157806395d89b411461056a578063a22cb46514610595578063b4f90dab146105be578063b88d4fde146105fb576101e3565b806370a08231146104d4578063715018a6146105115780637d8966e4146105285780638da5cb5b1461053f576101e3565b806331e15e5c1161017a5780634f6ccce7116101495780634f6ccce71461041a57806355f804b3146104575780635fd8c710146104805780636352211e14610497576101e3565b806331e15e5c1461037057806342842e0e1461039b57806342e2c566146103c457806347de1525146103ef576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e1578063290b2a0f1461030a5780632f745c5914610333576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190613014565b61078b565b60405161021c919061359e565b60405180910390f35b34801561023157600080fd5b5061023a610805565b60405161024791906135b9565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906130a7565b610897565b6040516102849190613537565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af9190612fd8565b61091c565b005b3480156102c257600080fd5b506102cb610a34565b6040516102d891906138f6565b60405180910390f35b3480156102ed57600080fd5b5061030860048036038101906103039190612ed2565b610a41565b005b34801561031657600080fd5b50610331600480360381019061032c91906130a7565b610aa1565b005b34801561033f57600080fd5b5061035a60048036038101906103559190612fd8565b610b27565b60405161036791906138f6565b60405180910390f35b34801561037c57600080fd5b50610385610bcc565b60405161039291906135b9565b60405180910390f35b3480156103a757600080fd5b506103c260048036038101906103bd9190612ed2565b610c5a565b005b3480156103d057600080fd5b506103d9610c7a565b6040516103e691906138f6565b60405180910390f35b3480156103fb57600080fd5b50610404610c80565b604051610411919061359e565b60405180910390f35b34801561042657600080fd5b50610441600480360381019061043c91906130a7565b610c93565b60405161044e91906138f6565b60405180910390f35b34801561046357600080fd5b5061047e60048036038101906104799190613066565b610d2a565b005b34801561048c57600080fd5b50610495610dc0565b005b3480156104a357600080fd5b506104be60048036038101906104b991906130a7565b610e8b565b6040516104cb9190613537565b60405180910390f35b3480156104e057600080fd5b506104fb60048036038101906104f69190612e6d565b610f3d565b60405161050891906138f6565b60405180910390f35b34801561051d57600080fd5b50610526610ff5565b005b34801561053457600080fd5b5061053d611132565b005b34801561054b57600080fd5b506105546111da565b6040516105619190613537565b60405180910390f35b34801561057657600080fd5b5061057f611204565b60405161058c91906135b9565b60405180910390f35b3480156105a157600080fd5b506105bc60048036038101906105b79190612f9c565b611296565b005b3480156105ca57600080fd5b506105e560048036038101906105e091906130a7565b611417565b6040516105f291906138db565b60405180910390f35b34801561060757600080fd5b50610622600480360381019061061d9190612f21565b611496565b005b34801561063057600080fd5b5061064b600480360381019061064691906130a7565b6114f8565b005b34801561065957600080fd5b506106626115ed565b60405161066f91906138f6565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a91906130a7565b6115f3565b6040516106ac91906135b9565b60405180910390f35b6106cf60048036038101906106ca91906130a7565b61169a565b005b3480156106dd57600080fd5b506106e66118a6565b6040516106f391906138f6565b60405180910390f35b34801561070857600080fd5b50610723600480360381019061071e9190612e96565b6118ac565b604051610730919061359e565b60405180910390f35b34801561074557600080fd5b50610760600480360381019061075b9190612e6d565b611940565b005b34801561076e57600080fd5b5061078960048036038101906107849190613066565b611aec565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107fe57506107fd82611b82565b5b9050919050565b60606000805461081490613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461084090613ba6565b801561088d5780601f106108625761010080835404028352916020019161088d565b820191906000526020600020905b81548152906001019060200180831161087057829003601f168201915b5050505050905090565b60006108a282611c64565b6108e1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d8906137bb565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092782610e8b565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610998576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098f9061385b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109b7611cd0565b73ffffffffffffffffffffffffffffffffffffffff1614806109e657506109e5816109e0611cd0565b6118ac565b5b610a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a1c9061371b565b60405180910390fd5b610a2f8383611cd8565b505050565b6000600880549050905090565b610a52610a4c611cd0565b82611d91565b610a91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a889061389b565b60405180910390fd5b610a9c838383611e6f565b505050565b610aa9611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610ac76111da565b73ffffffffffffffffffffffffffffffffffffffff1614610b1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b14906137db565b60405180910390fd5b80600f8190555050565b6000610b3283610f3d565b8210610b73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6a906135fb565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60118054610bd990613ba6565b80601f0160208091040260200160405190810160405280929190818152602001828054610c0590613ba6565b8015610c525780601f10610c2757610100808354040283529160200191610c52565b820191906000526020600020905b815481529060010190602001808311610c3557829003601f168201915b505050505081565b610c7583838360405180602001604052806000815250611496565b505050565b600f5481565b601060009054906101000a900460ff1681565b6000610c9d610a34565b8210610cde576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd5906138bb565b60405180910390fd5b60088281548110610d18577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610d32611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610d506111da565b73ffffffffffffffffffffffffffffffffffffffff1614610da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9d906137db565b60405180910390fd5b80600c9080519060200190610dbc929190612c7e565b5050565b610dc8611cd0565b73ffffffffffffffffffffffffffffffffffffffff16610de66111da565b73ffffffffffffffffffffffffffffffffffffffff1614610e3c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e33906137db565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e87573d6000803e3d6000fd5b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2b9061375b565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa59061373b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610ffd611cd0565b73ffffffffffffffffffffffffffffffffffffffff1661101b6111da565b73ffffffffffffffffffffffffffffffffffffffff1614611071576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611068906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b61113a611cd0565b73ffffffffffffffffffffffffffffffffffffffff166111586111da565b73ffffffffffffffffffffffffffffffffffffffff16146111ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a5906137db565b60405180910390fd5b601060009054906101000a900460ff1615601060006101000a81548160ff021916908315150217905550565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461121390613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461123f90613ba6565b801561128c5780601f106112615761010080835404028352916020019161128c565b820191906000526020600020905b81548152906001019060200180831161126f57829003601f168201915b5050505050905090565b61129e611cd0565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561130c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611303906136bb565b60405180910390fd5b8060056000611319611cd0565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166113c6611cd0565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161140b919061359e565b60405180910390a35050565b61141f612d04565b61142882611c64565b611467576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145e906136db565b60405180910390fd5b600b60008381526020019081526020016000206040518060200160405290816000820154815250509050919050565b6114a76114a1611cd0565b83611d91565b6114e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114dd9061389b565b60405180910390fd5b6114f2848484846120cb565b50505050565b611500611cd0565b73ffffffffffffffffffffffffffffffffffffffff1661151e6111da565b73ffffffffffffffffffffffffffffffffffffffff1614611574576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156b906137db565b60405180910390fd5b600042905060005b828110156115e857600061158e610a34565b9050600d548110156115d4576115a43382612127565b604051806020016040528084815250600b6000838152602001908152602001600020600082015181600001559050505b5080806115e090613c09565b91505061157c565b505050565b600d5481565b60606115fe82611c64565b61163d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116349061381b565b60405180910390fd5b6000611647612145565b905060008151116116675760405180602001604052806000815250611692565b80611671846121d7565b604051602001611682929190613513565b6040516020818303038152906040525b915050919050565b600081116116dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116d49061387b565b60405180910390fd5b601060009054906101000a900460ff1661172c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117239061383b565b60405180910390fd5b600d546117498261173b610a34565b61238490919063ffffffff16565b111561178a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117819061363b565b60405180910390fd5b600f548111156117cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117c6906135db565b60405180910390fd5b346117e582600e5461239a90919063ffffffff16565b1115611826576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181d9061379b565b60405180910390fd5b600042905060005b828110156118a1576000611840610a34565b9050600d5461184d610a34565b101561188d5761185d3382612127565b604051806020016040528084815250600b6000838152602001908152602001600020600082015181600001559050505b50808061189990613c09565b91505061182e565b505050565b600e5481565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611948611cd0565b73ffffffffffffffffffffffffffffffffffffffff166119666111da565b73ffffffffffffffffffffffffffffffffffffffff16146119bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b3906137db565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a239061365b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b611af4611cd0565b73ffffffffffffffffffffffffffffffffffffffff16611b126111da565b73ffffffffffffffffffffffffffffffffffffffff1614611b68576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5f906137db565b60405180910390fd5b8060119080519060200190611b7e929190612c7e565b5050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611c4d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611c5d5750611c5c826123b0565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611d4b83610e8b565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d9c82611c64565b611ddb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dd2906136fb565b60405180910390fd5b6000611de683610e8b565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611e5557508373ffffffffffffffffffffffffffffffffffffffff16611e3d84610897565b73ffffffffffffffffffffffffffffffffffffffff16145b80611e665750611e6581856118ac565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611e8f82610e8b565b73ffffffffffffffffffffffffffffffffffffffff1614611ee5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611edc906137fb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611f55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4c9061369b565b60405180910390fd5b611f6083838361241a565b611f6b600082611cd8565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fbb9190613abc565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461201291906139db565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6120d6848484611e6f565b6120e28484848461252e565b612121576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121189061361b565b60405180910390fd5b50505050565b6121418282604051806020016040528060008152506126c5565b5050565b6060600c805461215490613ba6565b80601f016020809104026020016040519081016040528092919081815260200182805461218090613ba6565b80156121cd5780601f106121a2576101008083540402835291602001916121cd565b820191906000526020600020905b8154815290600101906020018083116121b057829003601f168201915b5050505050905090565b6060600082141561221f576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061237f565b600082905060005b6000821461225157808061223a90613c09565b915050600a8261224a9190613a31565b9150612227565b60008167ffffffffffffffff811115612293577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122c55781602001600182028036833780820191505090505b5090505b60008514612378576001826122de9190613abc565b9150600a856122ed9190613c52565b60306122f991906139db565b60f81b818381518110612335577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123719190613a31565b94506122c9565b8093505050505b919050565b6000818361239291906139db565b905092915050565b600081836123a89190613a62565b905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612425838383612720565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124685761246381612725565b6124a7565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146124a6576124a5838261276e565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156124ea576124e5816128db565b612529565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612528576125278282612a1e565b5b5b505050565b600061254f8473ffffffffffffffffffffffffffffffffffffffff16612a9d565b156126b8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612578611cd0565b8786866040518563ffffffff1660e01b815260040161259a9493929190613552565b602060405180830381600087803b1580156125b457600080fd5b505af19250505080156125e557506040513d601f19601f820116820180604052508101906125e2919061303d565b60015b612668573d8060008114612615576040519150601f19603f3d011682016040523d82523d6000602084013e61261a565b606091505b50600081511415612660576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126579061361b565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506126bd565b600190505b949350505050565b6126cf8383612ab0565b6126dc600084848461252e565b61271b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127129061361b565b60405180910390fd5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161277b84610f3d565b6127859190613abc565b905060006007600084815260200190815260200160002054905081811461286a576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506128ef9190613abc565b9050600060096000848152602001908152602001600020549050600060088381548110612945577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061298d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a02577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612a2983610f3d565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b20576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b179061377b565b60405180910390fd5b612b2981611c64565b15612b69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b609061367b565b60405180910390fd5b612b756000838361241a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc591906139db565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c8a90613ba6565b90600052602060002090601f016020900481019282612cac5760008555612cf3565b82601f10612cc557805160ff1916838001178555612cf3565b82800160010185558215612cf3579182015b82811115612cf2578251825591602001919060010190612cd7565b5b509050612d009190612d17565b5090565b6040518060200160405280600081525090565b5b80821115612d30576000816000905550600101612d18565b5090565b6000612d47612d4284613936565b613911565b905082815260208101848484011115612d5f57600080fd5b612d6a848285613b64565b509392505050565b6000612d85612d8084613967565b613911565b905082815260208101848484011115612d9d57600080fd5b612da8848285613b64565b509392505050565b600081359050612dbf816143ae565b92915050565b600081359050612dd4816143c5565b92915050565b600081359050612de9816143dc565b92915050565b600081519050612dfe816143dc565b92915050565b600082601f830112612e1557600080fd5b8135612e25848260208601612d34565b91505092915050565b600082601f830112612e3f57600080fd5b8135612e4f848260208601612d72565b91505092915050565b600081359050612e67816143f3565b92915050565b600060208284031215612e7f57600080fd5b6000612e8d84828501612db0565b91505092915050565b60008060408385031215612ea957600080fd5b6000612eb785828601612db0565b9250506020612ec885828601612db0565b9150509250929050565b600080600060608486031215612ee757600080fd5b6000612ef586828701612db0565b9350506020612f0686828701612db0565b9250506040612f1786828701612e58565b9150509250925092565b60008060008060808587031215612f3757600080fd5b6000612f4587828801612db0565b9450506020612f5687828801612db0565b9350506040612f6787828801612e58565b925050606085013567ffffffffffffffff811115612f8457600080fd5b612f9087828801612e04565b91505092959194509250565b60008060408385031215612faf57600080fd5b6000612fbd85828601612db0565b9250506020612fce85828601612dc5565b9150509250929050565b60008060408385031215612feb57600080fd5b6000612ff985828601612db0565b925050602061300a85828601612e58565b9150509250929050565b60006020828403121561302657600080fd5b600061303484828501612dda565b91505092915050565b60006020828403121561304f57600080fd5b600061305d84828501612def565b91505092915050565b60006020828403121561307857600080fd5b600082013567ffffffffffffffff81111561309257600080fd5b61309e84828501612e2e565b91505092915050565b6000602082840312156130b957600080fd5b60006130c784828501612e58565b91505092915050565b6130d981613af0565b82525050565b6130e881613b02565b82525050565b60006130f982613998565b61310381856139ae565b9350613113818560208601613b73565b61311c81613d3f565b840191505092915050565b6000613132826139a3565b61313c81856139bf565b935061314c818560208601613b73565b61315581613d3f565b840191505092915050565b600061316b826139a3565b61317581856139d0565b9350613185818560208601613b73565b80840191505092915050565b600061319e6022836139bf565b91506131a982613d50565b604082019050919050565b60006131c1602b836139bf565b91506131cc82613d9f565b604082019050919050565b60006131e46032836139bf565b91506131ef82613dee565b604082019050919050565b60006132076020836139bf565b915061321282613e3d565b602082019050919050565b600061322a6026836139bf565b915061323582613e66565b604082019050919050565b600061324d601c836139bf565b915061325882613eb5565b602082019050919050565b60006132706024836139bf565b915061327b82613ede565b604082019050919050565b60006132936019836139bf565b915061329e82613f2d565b602082019050919050565b60006132b66022836139bf565b91506132c182613f56565b604082019050919050565b60006132d9602c836139bf565b91506132e482613fa5565b604082019050919050565b60006132fc6038836139bf565b915061330782613ff4565b604082019050919050565b600061331f602a836139bf565b915061332a82614043565b604082019050919050565b60006133426029836139bf565b915061334d82614092565b604082019050919050565b60006133656020836139bf565b9150613370826140e1565b602082019050919050565b60006133886020836139bf565b91506133938261410a565b602082019050919050565b60006133ab602c836139bf565b91506133b682614133565b604082019050919050565b60006133ce6020836139bf565b91506133d982614182565b602082019050919050565b60006133f16029836139bf565b91506133fc826141ab565b604082019050919050565b6000613414602f836139bf565b915061341f826141fa565b604082019050919050565b60006134376021836139bf565b915061344282614249565b604082019050919050565b600061345a6021836139bf565b915061346582614298565b604082019050919050565b600061347d601b836139bf565b9150613488826142e7565b602082019050919050565b60006134a06031836139bf565b91506134ab82614310565b604082019050919050565b60006134c3602c836139bf565b91506134ce8261435f565b604082019050919050565b6020820160008201516134ef60008501826134f5565b50505050565b6134fe81613b5a565b82525050565b61350d81613b5a565b82525050565b600061351f8285613160565b915061352b8284613160565b91508190509392505050565b600060208201905061354c60008301846130d0565b92915050565b600060808201905061356760008301876130d0565b61357460208301866130d0565b6135816040830185613504565b818103606083015261359381846130ee565b905095945050505050565b60006020820190506135b360008301846130df565b92915050565b600060208201905081810360008301526135d38184613127565b905092915050565b600060208201905081810360008301526135f481613191565b9050919050565b60006020820190508181036000830152613614816131b4565b9050919050565b60006020820190508181036000830152613634816131d7565b9050919050565b60006020820190508181036000830152613654816131fa565b9050919050565b600060208201905081810360008301526136748161321d565b9050919050565b6000602082019050818103600083015261369481613240565b9050919050565b600060208201905081810360008301526136b481613263565b9050919050565b600060208201905081810360008301526136d481613286565b9050919050565b600060208201905081810360008301526136f4816132a9565b9050919050565b60006020820190508181036000830152613714816132cc565b9050919050565b60006020820190508181036000830152613734816132ef565b9050919050565b6000602082019050818103600083015261375481613312565b9050919050565b6000602082019050818103600083015261377481613335565b9050919050565b6000602082019050818103600083015261379481613358565b9050919050565b600060208201905081810360008301526137b48161337b565b9050919050565b600060208201905081810360008301526137d48161339e565b9050919050565b600060208201905081810360008301526137f4816133c1565b9050919050565b60006020820190508181036000830152613814816133e4565b9050919050565b6000602082019050818103600083015261383481613407565b9050919050565b600060208201905081810360008301526138548161342a565b9050919050565b600060208201905081810360008301526138748161344d565b9050919050565b6000602082019050818103600083015261389481613470565b9050919050565b600060208201905081810360008301526138b481613493565b9050919050565b600060208201905081810360008301526138d4816134b6565b9050919050565b60006020820190506138f060008301846134d9565b92915050565b600060208201905061390b6000830184613504565b92915050565b600061391b61392c565b90506139278282613bd8565b919050565b6000604051905090565b600067ffffffffffffffff82111561395157613950613d10565b5b61395a82613d3f565b9050602081019050919050565b600067ffffffffffffffff82111561398257613981613d10565b5b61398b82613d3f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006139e682613b5a565b91506139f183613b5a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613a2657613a25613c83565b5b828201905092915050565b6000613a3c82613b5a565b9150613a4783613b5a565b925082613a5757613a56613cb2565b5b828204905092915050565b6000613a6d82613b5a565b9150613a7883613b5a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ab157613ab0613c83565b5b828202905092915050565b6000613ac782613b5a565b9150613ad283613b5a565b925082821015613ae557613ae4613c83565b5b828203905092915050565b6000613afb82613b3a565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613b91578082015181840152602081019050613b76565b83811115613ba0576000848401525b50505050565b60006002820490506001821680613bbe57607f821691505b60208210811415613bd257613bd1613ce1565b5b50919050565b613be182613d3f565b810181811067ffffffffffffffff82111715613c0057613bff613d10565b5b80604052505050565b6000613c1482613b5a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c4757613c46613c83565b5b600182019050919050565b6000613c5d82613b5a565b9150613c6883613b5a565b925082613c7857613c77613cb2565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f43616e206f6e6c79206d696e74207365742070696c6c7320617420612074696d60008201527f652e000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f6e6c792031302c3030302070696c6c7320617265206d696e7461626c652021600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f546861742070696c6c20686173206e6f74206265656e206d696e74656420796560008201527f742e000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f457468657265756d2073656e74206973206e6f742073756666696369656e742e600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f53616c65206d7573742062652061637469766520746f206d696e742070696c6c60008201527f2e00000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f5175616e74697479206d757374206265206174206c6561737420310000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6143b781613af0565b81146143c257600080fd5b50565b6143ce81613b02565b81146143d957600080fd5b50565b6143e581613b0e565b81146143f057600080fd5b50565b6143fc81613b5a565b811461440757600080fd5b5056fea264697066735822122065f89d5d552cf2f2ae138cfa6772e525959417616be4b82fc7db97f284145d9a64736f6c63430008040033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002710000000000000000000000000000000000000000000000000000000000000000842594f50696c6c73000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000742594f50494c4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): BYOPills
Arg [1] : symbol (string): BYOPILL
Arg [2] : baseURI (string):
Arg [3] : maxSupply (uint256): 10000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000002710
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [5] : 42594f50696c6c73000000000000000000000000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [7] : 42594f50494c4c00000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51142:4273:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40911:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28184:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29644:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29181:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41564:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30534:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54467:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41232:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52033:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30910:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51839:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51948;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41754:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54660:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52468:150;;;;;;;;;;;;;:::i;:::-;;27878:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27608:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48752:148;;;;;;;;;;;;;:::i;:::-;;54268:90;;;;;;;;;;;;;:::i;:::-;;48101:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28353:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29937:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55210:202;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31132:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52732:395;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51648:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28528:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53233:975;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51732:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30303:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49055:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54998:137;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40911:237;41013:4;41052:35;41037:50;;;:11;:50;;;;:103;;;;41104:36;41128:11;41104:23;:36::i;:::-;41037:103;41030:110;;40911:237;;;:::o;28184:100::-;28238:13;28271:5;28264:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28184:100;:::o;29644:221::-;29720:7;29748:16;29756:7;29748;:16::i;:::-;29740:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;29833:15;:24;29849:7;29833:24;;;;;;;;;;;;;;;;;;;;;29826:31;;29644:221;;;:::o;29181:397::-;29262:13;29278:23;29293:7;29278:14;:23::i;:::-;29262:39;;29326:5;29320:11;;:2;:11;;;;29312:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;29406:5;29390:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;29415:37;29432:5;29439:12;:10;:12::i;:::-;29415:16;:37::i;:::-;29390:62;29382:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;29549:21;29558:2;29562:7;29549:8;:21::i;:::-;29181:397;;;:::o;41564:113::-;41625:7;41652:10;:17;;;;41645:24;;41564:113;:::o;30534:305::-;30695:41;30714:12;:10;:12::i;:::-;30728:7;30695:18;:41::i;:::-;30687:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;30803:28;30813:4;30819:2;30823:7;30803:9;:28::i;:::-;30534:305;;;:::o;54467:114::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54565:8:::1;54545:17;:28;;;;54467:114:::0;:::o;41232:256::-;41329:7;41365:23;41382:5;41365:16;:23::i;:::-;41357:5;:31;41349:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;41454:12;:19;41467:5;41454:19;;;;;;;;;;;;;;;:26;41474:5;41454:26;;;;;;;;;;;;41447:33;;41232:256;;;;:::o;52033:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;30910:151::-;31014:39;31031:4;31037:2;31041:7;31014:39;;;;;;;;;;;;:16;:39::i;:::-;30910:151;;;:::o;51839:34::-;;;;:::o;51948:::-;;;;;;;;;;;;;:::o;41754:233::-;41829:7;41865:30;:28;:30::i;:::-;41857:5;:38;41849:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;41962:10;41973:5;41962:17;;;;;;;;;;;;;;;;;;;;;;;;41955:24;;41754:233;;;:::o;54660:102::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54747:7:::1;54735:9;:19;;;;;;;;;;;;:::i;:::-;;54660:102:::0;:::o;52468:150::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52523:15:::1;52541:21;52523:39;;52581:10;52573:28;;:37;52602:7;52573:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;48392:1;52468:150::o:0;27878:239::-;27950:7;27970:13;27986:7;:16;27994:7;27986:16;;;;;;;;;;;;;;;;;;;;;27970:32;;28038:1;28021:19;;:5;:19;;;;28013:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28104:5;28097:12;;;27878:239;;;:::o;27608:208::-;27680:7;27725:1;27708:19;;:5;:19;;;;27700:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;27792:9;:16;27802:5;27792:16;;;;;;;;;;;;;;;;27785:23;;27608:208;;;:::o;48752:148::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48859:1:::1;48822:40;;48843:6;;;;;;;;;;;48822:40;;;;;;;;;;;;48890:1;48873:6;;:19;;;;;;;;;;;;;;;;;;48752:148::o:0;54268:90::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54336:14:::1;;;;;;;;;;;54335:15;54318:14;;:32;;;;;;;;;;;;;;;;;;54268:90::o:0;48101:87::-;48147:7;48174:6;;;;;;;;;;;48167:13;;48101:87;:::o;28353:104::-;28409:13;28442:7;28435:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28353:104;:::o;29937:295::-;30052:12;:10;:12::i;:::-;30040:24;;:8;:24;;;;30032:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;30152:8;30107:18;:32;30126:12;:10;:12::i;:::-;30107:32;;;;;;;;;;;;;;;:42;30140:8;30107:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;30205:8;30176:48;;30191:12;:10;:12::i;:::-;30176:48;;;30215:8;30176:48;;;;;;:::i;:::-;;;;;;;;29937:295;;:::o;55210:202::-;55268:20;;:::i;:::-;55309:16;55317:7;55309;:16::i;:::-;55301:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;55382:13;:22;55396:7;55382:22;;;;;;;;;;;55375:29;;;;;;;;;;;;;;;;;;;55210:202;;;:::o;31132:285::-;31264:41;31283:12;:10;:12::i;:::-;31297:7;31264:18;:41::i;:::-;31256:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;31370:39;31384:4;31390:2;31394:7;31403:5;31370:13;:39::i;:::-;31132:285;;;;:::o;52732:395::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52800:21:::1;52824:15;52800:39;;52854:6;52850:270;52870:8;52866:1;:12;52850:270;;;52900:14;52917:13;:11;:13::i;:::-;52900:30;;52961:9;;52949;:21;52945:164;;;52991:32;53001:10;53013:9;52991;:32::i;:::-;53069:24;;;;;;;;53079:13;53069:24;;::::0;53042:13:::1;:24;53056:9;53042:24;;;;;;;;;;;:51;;;;;;;;;;;52945:164;52850:270;52880:3;;;;;:::i;:::-;;;;52850:270;;;;48392:1;52732:395:::0;:::o;51648:24::-;;;;:::o;28528:360::-;28601:13;28635:16;28643:7;28635;:16::i;:::-;28627:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;28716:21;28740:10;:8;:10::i;:::-;28716:34;;28792:1;28774:7;28768:21;:25;:112;;;;;;;;;;;;;;;;;28833:7;28842:18;:7;:16;:18::i;:::-;28816:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28768:112;28761:119;;;28528:360;;;:::o;53233:975::-;53381:1;53364:14;:18;53356:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;53433:14;;;;;;;;;;;53425:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;53555:9;;53518:33;53536:14;53518:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:46;;53496:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;53661:17;;53643:14;:35;;53635:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53771:9;53736:31;53752:14;53736:11;;:15;;:31;;;;:::i;:::-;:44;;53728:89;;;;;;;;;;;;:::i;:::-;;;;;;;;;53870:21;53894:15;53870:39;;53924:6;53920:281;53940:14;53936:1;:18;53920:281;;;53976:14;53993:13;:11;:13::i;:::-;53976:30;;54041:9;;54025:13;:11;:13::i;:::-;:25;54021:169;;;54071:32;54081:10;54093:9;54071;:32::i;:::-;54150:24;;;;;;;;54160:13;54150:24;;;54123:13;:24;54137:9;54123:24;;;;;;;;;;;:51;;;;;;;;;;;54021:169;53920:281;53956:3;;;;;:::i;:::-;;;;53920:281;;;;53233:975;;:::o;51732:46::-;;;;:::o;30303:164::-;30400:4;30424:18;:25;30443:5;30424:25;;;;;;;;;;;;;;;:35;30450:8;30424:35;;;;;;;;;;;;;;;;;;;;;;;;;30417:42;;30303:164;;;;:::o;49055:244::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;49164:1:::1;49144:22;;:8;:22;;;;49136:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49254:8;49225:38;;49246:6;;;;;;;;;;;49225:38;;;;;;;;;;;;49283:8;49274:6;;:17;;;;;;;;;;;;;;;;;;49055:244:::0;:::o;54998:137::-;48332:12;:10;:12::i;:::-;48321:23;;:7;:5;:7::i;:::-;:23;;;48313:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55116:11:::1;55101:12;:26;;;;;;;;;;;;:::i;:::-;;54998:137:::0;:::o;27252:292::-;27354:4;27393:25;27378:40;;;:11;:40;;;;:105;;;;27450:33;27435:48;;;:11;:48;;;;27378:105;:158;;;;27500:36;27524:11;27500:23;:36::i;:::-;27378:158;27371:165;;27252:292;;;:::o;32884:127::-;32949:4;33001:1;32973:30;;:7;:16;32981:7;32973:16;;;;;;;;;;;;;;;;;;;;;:30;;;;32966:37;;32884:127;;;:::o;22647:98::-;22700:7;22727:10;22720:17;;22647:98;:::o;36761:174::-;36863:2;36836:15;:24;36852:7;36836:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;36919:7;36915:2;36881:46;;36890:23;36905:7;36890:14;:23::i;:::-;36881:46;;;;;;;;;;;;36761:174;;:::o;33178:348::-;33271:4;33296:16;33304:7;33296;:16::i;:::-;33288:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;33372:13;33388:23;33403:7;33388:14;:23::i;:::-;33372:39;;33441:5;33430:16;;:7;:16;;;:51;;;;33474:7;33450:31;;:20;33462:7;33450:11;:20::i;:::-;:31;;;33430:51;:87;;;;33485:32;33502:5;33509:7;33485:16;:32::i;:::-;33430:87;33422:96;;;33178:348;;;;:::o;36099:544::-;36224:4;36197:31;;:23;36212:7;36197:14;:23::i;:::-;:31;;;36189:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;36307:1;36293:16;;:2;:16;;;;36285:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;36363:39;36384:4;36390:2;36394:7;36363:20;:39::i;:::-;36467:29;36484:1;36488:7;36467:8;:29::i;:::-;36528:1;36509:9;:15;36519:4;36509:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;36557:1;36540:9;:13;36550:2;36540:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;36588:2;36569:7;:16;36577:7;36569:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;36627:7;36623:2;36608:27;;36617:4;36608:27;;;;;;;;;;;;36099:544;;;:::o;32299:272::-;32413:28;32423:4;32429:2;32433:7;32413:9;:28::i;:::-;32460:48;32483:4;32489:2;32493:7;32502:5;32460:22;:48::i;:::-;32452:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;32299:272;;;;:::o;33868:110::-;33944:26;33954:2;33958:7;33944:26;;;;;;;;;;;;:9;:26::i;:::-;33868:110;;:::o;54828:102::-;54880:13;54913:9;54906:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54828:102;:::o;23271:723::-;23327:13;23557:1;23548:5;:10;23544:53;;;23575:10;;;;;;;;;;;;;;;;;;;;;23544:53;23607:12;23622:5;23607:20;;23638:14;23663:78;23678:1;23670:4;:9;23663:78;;23696:8;;;;;:::i;:::-;;;;23727:2;23719:10;;;;;:::i;:::-;;;23663:78;;;23751:19;23783:6;23773:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23751:39;;23801:154;23817:1;23808:5;:10;23801:154;;23845:1;23835:11;;;;;:::i;:::-;;;23912:2;23904:5;:10;;;;:::i;:::-;23891:2;:24;;;;:::i;:::-;23878:39;;23861:6;23868;23861:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;23941:2;23932:11;;;;;:::i;:::-;;;23801:154;;;23979:6;23965:21;;;;;23271:723;;;;:::o;2761:98::-;2819:7;2850:1;2846;:5;;;;:::i;:::-;2839:12;;2761:98;;;;:::o;3499:::-;3557:7;3588:1;3584;:5;;;;:::i;:::-;3577:12;;3499:98;;;;:::o;25795:157::-;25880:4;25919:25;25904:40;;;:11;:40;;;;25897:47;;25795:157;;;:::o;42600:555::-;42710:45;42737:4;42743:2;42747:7;42710:26;:45::i;:::-;42788:1;42772:18;;:4;:18;;;42768:187;;;42807:40;42839:7;42807:31;:40::i;:::-;42768:187;;;42877:2;42869:10;;:4;:10;;;42865:90;;42896:47;42929:4;42935:7;42896:32;:47::i;:::-;42865:90;42768:187;42983:1;42969:16;;:2;:16;;;42965:183;;;43002:45;43039:7;43002:36;:45::i;:::-;42965:183;;;43075:4;43069:10;;:2;:10;;;43065:83;;43096:40;43124:2;43128:7;43096:27;:40::i;:::-;43065:83;42965:183;42600:555;;;:::o;37500:843::-;37621:4;37647:15;:2;:13;;;:15::i;:::-;37643:693;;;37699:2;37683:36;;;37720:12;:10;:12::i;:::-;37734:4;37740:7;37749:5;37683:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37679:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37946:1;37929:6;:13;:18;37925:341;;;37972:60;;;;;;;;;;:::i;:::-;;;;;;;;37925:341;38216:6;38210:13;38201:6;38197:2;38193:15;38186:38;37679:602;37816:45;;;37806:55;;;:6;:55;;;;37799:62;;;;;37643:693;38320:4;38313:11;;37500:843;;;;;;;:::o;34205:250::-;34301:18;34307:2;34311:7;34301:5;:18::i;:::-;34338:54;34369:1;34373:2;34377:7;34386:5;34338:22;:54::i;:::-;34330:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;34205:250;;;:::o;38956:93::-;;;;:::o;43878:164::-;43982:10;:17;;;;43955:15;:24;43971:7;43955:24;;;;;;;;;;;:44;;;;44010:10;44026:7;44010:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43878:164;:::o;44669:988::-;44935:22;44985:1;44960:22;44977:4;44960:16;:22::i;:::-;:26;;;;:::i;:::-;44935:51;;44997:18;45018:17;:26;45036:7;45018:26;;;;;;;;;;;;44997:47;;45165:14;45151:10;:28;45147:328;;45196:19;45218:12;:18;45231:4;45218:18;;;;;;;;;;;;;;;:34;45237:14;45218:34;;;;;;;;;;;;45196:56;;45302:11;45269:12;:18;45282:4;45269:18;;;;;;;;;;;;;;;:30;45288:10;45269:30;;;;;;;;;;;:44;;;;45419:10;45386:17;:30;45404:11;45386:30;;;;;;;;;;;:43;;;;45147:328;;45571:17;:26;45589:7;45571:26;;;;;;;;;;;45564:33;;;45615:12;:18;45628:4;45615:18;;;;;;;;;;;;;;;:34;45634:14;45615:34;;;;;;;;;;;45608:41;;;44669:988;;;;:::o;45952:1079::-;46205:22;46250:1;46230:10;:17;;;;:21;;;;:::i;:::-;46205:46;;46262:18;46283:15;:24;46299:7;46283:24;;;;;;;;;;;;46262:45;;46634:19;46656:10;46667:14;46656:26;;;;;;;;;;;;;;;;;;;;;;;;46634:48;;46720:11;46695:10;46706;46695:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;46831:10;46800:15;:28;46816:11;46800:28;;;;;;;;;;;:41;;;;46972:15;:24;46988:7;46972:24;;;;;;;;;;;46965:31;;;47007:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45952:1079;;;;:::o;43456:221::-;43541:14;43558:20;43575:2;43558:16;:20::i;:::-;43541:37;;43616:7;43589:12;:16;43602:2;43589:16;;;;;;;;;;;;;;;:24;43606:6;43589:24;;;;;;;;;;;:34;;;;43663:6;43634:17;:26;43652:7;43634:26;;;;;;;;;;;:35;;;;43456:221;;;:::o;14795:422::-;14855:4;15063:12;15174:7;15162:20;15154:28;;15208:1;15201:4;:8;15194:15;;;14795:422;;;:::o;34791:382::-;34885:1;34871:16;;:2;:16;;;;34863:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;34944:16;34952:7;34944;:16::i;:::-;34943:17;34935:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;35006:45;35035:1;35039:2;35043:7;35006:20;:45::i;:::-;35081:1;35064:9;:13;35074:2;35064:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;35112:2;35093:7;:16;35101:7;35093:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;35157:7;35153:2;35132:33;;35149:1;35132:33;;;;;;;;;;;;34791:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:133::-;895:5;933:6;920:20;911:29;;949:30;973:5;949:30;:::i;:::-;901:84;;;;:::o;991:137::-;1036:5;1074:6;1061:20;1052:29;;1090:32;1116:5;1090:32;:::i;:::-;1042:86;;;;:::o;1134:141::-;1190:5;1221:6;1215:13;1206:22;;1237:32;1263:5;1237:32;:::i;:::-;1196:79;;;;:::o;1294:271::-;1349:5;1398:3;1391:4;1383:6;1379:17;1375:27;1365:2;;1416:1;1413;1406:12;1365:2;1456:6;1443:20;1481:78;1555:3;1547:6;1540:4;1532:6;1528:17;1481:78;:::i;:::-;1472:87;;1355:210;;;;;:::o;1585:273::-;1641:5;1690:3;1683:4;1675:6;1671:17;1667:27;1657:2;;1708:1;1705;1698:12;1657:2;1748:6;1735:20;1773:79;1848:3;1840:6;1833:4;1825:6;1821:17;1773:79;:::i;:::-;1764:88;;1647:211;;;;;:::o;1864:139::-;1910:5;1948:6;1935:20;1926:29;;1964:33;1991:5;1964:33;:::i;:::-;1916:87;;;;:::o;2009:262::-;2068:6;2117:2;2105:9;2096:7;2092:23;2088:32;2085:2;;;2133:1;2130;2123:12;2085:2;2176:1;2201:53;2246:7;2237:6;2226:9;2222:22;2201:53;:::i;:::-;2191:63;;2147:117;2075:196;;;;:::o;2277:407::-;2345:6;2353;2402:2;2390:9;2381:7;2377:23;2373:32;2370:2;;;2418:1;2415;2408:12;2370:2;2461:1;2486:53;2531:7;2522:6;2511:9;2507:22;2486:53;:::i;:::-;2476:63;;2432:117;2588:2;2614:53;2659:7;2650:6;2639:9;2635:22;2614:53;:::i;:::-;2604:63;;2559:118;2360:324;;;;;:::o;2690:552::-;2767:6;2775;2783;2832:2;2820:9;2811:7;2807:23;2803:32;2800:2;;;2848:1;2845;2838:12;2800:2;2891:1;2916:53;2961:7;2952:6;2941:9;2937:22;2916:53;:::i;:::-;2906:63;;2862:117;3018:2;3044:53;3089:7;3080:6;3069:9;3065:22;3044:53;:::i;:::-;3034:63;;2989:118;3146:2;3172:53;3217:7;3208:6;3197:9;3193:22;3172:53;:::i;:::-;3162:63;;3117:118;2790:452;;;;;:::o;3248:809::-;3343:6;3351;3359;3367;3416:3;3404:9;3395:7;3391:23;3387:33;3384:2;;;3433:1;3430;3423:12;3384:2;3476:1;3501:53;3546:7;3537:6;3526:9;3522:22;3501:53;:::i;:::-;3491:63;;3447:117;3603:2;3629:53;3674:7;3665:6;3654:9;3650:22;3629:53;:::i;:::-;3619:63;;3574:118;3731:2;3757:53;3802:7;3793:6;3782:9;3778:22;3757:53;:::i;:::-;3747:63;;3702:118;3887:2;3876:9;3872:18;3859:32;3918:18;3910:6;3907:30;3904:2;;;3950:1;3947;3940:12;3904:2;3978:62;4032:7;4023:6;4012:9;4008:22;3978:62;:::i;:::-;3968:72;;3830:220;3374:683;;;;;;;:::o;4063:401::-;4128:6;4136;4185:2;4173:9;4164:7;4160:23;4156:32;4153:2;;;4201:1;4198;4191:12;4153:2;4244:1;4269:53;4314:7;4305:6;4294:9;4290:22;4269:53;:::i;:::-;4259:63;;4215:117;4371:2;4397:50;4439:7;4430:6;4419:9;4415:22;4397:50;:::i;:::-;4387:60;;4342:115;4143:321;;;;;:::o;4470:407::-;4538:6;4546;4595:2;4583:9;4574:7;4570:23;4566:32;4563:2;;;4611:1;4608;4601:12;4563:2;4654:1;4679:53;4724:7;4715:6;4704:9;4700:22;4679:53;:::i;:::-;4669:63;;4625:117;4781:2;4807:53;4852:7;4843:6;4832:9;4828:22;4807:53;:::i;:::-;4797:63;;4752:118;4553:324;;;;;:::o;4883:260::-;4941:6;4990:2;4978:9;4969:7;4965:23;4961:32;4958:2;;;5006:1;5003;4996:12;4958:2;5049:1;5074:52;5118:7;5109:6;5098:9;5094:22;5074:52;:::i;:::-;5064:62;;5020:116;4948:195;;;;:::o;5149:282::-;5218:6;5267:2;5255:9;5246:7;5242:23;5238:32;5235:2;;;5283:1;5280;5273:12;5235:2;5326:1;5351:63;5406:7;5397:6;5386:9;5382:22;5351:63;:::i;:::-;5341:73;;5297:127;5225:206;;;;:::o;5437:375::-;5506:6;5555:2;5543:9;5534:7;5530:23;5526:32;5523:2;;;5571:1;5568;5561:12;5523:2;5642:1;5631:9;5627:17;5614:31;5672:18;5664:6;5661:30;5658:2;;;5704:1;5701;5694:12;5658:2;5732:63;5787:7;5778:6;5767:9;5763:22;5732:63;:::i;:::-;5722:73;;5585:220;5513:299;;;;:::o;5818:262::-;5877:6;5926:2;5914:9;5905:7;5901:23;5897:32;5894:2;;;5942:1;5939;5932:12;5894:2;5985:1;6010:53;6055:7;6046:6;6035:9;6031:22;6010:53;:::i;:::-;6000:63;;5956:117;5884:196;;;;:::o;6086:118::-;6173:24;6191:5;6173:24;:::i;:::-;6168:3;6161:37;6151:53;;:::o;6210:109::-;6291:21;6306:5;6291:21;:::i;:::-;6286:3;6279:34;6269:50;;:::o;6325:360::-;6411:3;6439:38;6471:5;6439:38;:::i;:::-;6493:70;6556:6;6551:3;6493:70;:::i;:::-;6486:77;;6572:52;6617:6;6612:3;6605:4;6598:5;6594:16;6572:52;:::i;:::-;6649:29;6671:6;6649:29;:::i;:::-;6644:3;6640:39;6633:46;;6415:270;;;;;:::o;6691:364::-;6779:3;6807:39;6840:5;6807:39;:::i;:::-;6862:71;6926:6;6921:3;6862:71;:::i;:::-;6855:78;;6942:52;6987:6;6982:3;6975:4;6968:5;6964:16;6942:52;:::i;:::-;7019:29;7041:6;7019:29;:::i;:::-;7014:3;7010:39;7003:46;;6783:272;;;;;:::o;7061:377::-;7167:3;7195:39;7228:5;7195:39;:::i;:::-;7250:89;7332:6;7327:3;7250:89;:::i;:::-;7243:96;;7348:52;7393:6;7388:3;7381:4;7374:5;7370:16;7348:52;:::i;:::-;7425:6;7420:3;7416:16;7409:23;;7171:267;;;;;:::o;7444:366::-;7586:3;7607:67;7671:2;7666:3;7607:67;:::i;:::-;7600:74;;7683:93;7772:3;7683:93;:::i;:::-;7801:2;7796:3;7792:12;7785:19;;7590:220;;;:::o;7816:366::-;7958:3;7979:67;8043:2;8038:3;7979:67;:::i;:::-;7972:74;;8055:93;8144:3;8055:93;:::i;:::-;8173:2;8168:3;8164:12;8157:19;;7962:220;;;:::o;8188:366::-;8330:3;8351:67;8415:2;8410:3;8351:67;:::i;:::-;8344:74;;8427:93;8516:3;8427:93;:::i;:::-;8545:2;8540:3;8536:12;8529:19;;8334:220;;;:::o;8560:366::-;8702:3;8723:67;8787:2;8782:3;8723:67;:::i;:::-;8716:74;;8799:93;8888:3;8799:93;:::i;:::-;8917:2;8912:3;8908:12;8901:19;;8706:220;;;:::o;8932:366::-;9074:3;9095:67;9159:2;9154:3;9095:67;:::i;:::-;9088:74;;9171:93;9260:3;9171:93;:::i;:::-;9289:2;9284:3;9280:12;9273:19;;9078:220;;;:::o;9304:366::-;9446:3;9467:67;9531:2;9526:3;9467:67;:::i;:::-;9460:74;;9543:93;9632:3;9543:93;:::i;:::-;9661:2;9656:3;9652:12;9645:19;;9450:220;;;:::o;9676:366::-;9818:3;9839:67;9903:2;9898:3;9839:67;:::i;:::-;9832:74;;9915:93;10004:3;9915:93;:::i;:::-;10033:2;10028:3;10024:12;10017:19;;9822:220;;;:::o;10048:366::-;10190:3;10211:67;10275:2;10270:3;10211:67;:::i;:::-;10204:74;;10287:93;10376:3;10287:93;:::i;:::-;10405:2;10400:3;10396:12;10389:19;;10194:220;;;:::o;10420:366::-;10562:3;10583:67;10647:2;10642:3;10583:67;:::i;:::-;10576:74;;10659:93;10748:3;10659:93;:::i;:::-;10777:2;10772:3;10768:12;10761:19;;10566:220;;;:::o;10792:366::-;10934:3;10955:67;11019:2;11014:3;10955:67;:::i;:::-;10948:74;;11031:93;11120:3;11031:93;:::i;:::-;11149:2;11144:3;11140:12;11133:19;;10938:220;;;:::o;11164:366::-;11306:3;11327:67;11391:2;11386:3;11327:67;:::i;:::-;11320:74;;11403:93;11492:3;11403:93;:::i;:::-;11521:2;11516:3;11512:12;11505:19;;11310:220;;;:::o;11536:366::-;11678:3;11699:67;11763:2;11758:3;11699:67;:::i;:::-;11692:74;;11775:93;11864:3;11775:93;:::i;:::-;11893:2;11888:3;11884:12;11877:19;;11682:220;;;:::o;11908:366::-;12050:3;12071:67;12135:2;12130:3;12071:67;:::i;:::-;12064:74;;12147:93;12236:3;12147:93;:::i;:::-;12265:2;12260:3;12256:12;12249:19;;12054:220;;;:::o;12280:366::-;12422:3;12443:67;12507:2;12502:3;12443:67;:::i;:::-;12436:74;;12519:93;12608:3;12519:93;:::i;:::-;12637:2;12632:3;12628:12;12621:19;;12426:220;;;:::o;12652:366::-;12794:3;12815:67;12879:2;12874:3;12815:67;:::i;:::-;12808:74;;12891:93;12980:3;12891:93;:::i;:::-;13009:2;13004:3;13000:12;12993:19;;12798:220;;;:::o;13024:366::-;13166:3;13187:67;13251:2;13246:3;13187:67;:::i;:::-;13180:74;;13263:93;13352:3;13263:93;:::i;:::-;13381:2;13376:3;13372:12;13365:19;;13170:220;;;:::o;13396:366::-;13538:3;13559:67;13623:2;13618:3;13559:67;:::i;:::-;13552:74;;13635:93;13724:3;13635:93;:::i;:::-;13753:2;13748:3;13744:12;13737:19;;13542:220;;;:::o;13768:366::-;13910:3;13931:67;13995:2;13990:3;13931:67;:::i;:::-;13924:74;;14007:93;14096:3;14007:93;:::i;:::-;14125:2;14120:3;14116:12;14109:19;;13914:220;;;:::o;14140:366::-;14282:3;14303:67;14367:2;14362:3;14303:67;:::i;:::-;14296:74;;14379:93;14468:3;14379:93;:::i;:::-;14497:2;14492:3;14488:12;14481:19;;14286:220;;;:::o;14512:366::-;14654:3;14675:67;14739:2;14734:3;14675:67;:::i;:::-;14668:74;;14751:93;14840:3;14751:93;:::i;:::-;14869:2;14864:3;14860:12;14853:19;;14658:220;;;:::o;14884:366::-;15026:3;15047:67;15111:2;15106:3;15047:67;:::i;:::-;15040:74;;15123:93;15212:3;15123:93;:::i;:::-;15241:2;15236:3;15232:12;15225:19;;15030:220;;;:::o;15256:366::-;15398:3;15419:67;15483:2;15478:3;15419:67;:::i;:::-;15412:74;;15495:93;15584:3;15495:93;:::i;:::-;15613:2;15608:3;15604:12;15597:19;;15402:220;;;:::o;15628:366::-;15770:3;15791:67;15855:2;15850:3;15791:67;:::i;:::-;15784:74;;15867:93;15956:3;15867:93;:::i;:::-;15985:2;15980:3;15976:12;15969:19;;15774:220;;;:::o;16000:366::-;16142:3;16163:67;16227:2;16222:3;16163:67;:::i;:::-;16156:74;;16239:93;16328:3;16239:93;:::i;:::-;16357:2;16352:3;16348:12;16341:19;;16146:220;;;:::o;16430:345::-;16579:4;16574:3;16570:14;16676:4;16669:5;16665:16;16659:23;16695:63;16752:4;16747:3;16743:14;16729:12;16695:63;:::i;:::-;16594:174;16548:227;;;:::o;16781:108::-;16858:24;16876:5;16858:24;:::i;:::-;16853:3;16846:37;16836:53;;:::o;16895:118::-;16982:24;17000:5;16982:24;:::i;:::-;16977:3;16970:37;16960:53;;:::o;17019:435::-;17199:3;17221:95;17312:3;17303:6;17221:95;:::i;:::-;17214:102;;17333:95;17424:3;17415:6;17333:95;:::i;:::-;17326:102;;17445:3;17438:10;;17203:251;;;;;:::o;17460:222::-;17553:4;17591:2;17580:9;17576:18;17568:26;;17604:71;17672:1;17661:9;17657:17;17648:6;17604:71;:::i;:::-;17558:124;;;;:::o;17688:640::-;17883:4;17921:3;17910:9;17906:19;17898:27;;17935:71;18003:1;17992:9;17988:17;17979:6;17935:71;:::i;:::-;18016:72;18084:2;18073:9;18069:18;18060:6;18016:72;:::i;:::-;18098;18166:2;18155:9;18151:18;18142:6;18098:72;:::i;:::-;18217:9;18211:4;18207:20;18202:2;18191:9;18187:18;18180:48;18245:76;18316:4;18307:6;18245:76;:::i;:::-;18237:84;;17888:440;;;;;;;:::o;18334:210::-;18421:4;18459:2;18448:9;18444:18;18436:26;;18472:65;18534:1;18523:9;18519:17;18510:6;18472:65;:::i;:::-;18426:118;;;;:::o;18550:313::-;18663:4;18701:2;18690:9;18686:18;18678:26;;18750:9;18744:4;18740:20;18736:1;18725:9;18721:17;18714:47;18778:78;18851:4;18842:6;18778:78;:::i;:::-;18770:86;;18668:195;;;;:::o;18869:419::-;19035:4;19073:2;19062:9;19058:18;19050:26;;19122:9;19116:4;19112:20;19108:1;19097:9;19093:17;19086:47;19150:131;19276:4;19150:131;:::i;:::-;19142:139;;19040:248;;;:::o;19294:419::-;19460:4;19498:2;19487:9;19483:18;19475:26;;19547:9;19541:4;19537:20;19533:1;19522:9;19518:17;19511:47;19575:131;19701:4;19575:131;:::i;:::-;19567:139;;19465:248;;;:::o;19719:419::-;19885:4;19923:2;19912:9;19908:18;19900:26;;19972:9;19966:4;19962:20;19958:1;19947:9;19943:17;19936:47;20000:131;20126:4;20000:131;:::i;:::-;19992:139;;19890:248;;;:::o;20144:419::-;20310:4;20348:2;20337:9;20333:18;20325:26;;20397:9;20391:4;20387:20;20383:1;20372:9;20368:17;20361:47;20425:131;20551:4;20425:131;:::i;:::-;20417:139;;20315:248;;;:::o;20569:419::-;20735:4;20773:2;20762:9;20758:18;20750:26;;20822:9;20816:4;20812:20;20808:1;20797:9;20793:17;20786:47;20850:131;20976:4;20850:131;:::i;:::-;20842:139;;20740:248;;;:::o;20994:419::-;21160:4;21198:2;21187:9;21183:18;21175:26;;21247:9;21241:4;21237:20;21233:1;21222:9;21218:17;21211:47;21275:131;21401:4;21275:131;:::i;:::-;21267:139;;21165:248;;;:::o;21419:419::-;21585:4;21623:2;21612:9;21608:18;21600:26;;21672:9;21666:4;21662:20;21658:1;21647:9;21643:17;21636:47;21700:131;21826:4;21700:131;:::i;:::-;21692:139;;21590:248;;;:::o;21844:419::-;22010:4;22048:2;22037:9;22033:18;22025:26;;22097:9;22091:4;22087:20;22083:1;22072:9;22068:17;22061:47;22125:131;22251:4;22125:131;:::i;:::-;22117:139;;22015:248;;;:::o;22269:419::-;22435:4;22473:2;22462:9;22458:18;22450:26;;22522:9;22516:4;22512:20;22508:1;22497:9;22493:17;22486:47;22550:131;22676:4;22550:131;:::i;:::-;22542:139;;22440:248;;;:::o;22694:419::-;22860:4;22898:2;22887:9;22883:18;22875:26;;22947:9;22941:4;22937:20;22933:1;22922:9;22918:17;22911:47;22975:131;23101:4;22975:131;:::i;:::-;22967:139;;22865:248;;;:::o;23119:419::-;23285:4;23323:2;23312:9;23308:18;23300:26;;23372:9;23366:4;23362:20;23358:1;23347:9;23343:17;23336:47;23400:131;23526:4;23400:131;:::i;:::-;23392:139;;23290:248;;;:::o;23544:419::-;23710:4;23748:2;23737:9;23733:18;23725:26;;23797:9;23791:4;23787:20;23783:1;23772:9;23768:17;23761:47;23825:131;23951:4;23825:131;:::i;:::-;23817:139;;23715:248;;;:::o;23969:419::-;24135:4;24173:2;24162:9;24158:18;24150:26;;24222:9;24216:4;24212:20;24208:1;24197:9;24193:17;24186:47;24250:131;24376:4;24250:131;:::i;:::-;24242:139;;24140:248;;;:::o;24394:419::-;24560:4;24598:2;24587:9;24583:18;24575:26;;24647:9;24641:4;24637:20;24633:1;24622:9;24618:17;24611:47;24675:131;24801:4;24675:131;:::i;:::-;24667:139;;24565:248;;;:::o;24819:419::-;24985:4;25023:2;25012:9;25008:18;25000:26;;25072:9;25066:4;25062:20;25058:1;25047:9;25043:17;25036:47;25100:131;25226:4;25100:131;:::i;:::-;25092:139;;24990:248;;;:::o;25244:419::-;25410:4;25448:2;25437:9;25433:18;25425:26;;25497:9;25491:4;25487:20;25483:1;25472:9;25468:17;25461:47;25525:131;25651:4;25525:131;:::i;:::-;25517:139;;25415:248;;;:::o;25669:419::-;25835:4;25873:2;25862:9;25858:18;25850:26;;25922:9;25916:4;25912:20;25908:1;25897:9;25893:17;25886:47;25950:131;26076:4;25950:131;:::i;:::-;25942:139;;25840:248;;;:::o;26094:419::-;26260:4;26298:2;26287:9;26283:18;26275:26;;26347:9;26341:4;26337:20;26333:1;26322:9;26318:17;26311:47;26375:131;26501:4;26375:131;:::i;:::-;26367:139;;26265:248;;;:::o;26519:419::-;26685:4;26723:2;26712:9;26708:18;26700:26;;26772:9;26766:4;26762:20;26758:1;26747:9;26743:17;26736:47;26800:131;26926:4;26800:131;:::i;:::-;26792:139;;26690:248;;;:::o;26944:419::-;27110:4;27148:2;27137:9;27133:18;27125:26;;27197:9;27191:4;27187:20;27183:1;27172:9;27168:17;27161:47;27225:131;27351:4;27225:131;:::i;:::-;27217:139;;27115:248;;;:::o;27369:419::-;27535:4;27573:2;27562:9;27558:18;27550:26;;27622:9;27616:4;27612:20;27608:1;27597:9;27593:17;27586:47;27650:131;27776:4;27650:131;:::i;:::-;27642:139;;27540:248;;;:::o;27794:419::-;27960:4;27998:2;27987:9;27983:18;27975:26;;28047:9;28041:4;28037:20;28033:1;28022:9;28018:17;28011:47;28075:131;28201:4;28075:131;:::i;:::-;28067:139;;27965:248;;;:::o;28219:419::-;28385:4;28423:2;28412:9;28408:18;28400:26;;28472:9;28466:4;28462:20;28458:1;28447:9;28443:17;28436:47;28500:131;28626:4;28500:131;:::i;:::-;28492:139;;28390:248;;;:::o;28644:419::-;28810:4;28848:2;28837:9;28833:18;28825:26;;28897:9;28891:4;28887:20;28883:1;28872:9;28868:17;28861:47;28925:131;29051:4;28925:131;:::i;:::-;28917:139;;28815:248;;;:::o;29069:326::-;29214:4;29252:2;29241:9;29237:18;29229:26;;29265:123;29385:1;29374:9;29370:17;29361:6;29265:123;:::i;:::-;29219:176;;;;:::o;29401:222::-;29494:4;29532:2;29521:9;29517:18;29509:26;;29545:71;29613:1;29602:9;29598:17;29589:6;29545:71;:::i;:::-;29499:124;;;;:::o;29629:129::-;29663:6;29690:20;;:::i;:::-;29680:30;;29719:33;29747:4;29739:6;29719:33;:::i;:::-;29670:88;;;:::o;29764:75::-;29797:6;29830:2;29824:9;29814:19;;29804:35;:::o;29845:307::-;29906:4;29996:18;29988:6;29985:30;29982:2;;;30018:18;;:::i;:::-;29982:2;30056:29;30078:6;30056:29;:::i;:::-;30048:37;;30140:4;30134;30130:15;30122:23;;29911:241;;;:::o;30158:308::-;30220:4;30310:18;30302:6;30299:30;30296:2;;;30332:18;;:::i;:::-;30296:2;30370:29;30392:6;30370:29;:::i;:::-;30362:37;;30454:4;30448;30444:15;30436:23;;30225:241;;;:::o;30472:98::-;30523:6;30557:5;30551:12;30541:22;;30530:40;;;:::o;30576:99::-;30628:6;30662:5;30656:12;30646:22;;30635:40;;;:::o;30681:168::-;30764:11;30798:6;30793:3;30786:19;30838:4;30833:3;30829:14;30814:29;;30776:73;;;;:::o;30855:169::-;30939:11;30973:6;30968:3;30961:19;31013:4;31008:3;31004:14;30989:29;;30951:73;;;;:::o;31030:148::-;31132:11;31169:3;31154:18;;31144:34;;;;:::o;31184:305::-;31224:3;31243:20;31261:1;31243:20;:::i;:::-;31238:25;;31277:20;31295:1;31277:20;:::i;:::-;31272:25;;31431:1;31363:66;31359:74;31356:1;31353:81;31350:2;;;31437:18;;:::i;:::-;31350:2;31481:1;31478;31474:9;31467:16;;31228:261;;;;:::o;31495:185::-;31535:1;31552:20;31570:1;31552:20;:::i;:::-;31547:25;;31586:20;31604:1;31586:20;:::i;:::-;31581:25;;31625:1;31615:2;;31630:18;;:::i;:::-;31615:2;31672:1;31669;31665:9;31660:14;;31537:143;;;;:::o;31686:348::-;31726:7;31749:20;31767:1;31749:20;:::i;:::-;31744:25;;31783:20;31801:1;31783:20;:::i;:::-;31778:25;;31971:1;31903:66;31899:74;31896:1;31893:81;31888:1;31881:9;31874:17;31870:105;31867:2;;;31978:18;;:::i;:::-;31867:2;32026:1;32023;32019:9;32008:20;;31734:300;;;;:::o;32040:191::-;32080:4;32100:20;32118:1;32100:20;:::i;:::-;32095:25;;32134:20;32152:1;32134:20;:::i;:::-;32129:25;;32173:1;32170;32167:8;32164:2;;;32178:18;;:::i;:::-;32164:2;32223:1;32220;32216:9;32208:17;;32085:146;;;;:::o;32237:96::-;32274:7;32303:24;32321:5;32303:24;:::i;:::-;32292:35;;32282:51;;;:::o;32339:90::-;32373:7;32416:5;32409:13;32402:21;32391:32;;32381:48;;;:::o;32435:149::-;32471:7;32511:66;32504:5;32500:78;32489:89;;32479:105;;;:::o;32590:126::-;32627:7;32667:42;32660:5;32656:54;32645:65;;32635:81;;;:::o;32722:77::-;32759:7;32788:5;32777:16;;32767:32;;;:::o;32805:154::-;32889:6;32884:3;32879;32866:30;32951:1;32942:6;32937:3;32933:16;32926:27;32856:103;;;:::o;32965:307::-;33033:1;33043:113;33057:6;33054:1;33051:13;33043:113;;;33142:1;33137:3;33133:11;33127:18;33123:1;33118:3;33114:11;33107:39;33079:2;33076:1;33072:10;33067:15;;33043:113;;;33174:6;33171:1;33168:13;33165:2;;;33254:1;33245:6;33240:3;33236:16;33229:27;33165:2;33014:258;;;;:::o;33278:320::-;33322:6;33359:1;33353:4;33349:12;33339:22;;33406:1;33400:4;33396:12;33427:18;33417:2;;33483:4;33475:6;33471:17;33461:27;;33417:2;33545;33537:6;33534:14;33514:18;33511:38;33508:2;;;33564:18;;:::i;:::-;33508:2;33329:269;;;;:::o;33604:281::-;33687:27;33709:4;33687:27;:::i;:::-;33679:6;33675:40;33817:6;33805:10;33802:22;33781:18;33769:10;33766:34;33763:62;33760:2;;;33828:18;;:::i;:::-;33760:2;33868:10;33864:2;33857:22;33647:238;;;:::o;33891:233::-;33930:3;33953:24;33971:5;33953:24;:::i;:::-;33944:33;;33999:66;33992:5;33989:77;33986:2;;;34069:18;;:::i;:::-;33986:2;34116:1;34109:5;34105:13;34098:20;;33934:190;;;:::o;34130:176::-;34162:1;34179:20;34197:1;34179:20;:::i;:::-;34174:25;;34213:20;34231:1;34213:20;:::i;:::-;34208:25;;34252:1;34242:2;;34257:18;;:::i;:::-;34242:2;34298:1;34295;34291:9;34286:14;;34164:142;;;;:::o;34312:180::-;34360:77;34357:1;34350:88;34457:4;34454:1;34447:15;34481:4;34478:1;34471:15;34498:180;34546:77;34543:1;34536:88;34643:4;34640:1;34633:15;34667:4;34664:1;34657:15;34684:180;34732:77;34729:1;34722:88;34829:4;34826:1;34819:15;34853:4;34850:1;34843:15;34870:180;34918:77;34915:1;34908:88;35015:4;35012:1;35005:15;35039:4;35036:1;35029:15;35056:102;35097:6;35148:2;35144:7;35139:2;35132:5;35128:14;35124:28;35114:38;;35104:54;;;:::o;35164:221::-;35304:34;35300:1;35292:6;35288:14;35281:58;35373:4;35368:2;35360:6;35356:15;35349:29;35270:115;:::o;35391:230::-;35531:34;35527:1;35519:6;35515:14;35508:58;35600:13;35595:2;35587:6;35583:15;35576:38;35497:124;:::o;35627:237::-;35767:34;35763:1;35755:6;35751:14;35744:58;35836:20;35831:2;35823:6;35819:15;35812:45;35733:131;:::o;35870:182::-;36010:34;36006:1;35998:6;35994:14;35987:58;35976:76;:::o;36058:225::-;36198:34;36194:1;36186:6;36182:14;36175:58;36267:8;36262:2;36254:6;36250:15;36243:33;36164:119;:::o;36289:178::-;36429:30;36425:1;36417:6;36413:14;36406:54;36395:72;:::o;36473:223::-;36613:34;36609:1;36601:6;36597:14;36590:58;36682:6;36677:2;36669:6;36665:15;36658:31;36579:117;:::o;36702:175::-;36842:27;36838:1;36830:6;36826:14;36819:51;36808:69;:::o;36883:221::-;37023:34;37019:1;37011:6;37007:14;37000:58;37092:4;37087:2;37079:6;37075:15;37068:29;36989:115;:::o;37110:231::-;37250:34;37246:1;37238:6;37234:14;37227:58;37319:14;37314:2;37306:6;37302:15;37295:39;37216:125;:::o;37347:243::-;37487:34;37483:1;37475:6;37471:14;37464:58;37556:26;37551:2;37543:6;37539:15;37532:51;37453:137;:::o;37596:229::-;37736:34;37732:1;37724:6;37720:14;37713:58;37805:12;37800:2;37792:6;37788:15;37781:37;37702:123;:::o;37831:228::-;37971:34;37967:1;37959:6;37955:14;37948:58;38040:11;38035:2;38027:6;38023:15;38016:36;37937:122;:::o;38065:182::-;38205:34;38201:1;38193:6;38189:14;38182:58;38171:76;:::o;38253:182::-;38393:34;38389:1;38381:6;38377:14;38370:58;38359:76;:::o;38441:231::-;38581:34;38577:1;38569:6;38565:14;38558:58;38650:14;38645:2;38637:6;38633:15;38626:39;38547:125;:::o;38678:182::-;38818:34;38814:1;38806:6;38802:14;38795:58;38784:76;:::o;38866:228::-;39006:34;39002:1;38994:6;38990:14;38983:58;39075:11;39070:2;39062:6;39058:15;39051:36;38972:122;:::o;39100:234::-;39240:34;39236:1;39228:6;39224:14;39217:58;39309:17;39304:2;39296:6;39292:15;39285:42;39206:128;:::o;39340:220::-;39480:34;39476:1;39468:6;39464:14;39457:58;39549:3;39544:2;39536:6;39532:15;39525:28;39446:114;:::o;39566:220::-;39706:34;39702:1;39694:6;39690:14;39683:58;39775:3;39770:2;39762:6;39758:15;39751:28;39672:114;:::o;39792:177::-;39932:29;39928:1;39920:6;39916:14;39909:53;39898:71;:::o;39975:236::-;40115:34;40111:1;40103:6;40099:14;40092:58;40184:19;40179:2;40171:6;40167:15;40160:44;40081:130;:::o;40217:231::-;40357:34;40353:1;40345:6;40341:14;40334:58;40426:14;40421:2;40413:6;40409:15;40402:39;40323:125;:::o;40454:122::-;40527:24;40545:5;40527:24;:::i;:::-;40520:5;40517:35;40507:2;;40566:1;40563;40556:12;40507:2;40497:79;:::o;40582:116::-;40652:21;40667:5;40652:21;:::i;:::-;40645:5;40642:32;40632:2;;40688:1;40685;40678:12;40632:2;40622:76;:::o;40704:120::-;40776:23;40793:5;40776:23;:::i;:::-;40769:5;40766:34;40756:2;;40814:1;40811;40804:12;40756:2;40746:78;:::o;40830:122::-;40903:24;40921:5;40903:24;:::i;:::-;40896:5;40893:35;40883:2;;40942:1;40939;40932:12;40883:2;40873:79;:::o

Swarm Source

ipfs://65f89d5d552cf2f2ae138cfa6772e525959417616be4b82fc7db97f284145d9a
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.