Feature Tip: Add private address tag to any address under My Name Tag !
ERC-721
NFT
Overview
Max Total Supply
10,000 SKLZ
Holders
2,780
Market
Volume (24H)
N/A
Min Price (24H)
N/A
Max Price (24H)
N/A
Other Info
Token Contract
Balance
1 SKLZLoading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
CrazySkullz
Compiler Version
v0.8.7+commit.e28d00a7
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2021-09-25 */ // 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; } } } pragma solidity ^0.8.0; /** * @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); } } pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; // solhint-disable-next-line no-inline-assembly assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); // solhint-disable-next-line avoid-low-level-calls, avoid-call-value (bool success, ) = recipient.call{ value: amount }(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.call{ value: value }(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); // solhint-disable-next-line avoid-low-level-calls (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly // solhint-disable-next-line no-inline-assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4); } pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); } pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom(address from, address to, uint256 tokenId) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external; } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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); } pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } pragma solidity ^0.8.0; /** * @dev Contract module which provides a basic access control mechanism, where * there is an account (an owner) that can be granted exclusive access to * specific functions. * * By default, the owner account will be the one that deploys the contract. This * can later be changed with {transferOwnership}. * * This module is used through inheritance. It will make available the modifier * `onlyOwner`, which can be applied to your functions to restrict their use to * the owner. */ abstract contract Ownable is Context { address private _owner; event OwnershipTransferred(address indexed previousOwner, address indexed newOwner); /** * @dev Initializes the contract setting the deployer as the initial owner. */ constructor () { 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; } } pragma solidity ^0.8.0; /** * @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 { } } pragma solidity ^0.8.0; /** * @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(); } } pragma solidity ^0.8.0; contract CrazySkullz is ERC721Enumerable, Ownable { using SafeMath for uint256; using Address for address; using Strings for uint256; // The price of the NFT uint256 public constant NFT_PRICE = 50000000000000000; // 0.05 ETH // Maximum amount per transaction to be minted uint public constant MAX_NFT_PURCHASE = 10; // Maximum number of tokens that can be mintd in presale / address uint public constant MAX_NFT_PURCHASE_PRESALE = 5; // Maximum tokens supply uint256 public MAX_SUPPLY = 10000; // Is sale active bool public saleIsActive = false; // Is presale active bool public presaleIsActive = false; // Number of tokens reserved for the team uint256 public teamReserve = 60; // Faciliating the needed functionality for the presale mapping(address => bool) _allowList; mapping(address => uint256) _allowListClaimed; bool public isMetadataLocked = false; string private _baseURIExtended; mapping (uint256 => string) _tokenURIs; constructor() ERC721("CrazySkullz","SKLZ"){ } // Presale functions function addToWhitelist(address[] memory addresses) public onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Can't add the null address"); _allowList[addresses[i]] = true; _allowListClaimed[addresses[i]] > 0 ? _allowListClaimed[addresses[i]] : 0; } } function isWhitelisted (address addr) public view returns (bool) { return _allowList[addr]; } function removeFromAllowList(address[] calldata addresses) external onlyOwner { for (uint256 i = 0; i < addresses.length; i++) { require(addresses[i] != address(0), "Can't add the null address"); _allowList[addresses[i]] = false; } } function allowListClaimedBy(address owner) external view returns (uint256){ require(owner != address(0), 'Zero address not on Allow List'); return _allowListClaimed[owner]; } function flipSaleState() public onlyOwner { saleIsActive = !saleIsActive; } function lockMetadata() public onlyOwner { isMetadataLocked = true; } function flipPresaleState() public onlyOwner { presaleIsActive = !presaleIsActive; } // Withdraw the contract $ in the deployer function withdraw() public onlyOwner { uint balance = address(this).balance; payable(msg.sender).transfer(balance); } // Reserve for the team function reserve(address _to, uint256 _reserveAmount) public onlyOwner { uint256 supply = totalSupply(); require( _reserveAmount > 0 && _reserveAmount <= teamReserve, "Not enough reserve left for team" ); for (uint256 i = 0; i < _reserveAmount; i++) { _safeMint(_to, supply + i); } teamReserve = teamReserve.sub(_reserveAmount); } function mint(uint numberOfTokens) public payable { require(saleIsActive, "Sale is not active at the moment"); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require(totalSupply().add(numberOfTokens) <= MAX_SUPPLY.sub(teamReserve), "Purchase would exceed max supply"); require(numberOfTokens <= MAX_NFT_PURCHASE,"Can only mint up to 10 per purchase"); require(NFT_PRICE.mul(numberOfTokens) <= msg.value, "Sent ether value is incorrect"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } } function mintPresale(uint numberOfTokens) public payable { require(presaleIsActive, "Presale is not active at the moment"); require(_allowList[msg.sender] == true,"This address is not whitelisted for the presale."); require(_allowListClaimed[msg.sender] + numberOfTokens <= MAX_NFT_PURCHASE_PRESALE,"Exceeds supply of presale you can mint."); require(numberOfTokens > 0, "Number of tokens can not be less than or equal to 0"); require(NFT_PRICE.mul(numberOfTokens) <= msg.value, "Sent ether value is incorrect"); for (uint i = 0; i < numberOfTokens; i++) { _safeMint(msg.sender, totalSupply()); } _allowListClaimed[msg.sender] += numberOfTokens; } function _baseURI() internal view virtual override returns (string memory) { return _baseURIExtended; } function setBaseURI(string memory baseURI_) external onlyOwner { require(!isMetadataLocked,"Metadata is locked"); _baseURIExtended = baseURI_; } function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI, '.json')); } // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI. return string(abi.encodePacked(base, tokenId.toString(), '.json')); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"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_NFT_PURCHASE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_NFT_PURCHASE_PRESALE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"NFT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"addToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"allowListClaimedBy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipPresaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMetadataLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"}],"name":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"numberOfTokens","type":"uint256"}],"name":"mintPresale","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":"presaleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"removeFromAllowList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_reserveAmount","type":"uint256"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleIsActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"teamReserve","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
6080604052612710600b556000600c60006101000a81548160ff0219169083151502179055506000600c60016101000a81548160ff021916908315150217905550603c600d556000601060006101000a81548160ff0219169083151502179055503480156200006d57600080fd5b506040518060400160405280600b81526020017f4372617a79536b756c6c7a0000000000000000000000000000000000000000008152506040518060400160405280600481526020017f534b4c5a000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f2929190620001cd565b5080600190805190602001906200010b929190620001cd565b505050600062000120620001c560201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620002e2565b600033905090565b828054620001db906200027d565b90600052602060002090601f016020900481019282620001ff57600085556200024b565b82601f106200021a57805160ff19168380011785556200024b565b828001600101855582156200024b579182015b828111156200024a5782518255916020019190600101906200022d565b5b5090506200025a91906200025e565b5090565b5b80821115620002795760008160009055506001016200025f565b5090565b600060028204905060018216806200029657607f821691505b60208210811415620002ad57620002ac620002b3565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61523380620002f26000396000f3fe60806040526004361061022f5760003560e01c8063676dd5631161012e578063a51312c8116100ab578063e985e9c51161006f578063e985e9c51461081b578063eb8d244414610858578063f2fde38b14610883578063f759867a146108ac578063f81227d4146108c85761022f565b8063a51312c814610738578063b88d4fde14610761578063c87b56dd1461078a578063cc47a40b146107c7578063d7e45cd7146107f05761022f565b806395d89b41116100f257806395d89b4114610686578063989bdbb6146106b1578063a06a513f146106c8578063a0712d68146106f3578063a22cb4651461070f5761022f565b8063676dd563146105b357806370a08231146105de578063715018a61461061b5780637f649783146106325780638da5cb5b1461065b5761022f565b806330f72cd4116101bc57806342842e0e1161018057806342842e0e146104bc5780634287f14a146104e55780634f6ccce71461051057806355f804b31461054d5780636352211e146105765761022f565b806330f72cd4146103fb57806332cb6b0c1461042657806334918dfd146104515780633af32abf146104685780633ccfd60b146104a55761022f565b8063081812fc11610203578063081812fc14610304578063095ea7b31461034157806318160ddd1461036a57806323b872dd146103955780632f745c59146103be5761022f565b806208ffdd1461023457806301ffc9a714610271578063020b39cc146102ae57806306fdde03146102d9575b600080fd5b34801561024057600080fd5b5061025b6004803603810190610256919061380d565b6108df565b60405161026891906144d6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a66565b610997565b6040516102a591906140d9565b60405180910390f35b3480156102ba57600080fd5b506102c3610a11565b6040516102d091906144d6565b60405180910390f35b3480156102e557600080fd5b506102ee610a16565b6040516102fb91906140f4565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613b09565b610aa8565b6040516103389190614072565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613990565b610b2d565b005b34801561037657600080fd5b5061037f610c45565b60405161038c91906144d6565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061387a565b610c52565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613990565b610cb2565b6040516103f291906144d6565b60405180910390f35b34801561040757600080fd5b50610410610d57565b60405161041d91906140d9565b60405180910390f35b34801561043257600080fd5b5061043b610d6a565b60405161044891906144d6565b60405180910390f35b34801561045d57600080fd5b50610466610d70565b005b34801561047457600080fd5b5061048f600480360381019061048a919061380d565b610e18565b60405161049c91906140d9565b60405180910390f35b3480156104b157600080fd5b506104ba610e6e565b005b3480156104c857600080fd5b506104e360048036038101906104de919061387a565b610f39565b005b3480156104f157600080fd5b506104fa610f59565b60405161050791906144d6565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613b09565b610f5f565b60405161054491906144d6565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613ac0565b610fd0565b005b34801561058257600080fd5b5061059d60048036038101906105989190613b09565b6110b6565b6040516105aa9190614072565b60405180910390f35b3480156105bf57600080fd5b506105c8611168565b6040516105d591906144d6565b60405180910390f35b3480156105ea57600080fd5b506106056004803603810190610600919061380d565b611173565b60405161061291906144d6565b60405180910390f35b34801561062757600080fd5b5061063061122b565b005b34801561063e57600080fd5b5061065960048036038101906106549190613a1d565b611368565b005b34801561066757600080fd5b506106706115c7565b60405161067d9190614072565b60405180910390f35b34801561069257600080fd5b5061069b6115f1565b6040516106a891906140f4565b60405180910390f35b3480156106bd57600080fd5b506106c6611683565b005b3480156106d457600080fd5b506106dd61171c565b6040516106ea91906144d6565b60405180910390f35b61070d60048036038101906107089190613b09565b611721565b005b34801561071b57600080fd5b5061073660048036038101906107319190613950565b6118f8565b005b34801561074457600080fd5b5061075f600480360381019061075a91906139d0565b611a79565b005b34801561076d57600080fd5b50610788600480360381019061078391906138cd565b611c31565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613b09565b611c93565b6040516107be91906140f4565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613990565b611e06565b005b3480156107fc57600080fd5b50610805611f33565b60405161081291906140d9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d919061383a565b611f46565b60405161084f91906140d9565b60405180910390f35b34801561086457600080fd5b5061086d611fda565b60405161087a91906140d9565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a5919061380d565b611fed565b005b6108c660048036038101906108c19190613b09565b612199565b005b3480156108d457600080fd5b506108dd612431565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610947906143b6565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0a5750610a09826124d9565b5b9050919050565b600a81565b606060008054610a25906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a51906147b2565b8015610a9e5780601f10610a7357610100808354040283529160200191610a9e565b820191906000526020600020905b815481529060010190602001808311610a8157829003601f168201915b5050505050905090565b6000610ab3826125bb565b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae990614356565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b38826110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090614436565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc8612627565b73ffffffffffffffffffffffffffffffffffffffff161480610bf75750610bf681610bf1612627565b611f46565b5b610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90614296565b60405180910390fd5b610c40838361262f565b505050565b6000600880549050905090565b610c63610c5d612627565b826126e8565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614456565b60405180910390fd5b610cad8383836127c6565b505050565b6000610cbd83611173565b8210610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590614156565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b600b5481565b610d78612627565b73ffffffffffffffffffffffffffffffffffffffff16610d966115c7565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614396565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610e76612627565b73ffffffffffffffffffffffffffffffffffffffff16610e946115c7565b73ffffffffffffffffffffffffffffffffffffffff1614610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190614396565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f35573d6000803e3d6000fd5b5050565b610f5483838360405180602001604052806000815250611c31565b505050565b600d5481565b6000610f69610c45565b8210610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190614476565b60405180910390fd5b60088281548110610fbe57610fbd61494b565b5b90600052602060002001549050919050565b610fd8612627565b73ffffffffffffffffffffffffffffffffffffffff16610ff66115c7565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390614396565b60405180910390fd5b601060009054906101000a900460ff161561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390614496565b60405180910390fd5b80601190805190602001906110b292919061352d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561115f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611156906142d6565b60405180910390fd5b80915050919050565b66b1a2bc2ec5000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db906142b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611233612627565b73ffffffffffffffffffffffffffffffffffffffff166112516115c7565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90614396565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611370612627565b73ffffffffffffffffffffffffffffffffffffffff1661138e6115c7565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db90614396565b60405180910390fd5b60005b81518110156115c357600073ffffffffffffffffffffffffffffffffffffffff1682828151811061141b5761141a61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906143d6565b60405180910390fd5b6001600e60008484815181106114935761149261494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008484815181106115055761150461494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115545760006115af565b600f600083838151811061156b5761156a61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806115bb90614815565b9150506113e7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611600906147b2565b80601f016020809104026020016040519081016040528092919081815260200182805461162c906147b2565b80156116795780601f1061164e57610100808354040283529160200191611679565b820191906000526020600020905b81548152906001019060200180831161165c57829003601f168201915b5050505050905090565b61168b612627565b73ffffffffffffffffffffffffffffffffffffffff166116a96115c7565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690614396565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b600581565b600c60009054906101000a900460ff16611770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611767906144b6565b60405180910390fd5b600081116117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614136565b60405180910390fd5b6117ca600d54600b54612a2290919063ffffffff16565b6117e4826117d6610c45565b612a3890919063ffffffff16565b1115611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614316565b60405180910390fd5b600a811115611869576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611860906141d6565b60405180910390fd5b346118848266b1a2bc2ec50000612a4e90919063ffffffff16565b11156118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc906142f6565b60405180910390fd5b60005b818110156118f4576118e1336118dc610c45565b612a64565b80806118ec90614815565b9150506118c8565b5050565b611900612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614256565b60405180910390fd5b806005600061197b612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a28612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6d91906140d9565b60405180910390a35050565b611a81612627565b73ffffffffffffffffffffffffffffffffffffffff16611a9f6115c7565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614396565b60405180910390fd5b60005b82829050811015611c2c57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611b2e57611b2d61494b565b5b9050602002016020810190611b43919061380d565b73ffffffffffffffffffffffffffffffffffffffff161415611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b91906143d6565b60405180910390fd5b6000600e6000858585818110611bb357611bb261494b565b5b9050602002016020810190611bc8919061380d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c2490614815565b915050611af8565b505050565b611c42611c3c612627565b836126e8565b611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614456565b60405180910390fd5b611c8d84848484612a82565b50505050565b6060611c9e826125bb565b611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614416565b60405180910390fd5b6000601260008481526020019081526020016000208054611cfd906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d29906147b2565b8015611d765780601f10611d4b57610100808354040283529160200191611d76565b820191906000526020600020905b815481529060010190602001808311611d5957829003601f168201915b505050505090506000611d87612ade565b9050600081511415611d9d578192505050611e01565b600082511115611dd2578082604051602001611dba929190614043565b60405160208183030381529060405292505050611e01565b80611ddc85612b70565b604051602001611ded929190614043565b604051602081830303815290604052925050505b919050565b611e0e612627565b73ffffffffffffffffffffffffffffffffffffffff16611e2c6115c7565b73ffffffffffffffffffffffffffffffffffffffff1614611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614396565b60405180910390fd5b6000611e8c610c45565b9050600082118015611ea05750600d548211155b611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614216565b60405180910390fd5b60005b82811015611f1257611eff848284611efa91906145e7565b612a64565b8080611f0a90614815565b915050611ee2565b50611f2882600d54612a2290919063ffffffff16565b600d81905550505050565b601060009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611ff5612627565b73ffffffffffffffffffffffffffffffffffffffff166120136115c7565b73ffffffffffffffffffffffffffffffffffffffff1614612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614396565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60019054906101000a900460ff166121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614116565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614376565b60405180910390fd5b600581600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122c891906145e7565b1115612309576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612300906141f6565b60405180910390fd5b6000811161234c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234390614136565b60405180910390fd5b346123678266b1a2bc2ec50000612a4e90919063ffffffff16565b11156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f906142f6565b60405180910390fd5b60005b818110156123d7576123c4336123bf610c45565b612a64565b80806123cf90614815565b9150506123ab565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242791906145e7565b9250508190555050565b612439612627565b73ffffffffffffffffffffffffffffffffffffffff166124576115c7565b73ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614396565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b457506125b382612cd1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126a2836110b6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126f3826125bb565b612732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272990614276565b60405180910390fd5b600061273d836110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127ac57508373ffffffffffffffffffffffffffffffffffffffff1661279484610aa8565b73ffffffffffffffffffffffffffffffffffffffff16145b806127bd57506127bc8185611f46565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127e6826110b6565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612833906143f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a390614236565b60405180910390fd5b6128b7838383612d3b565b6128c260008261262f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291291906146c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461296991906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a3091906146c8565b905092915050565b60008183612a4691906145e7565b905092915050565b60008183612a5c919061466e565b905092915050565b612a7e828260405180602001604052806000815250612e4f565b5050565b612a8d8484846127c6565b612a9984848484612eaa565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614176565b60405180910390fd5b50505050565b606060118054612aed906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612b19906147b2565b8015612b665780601f10612b3b57610100808354040283529160200191612b66565b820191906000526020600020905b815481529060010190602001808311612b4957829003601f168201915b5050505050905090565b60606000821415612bb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ccc565b600082905060005b60008214612bea578080612bd390614815565b915050600a82612be3919061463d565b9150612bc0565b60008167ffffffffffffffff811115612c0657612c0561497a565b5b6040519080825280601f01601f191660200182016040528015612c385781602001600182028036833780820191505090505b5090505b60008514612cc557600182612c5191906146c8565b9150600a85612c60919061485e565b6030612c6c91906145e7565b60f81b818381518110612c8257612c8161494b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cbe919061463d565b9450612c3c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d46838383613041565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d8957612d8481613046565b612dc8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dc757612dc6838261308f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e0b57612e06816131fc565b612e4a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e4957612e4882826132cd565b5b5b505050565b612e59838361334c565b612e666000848484612eaa565b612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614176565b60405180910390fd5b505050565b6000612ecb8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613034578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef4612627565b8786866040518563ffffffff1660e01b8152600401612f16949392919061408d565b602060405180830381600087803b158015612f3057600080fd5b505af1925050508015612f6157506040513d601f19601f82011682018060405250810190612f5e9190613a93565b60015b612fe4573d8060008114612f91576040519150601f19603f3d011682016040523d82523d6000602084013e612f96565b606091505b50600081511415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614176565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613039565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161309c84611173565b6130a691906146c8565b905060006007600084815260200190815260200160002054905081811461318b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321091906146c8565b90506000600960008481526020019081526020016000205490506000600883815481106132405761323f61494b565b5b9060005260206000200154905080600883815481106132625761326161494b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132b1576132b061491c565b5b6001900381819060005260206000200160009055905550505050565b60006132d883611173565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b390614336565b60405180910390fd5b6133c5816125bb565b15613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc906141b6565b60405180910390fd5b61341160008383612d3b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461346191906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613539906147b2565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b60006135e36135de84614516565b6144f1565b90508083825260208201905082856020860282011115613606576136056149b3565b5b60005b85811015613636578161361c88826136c4565b845260208401935060208301925050600181019050613609565b5050509392505050565b600061365361364e84614542565b6144f1565b90508281526020810184848401111561366f5761366e6149b8565b5b61367a848285614770565b509392505050565b600061369561369084614573565b6144f1565b9050828152602081018484840111156136b1576136b06149b8565b5b6136bc848285614770565b509392505050565b6000813590506136d3816151a1565b92915050565b60008083601f8401126136ef576136ee6149ae565b5b8235905067ffffffffffffffff81111561370c5761370b6149a9565b5b602083019150836020820283011115613728576137276149b3565b5b9250929050565b600082601f830112613744576137436149ae565b5b81356137548482602086016135d0565b91505092915050565b60008135905061376c816151b8565b92915050565b600081359050613781816151cf565b92915050565b600081519050613796816151cf565b92915050565b600082601f8301126137b1576137b06149ae565b5b81356137c1848260208601613640565b91505092915050565b600082601f8301126137df576137de6149ae565b5b81356137ef848260208601613682565b91505092915050565b600081359050613807816151e6565b92915050565b600060208284031215613823576138226149c2565b5b6000613831848285016136c4565b91505092915050565b60008060408385031215613851576138506149c2565b5b600061385f858286016136c4565b9250506020613870858286016136c4565b9150509250929050565b600080600060608486031215613893576138926149c2565b5b60006138a1868287016136c4565b93505060206138b2868287016136c4565b92505060406138c3868287016137f8565b9150509250925092565b600080600080608085870312156138e7576138e66149c2565b5b60006138f5878288016136c4565b9450506020613906878288016136c4565b9350506040613917878288016137f8565b925050606085013567ffffffffffffffff811115613938576139376149bd565b5b6139448782880161379c565b91505092959194509250565b60008060408385031215613967576139666149c2565b5b6000613975858286016136c4565b92505060206139868582860161375d565b9150509250929050565b600080604083850312156139a7576139a66149c2565b5b60006139b5858286016136c4565b92505060206139c6858286016137f8565b9150509250929050565b600080602083850312156139e7576139e66149c2565b5b600083013567ffffffffffffffff811115613a0557613a046149bd565b5b613a11858286016136d9565b92509250509250929050565b600060208284031215613a3357613a326149c2565b5b600082013567ffffffffffffffff811115613a5157613a506149bd565b5b613a5d8482850161372f565b91505092915050565b600060208284031215613a7c57613a7b6149c2565b5b6000613a8a84828501613772565b91505092915050565b600060208284031215613aa957613aa86149c2565b5b6000613ab784828501613787565b91505092915050565b600060208284031215613ad657613ad56149c2565b5b600082013567ffffffffffffffff811115613af457613af36149bd565b5b613b00848285016137ca565b91505092915050565b600060208284031215613b1f57613b1e6149c2565b5b6000613b2d848285016137f8565b91505092915050565b613b3f816146fc565b82525050565b613b4e8161470e565b82525050565b6000613b5f826145a4565b613b6981856145ba565b9350613b7981856020860161477f565b613b82816149c7565b840191505092915050565b6000613b98826145af565b613ba281856145cb565b9350613bb281856020860161477f565b613bbb816149c7565b840191505092915050565b6000613bd1826145af565b613bdb81856145dc565b9350613beb81856020860161477f565b80840191505092915050565b6000613c046023836145cb565b9150613c0f826149d8565b604082019050919050565b6000613c276033836145cb565b9150613c3282614a27565b604082019050919050565b6000613c4a602b836145cb565b9150613c5582614a76565b604082019050919050565b6000613c6d6032836145cb565b9150613c7882614ac5565b604082019050919050565b6000613c906026836145cb565b9150613c9b82614b14565b604082019050919050565b6000613cb3601c836145cb565b9150613cbe82614b63565b602082019050919050565b6000613cd66023836145cb565b9150613ce182614b8c565b604082019050919050565b6000613cf96027836145cb565b9150613d0482614bdb565b604082019050919050565b6000613d1c6020836145cb565b9150613d2782614c2a565b602082019050919050565b6000613d3f6024836145cb565b9150613d4a82614c53565b604082019050919050565b6000613d626019836145cb565b9150613d6d82614ca2565b602082019050919050565b6000613d85602c836145cb565b9150613d9082614ccb565b604082019050919050565b6000613da86038836145cb565b9150613db382614d1a565b604082019050919050565b6000613dcb602a836145cb565b9150613dd682614d69565b604082019050919050565b6000613dee6029836145cb565b9150613df982614db8565b604082019050919050565b6000613e11601d836145cb565b9150613e1c82614e07565b602082019050919050565b6000613e346020836145cb565b9150613e3f82614e30565b602082019050919050565b6000613e576020836145cb565b9150613e6282614e59565b602082019050919050565b6000613e7a602c836145cb565b9150613e8582614e82565b604082019050919050565b6000613e9d6030836145cb565b9150613ea882614ed1565b604082019050919050565b6000613ec06005836145dc565b9150613ecb82614f20565b600582019050919050565b6000613ee36020836145cb565b9150613eee82614f49565b602082019050919050565b6000613f06601e836145cb565b9150613f1182614f72565b602082019050919050565b6000613f29601a836145cb565b9150613f3482614f9b565b602082019050919050565b6000613f4c6029836145cb565b9150613f5782614fc4565b604082019050919050565b6000613f6f602f836145cb565b9150613f7a82615013565b604082019050919050565b6000613f926021836145cb565b9150613f9d82615062565b604082019050919050565b6000613fb56031836145cb565b9150613fc0826150b1565b604082019050919050565b6000613fd8602c836145cb565b9150613fe382615100565b604082019050919050565b6000613ffb6012836145cb565b91506140068261514f565b602082019050919050565b600061401e6020836145cb565b915061402982615178565b602082019050919050565b61403d81614766565b82525050565b600061404f8285613bc6565b915061405b8284613bc6565b915061406682613eb3565b91508190509392505050565b60006020820190506140876000830184613b36565b92915050565b60006080820190506140a26000830187613b36565b6140af6020830186613b36565b6140bc6040830185614034565b81810360608301526140ce8184613b54565b905095945050505050565b60006020820190506140ee6000830184613b45565b92915050565b6000602082019050818103600083015261410e8184613b8d565b905092915050565b6000602082019050818103600083015261412f81613bf7565b9050919050565b6000602082019050818103600083015261414f81613c1a565b9050919050565b6000602082019050818103600083015261416f81613c3d565b9050919050565b6000602082019050818103600083015261418f81613c60565b9050919050565b600060208201905081810360008301526141af81613c83565b9050919050565b600060208201905081810360008301526141cf81613ca6565b9050919050565b600060208201905081810360008301526141ef81613cc9565b9050919050565b6000602082019050818103600083015261420f81613cec565b9050919050565b6000602082019050818103600083015261422f81613d0f565b9050919050565b6000602082019050818103600083015261424f81613d32565b9050919050565b6000602082019050818103600083015261426f81613d55565b9050919050565b6000602082019050818103600083015261428f81613d78565b9050919050565b600060208201905081810360008301526142af81613d9b565b9050919050565b600060208201905081810360008301526142cf81613dbe565b9050919050565b600060208201905081810360008301526142ef81613de1565b9050919050565b6000602082019050818103600083015261430f81613e04565b9050919050565b6000602082019050818103600083015261432f81613e27565b9050919050565b6000602082019050818103600083015261434f81613e4a565b9050919050565b6000602082019050818103600083015261436f81613e6d565b9050919050565b6000602082019050818103600083015261438f81613e90565b9050919050565b600060208201905081810360008301526143af81613ed6565b9050919050565b600060208201905081810360008301526143cf81613ef9565b9050919050565b600060208201905081810360008301526143ef81613f1c565b9050919050565b6000602082019050818103600083015261440f81613f3f565b9050919050565b6000602082019050818103600083015261442f81613f62565b9050919050565b6000602082019050818103600083015261444f81613f85565b9050919050565b6000602082019050818103600083015261446f81613fa8565b9050919050565b6000602082019050818103600083015261448f81613fcb565b9050919050565b600060208201905081810360008301526144af81613fee565b9050919050565b600060208201905081810360008301526144cf81614011565b9050919050565b60006020820190506144eb6000830184614034565b92915050565b60006144fb61450c565b905061450782826147e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156145315761453061497a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561455d5761455c61497a565b5b614566826149c7565b9050602081019050919050565b600067ffffffffffffffff82111561458e5761458d61497a565b5b614597826149c7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145f282614766565b91506145fd83614766565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146325761463161488f565b5b828201905092915050565b600061464882614766565b915061465383614766565b925082614663576146626148be565b5b828204905092915050565b600061467982614766565b915061468483614766565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bd576146bc61488f565b5b828202905092915050565b60006146d382614766565b91506146de83614766565b9250828210156146f1576146f061488f565b5b828203905092915050565b600061470782614746565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479d578082015181840152602081019050614782565b838111156147ac576000848401525b50505050565b600060028204905060018216806147ca57607f821691505b602082108114156147de576147dd6148ed565b5b50919050565b6147ed826149c7565b810181811067ffffffffffffffff8211171561480c5761480b61497a565b5b80604052505050565b600061482082614766565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148535761485261488f565b5b600182019050919050565b600061486982614766565b915061487483614766565b925082614884576148836148be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f742061637469766520617420746865206d6f6d60008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320737570706c79206f662070726573616c6520796f7520636160008201527f6e206d696e742e00000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f742077686974656c69737465642060008201527f666f72207468652070726573616c652e00000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6151aa816146fc565b81146151b557600080fd5b50565b6151c18161470e565b81146151cc57600080fd5b50565b6151d88161471a565b81146151e357600080fd5b50565b6151ef81614766565b81146151fa57600080fd5b5056fea264697066735822122082c0832190034a63dbf081b4b0bda03e653ea6847f722a131dea0e0cb192f75464736f6c63430008070033
Deployed Bytecode
0x60806040526004361061022f5760003560e01c8063676dd5631161012e578063a51312c8116100ab578063e985e9c51161006f578063e985e9c51461081b578063eb8d244414610858578063f2fde38b14610883578063f759867a146108ac578063f81227d4146108c85761022f565b8063a51312c814610738578063b88d4fde14610761578063c87b56dd1461078a578063cc47a40b146107c7578063d7e45cd7146107f05761022f565b806395d89b41116100f257806395d89b4114610686578063989bdbb6146106b1578063a06a513f146106c8578063a0712d68146106f3578063a22cb4651461070f5761022f565b8063676dd563146105b357806370a08231146105de578063715018a61461061b5780637f649783146106325780638da5cb5b1461065b5761022f565b806330f72cd4116101bc57806342842e0e1161018057806342842e0e146104bc5780634287f14a146104e55780634f6ccce71461051057806355f804b31461054d5780636352211e146105765761022f565b806330f72cd4146103fb57806332cb6b0c1461042657806334918dfd146104515780633af32abf146104685780633ccfd60b146104a55761022f565b8063081812fc11610203578063081812fc14610304578063095ea7b31461034157806318160ddd1461036a57806323b872dd146103955780632f745c59146103be5761022f565b806208ffdd1461023457806301ffc9a714610271578063020b39cc146102ae57806306fdde03146102d9575b600080fd5b34801561024057600080fd5b5061025b6004803603810190610256919061380d565b6108df565b60405161026891906144d6565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613a66565b610997565b6040516102a591906140d9565b60405180910390f35b3480156102ba57600080fd5b506102c3610a11565b6040516102d091906144d6565b60405180910390f35b3480156102e557600080fd5b506102ee610a16565b6040516102fb91906140f4565b60405180910390f35b34801561031057600080fd5b5061032b60048036038101906103269190613b09565b610aa8565b6040516103389190614072565b60405180910390f35b34801561034d57600080fd5b5061036860048036038101906103639190613990565b610b2d565b005b34801561037657600080fd5b5061037f610c45565b60405161038c91906144d6565b60405180910390f35b3480156103a157600080fd5b506103bc60048036038101906103b7919061387a565b610c52565b005b3480156103ca57600080fd5b506103e560048036038101906103e09190613990565b610cb2565b6040516103f291906144d6565b60405180910390f35b34801561040757600080fd5b50610410610d57565b60405161041d91906140d9565b60405180910390f35b34801561043257600080fd5b5061043b610d6a565b60405161044891906144d6565b60405180910390f35b34801561045d57600080fd5b50610466610d70565b005b34801561047457600080fd5b5061048f600480360381019061048a919061380d565b610e18565b60405161049c91906140d9565b60405180910390f35b3480156104b157600080fd5b506104ba610e6e565b005b3480156104c857600080fd5b506104e360048036038101906104de919061387a565b610f39565b005b3480156104f157600080fd5b506104fa610f59565b60405161050791906144d6565b60405180910390f35b34801561051c57600080fd5b5061053760048036038101906105329190613b09565b610f5f565b60405161054491906144d6565b60405180910390f35b34801561055957600080fd5b50610574600480360381019061056f9190613ac0565b610fd0565b005b34801561058257600080fd5b5061059d60048036038101906105989190613b09565b6110b6565b6040516105aa9190614072565b60405180910390f35b3480156105bf57600080fd5b506105c8611168565b6040516105d591906144d6565b60405180910390f35b3480156105ea57600080fd5b506106056004803603810190610600919061380d565b611173565b60405161061291906144d6565b60405180910390f35b34801561062757600080fd5b5061063061122b565b005b34801561063e57600080fd5b5061065960048036038101906106549190613a1d565b611368565b005b34801561066757600080fd5b506106706115c7565b60405161067d9190614072565b60405180910390f35b34801561069257600080fd5b5061069b6115f1565b6040516106a891906140f4565b60405180910390f35b3480156106bd57600080fd5b506106c6611683565b005b3480156106d457600080fd5b506106dd61171c565b6040516106ea91906144d6565b60405180910390f35b61070d60048036038101906107089190613b09565b611721565b005b34801561071b57600080fd5b5061073660048036038101906107319190613950565b6118f8565b005b34801561074457600080fd5b5061075f600480360381019061075a91906139d0565b611a79565b005b34801561076d57600080fd5b50610788600480360381019061078391906138cd565b611c31565b005b34801561079657600080fd5b506107b160048036038101906107ac9190613b09565b611c93565b6040516107be91906140f4565b60405180910390f35b3480156107d357600080fd5b506107ee60048036038101906107e99190613990565b611e06565b005b3480156107fc57600080fd5b50610805611f33565b60405161081291906140d9565b60405180910390f35b34801561082757600080fd5b50610842600480360381019061083d919061383a565b611f46565b60405161084f91906140d9565b60405180910390f35b34801561086457600080fd5b5061086d611fda565b60405161087a91906140d9565b60405180910390f35b34801561088f57600080fd5b506108aa60048036038101906108a5919061380d565b611fed565b005b6108c660048036038101906108c19190613b09565b612199565b005b3480156108d457600080fd5b506108dd612431565b005b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610950576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610947906143b6565b60405180910390fd5b600f60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610a0a5750610a09826124d9565b5b9050919050565b600a81565b606060008054610a25906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054610a51906147b2565b8015610a9e5780601f10610a7357610100808354040283529160200191610a9e565b820191906000526020600020905b815481529060010190602001808311610a8157829003601f168201915b5050505050905090565b6000610ab3826125bb565b610af2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ae990614356565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b38826110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba090614436565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bc8612627565b73ffffffffffffffffffffffffffffffffffffffff161480610bf75750610bf681610bf1612627565b611f46565b5b610c36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2d90614296565b60405180910390fd5b610c40838361262f565b505050565b6000600880549050905090565b610c63610c5d612627565b826126e8565b610ca2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9990614456565b60405180910390fd5b610cad8383836127c6565b505050565b6000610cbd83611173565b8210610cfe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cf590614156565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600c60019054906101000a900460ff1681565b600b5481565b610d78612627565b73ffffffffffffffffffffffffffffffffffffffff16610d966115c7565b73ffffffffffffffffffffffffffffffffffffffff1614610dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610de390614396565b60405180910390fd5b600c60009054906101000a900460ff1615600c60006101000a81548160ff021916908315150217905550565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b610e76612627565b73ffffffffffffffffffffffffffffffffffffffff16610e946115c7565b73ffffffffffffffffffffffffffffffffffffffff1614610eea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ee190614396565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610f35573d6000803e3d6000fd5b5050565b610f5483838360405180602001604052806000815250611c31565b505050565b600d5481565b6000610f69610c45565b8210610faa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa190614476565b60405180910390fd5b60088281548110610fbe57610fbd61494b565b5b90600052602060002001549050919050565b610fd8612627565b73ffffffffffffffffffffffffffffffffffffffff16610ff66115c7565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390614396565b60405180910390fd5b601060009054906101000a900460ff161561109c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109390614496565b60405180910390fd5b80601190805190602001906110b292919061352d565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561115f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611156906142d6565b60405180910390fd5b80915050919050565b66b1a2bc2ec5000081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111db906142b6565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611233612627565b73ffffffffffffffffffffffffffffffffffffffff166112516115c7565b73ffffffffffffffffffffffffffffffffffffffff16146112a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161129e90614396565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b611370612627565b73ffffffffffffffffffffffffffffffffffffffff1661138e6115c7565b73ffffffffffffffffffffffffffffffffffffffff16146113e4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113db90614396565b60405180910390fd5b60005b81518110156115c357600073ffffffffffffffffffffffffffffffffffffffff1682828151811061141b5761141a61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff16141561147a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611471906143d6565b60405180910390fd5b6001600e60008484815181106114935761149261494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506000600f60008484815181106115055761150461494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054116115545760006115af565b600f600083838151811061156b5761156a61494b565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020545b5080806115bb90614815565b9150506113e7565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611600906147b2565b80601f016020809104026020016040519081016040528092919081815260200182805461162c906147b2565b80156116795780601f1061164e57610100808354040283529160200191611679565b820191906000526020600020905b81548152906001019060200180831161165c57829003601f168201915b5050505050905090565b61168b612627565b73ffffffffffffffffffffffffffffffffffffffff166116a96115c7565b73ffffffffffffffffffffffffffffffffffffffff16146116ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116f690614396565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b600581565b600c60009054906101000a900460ff16611770576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611767906144b6565b60405180910390fd5b600081116117b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117aa90614136565b60405180910390fd5b6117ca600d54600b54612a2290919063ffffffff16565b6117e4826117d6610c45565b612a3890919063ffffffff16565b1115611825576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161181c90614316565b60405180910390fd5b600a811115611869576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611860906141d6565b60405180910390fd5b346118848266b1a2bc2ec50000612a4e90919063ffffffff16565b11156118c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bc906142f6565b60405180910390fd5b60005b818110156118f4576118e1336118dc610c45565b612a64565b80806118ec90614815565b9150506118c8565b5050565b611900612627565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561196e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196590614256565b60405180910390fd5b806005600061197b612627565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611a28612627565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611a6d91906140d9565b60405180910390a35050565b611a81612627565b73ffffffffffffffffffffffffffffffffffffffff16611a9f6115c7565b73ffffffffffffffffffffffffffffffffffffffff1614611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec90614396565b60405180910390fd5b60005b82829050811015611c2c57600073ffffffffffffffffffffffffffffffffffffffff16838383818110611b2e57611b2d61494b565b5b9050602002016020810190611b43919061380d565b73ffffffffffffffffffffffffffffffffffffffff161415611b9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b91906143d6565b60405180910390fd5b6000600e6000858585818110611bb357611bb261494b565b5b9050602002016020810190611bc8919061380d565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611c2490614815565b915050611af8565b505050565b611c42611c3c612627565b836126e8565b611c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7890614456565b60405180910390fd5b611c8d84848484612a82565b50505050565b6060611c9e826125bb565b611cdd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cd490614416565b60405180910390fd5b6000601260008481526020019081526020016000208054611cfd906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054611d29906147b2565b8015611d765780601f10611d4b57610100808354040283529160200191611d76565b820191906000526020600020905b815481529060010190602001808311611d5957829003601f168201915b505050505090506000611d87612ade565b9050600081511415611d9d578192505050611e01565b600082511115611dd2578082604051602001611dba929190614043565b60405160208183030381529060405292505050611e01565b80611ddc85612b70565b604051602001611ded929190614043565b604051602081830303815290604052925050505b919050565b611e0e612627565b73ffffffffffffffffffffffffffffffffffffffff16611e2c6115c7565b73ffffffffffffffffffffffffffffffffffffffff1614611e82576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7990614396565b60405180910390fd5b6000611e8c610c45565b9050600082118015611ea05750600d548211155b611edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed690614216565b60405180910390fd5b60005b82811015611f1257611eff848284611efa91906145e7565b612a64565b8080611f0a90614815565b915050611ee2565b50611f2882600d54612a2290919063ffffffff16565b600d81905550505050565b601060009054906101000a900460ff1681565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c60009054906101000a900460ff1681565b611ff5612627565b73ffffffffffffffffffffffffffffffffffffffff166120136115c7565b73ffffffffffffffffffffffffffffffffffffffff1614612069576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206090614396565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090614196565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600c60019054906101000a900460ff166121e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121df90614116565b60405180910390fd5b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1615151461227b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227290614376565b60405180910390fd5b600581600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122c891906145e7565b1115612309576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612300906141f6565b60405180910390fd5b6000811161234c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234390614136565b60405180910390fd5b346123678266b1a2bc2ec50000612a4e90919063ffffffff16565b11156123a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239f906142f6565b60405180910390fd5b60005b818110156123d7576123c4336123bf610c45565b612a64565b80806123cf90614815565b9150506123ab565b5080600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461242791906145e7565b9250508190555050565b612439612627565b73ffffffffffffffffffffffffffffffffffffffff166124576115c7565b73ffffffffffffffffffffffffffffffffffffffff16146124ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124a490614396565b60405180910390fd5b600c60019054906101000a900460ff1615600c60016101000a81548160ff021916908315150217905550565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806125a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806125b457506125b382612cd1565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126a2836110b6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126f3826125bb565b612732576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272990614276565b60405180910390fd5b600061273d836110b6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127ac57508373ffffffffffffffffffffffffffffffffffffffff1661279484610aa8565b73ffffffffffffffffffffffffffffffffffffffff16145b806127bd57506127bc8185611f46565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127e6826110b6565b73ffffffffffffffffffffffffffffffffffffffff161461283c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612833906143f6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128a390614236565b60405180910390fd5b6128b7838383612d3b565b6128c260008261262f565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461291291906146c8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461296991906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60008183612a3091906146c8565b905092915050565b60008183612a4691906145e7565b905092915050565b60008183612a5c919061466e565b905092915050565b612a7e828260405180602001604052806000815250612e4f565b5050565b612a8d8484846127c6565b612a9984848484612eaa565b612ad8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612acf90614176565b60405180910390fd5b50505050565b606060118054612aed906147b2565b80601f0160208091040260200160405190810160405280929190818152602001828054612b19906147b2565b8015612b665780601f10612b3b57610100808354040283529160200191612b66565b820191906000526020600020905b815481529060010190602001808311612b4957829003601f168201915b5050505050905090565b60606000821415612bb8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612ccc565b600082905060005b60008214612bea578080612bd390614815565b915050600a82612be3919061463d565b9150612bc0565b60008167ffffffffffffffff811115612c0657612c0561497a565b5b6040519080825280601f01601f191660200182016040528015612c385781602001600182028036833780820191505090505b5090505b60008514612cc557600182612c5191906146c8565b9150600a85612c60919061485e565b6030612c6c91906145e7565b60f81b818381518110612c8257612c8161494b565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612cbe919061463d565b9450612c3c565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612d46838383613041565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612d8957612d8481613046565b612dc8565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612dc757612dc6838261308f565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e0b57612e06816131fc565b612e4a565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612e4957612e4882826132cd565b5b5b505050565b612e59838361334c565b612e666000848484612eaa565b612ea5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9c90614176565b60405180910390fd5b505050565b6000612ecb8473ffffffffffffffffffffffffffffffffffffffff1661351a565b15613034578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ef4612627565b8786866040518563ffffffff1660e01b8152600401612f16949392919061408d565b602060405180830381600087803b158015612f3057600080fd5b505af1925050508015612f6157506040513d601f19601f82011682018060405250810190612f5e9190613a93565b60015b612fe4573d8060008114612f91576040519150601f19603f3d011682016040523d82523d6000602084013e612f96565b606091505b50600081511415612fdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fd390614176565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613039565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161309c84611173565b6130a691906146c8565b905060006007600084815260200190815260200160002054905081811461318b576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061321091906146c8565b90506000600960008481526020019081526020016000205490506000600883815481106132405761323f61494b565b5b9060005260206000200154905080600883815481106132625761326161494b565b5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806132b1576132b061491c565b5b6001900381819060005260206000200160009055905550505050565b60006132d883611173565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156133bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133b390614336565b60405180910390fd5b6133c5816125bb565b15613405576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133fc906141b6565b60405180910390fd5b61341160008383612d3b565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461346191906145e7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054613539906147b2565b90600052602060002090601f01602090048101928261355b57600085556135a2565b82601f1061357457805160ff19168380011785556135a2565b828001600101855582156135a2579182015b828111156135a1578251825591602001919060010190613586565b5b5090506135af91906135b3565b5090565b5b808211156135cc5760008160009055506001016135b4565b5090565b60006135e36135de84614516565b6144f1565b90508083825260208201905082856020860282011115613606576136056149b3565b5b60005b85811015613636578161361c88826136c4565b845260208401935060208301925050600181019050613609565b5050509392505050565b600061365361364e84614542565b6144f1565b90508281526020810184848401111561366f5761366e6149b8565b5b61367a848285614770565b509392505050565b600061369561369084614573565b6144f1565b9050828152602081018484840111156136b1576136b06149b8565b5b6136bc848285614770565b509392505050565b6000813590506136d3816151a1565b92915050565b60008083601f8401126136ef576136ee6149ae565b5b8235905067ffffffffffffffff81111561370c5761370b6149a9565b5b602083019150836020820283011115613728576137276149b3565b5b9250929050565b600082601f830112613744576137436149ae565b5b81356137548482602086016135d0565b91505092915050565b60008135905061376c816151b8565b92915050565b600081359050613781816151cf565b92915050565b600081519050613796816151cf565b92915050565b600082601f8301126137b1576137b06149ae565b5b81356137c1848260208601613640565b91505092915050565b600082601f8301126137df576137de6149ae565b5b81356137ef848260208601613682565b91505092915050565b600081359050613807816151e6565b92915050565b600060208284031215613823576138226149c2565b5b6000613831848285016136c4565b91505092915050565b60008060408385031215613851576138506149c2565b5b600061385f858286016136c4565b9250506020613870858286016136c4565b9150509250929050565b600080600060608486031215613893576138926149c2565b5b60006138a1868287016136c4565b93505060206138b2868287016136c4565b92505060406138c3868287016137f8565b9150509250925092565b600080600080608085870312156138e7576138e66149c2565b5b60006138f5878288016136c4565b9450506020613906878288016136c4565b9350506040613917878288016137f8565b925050606085013567ffffffffffffffff811115613938576139376149bd565b5b6139448782880161379c565b91505092959194509250565b60008060408385031215613967576139666149c2565b5b6000613975858286016136c4565b92505060206139868582860161375d565b9150509250929050565b600080604083850312156139a7576139a66149c2565b5b60006139b5858286016136c4565b92505060206139c6858286016137f8565b9150509250929050565b600080602083850312156139e7576139e66149c2565b5b600083013567ffffffffffffffff811115613a0557613a046149bd565b5b613a11858286016136d9565b92509250509250929050565b600060208284031215613a3357613a326149c2565b5b600082013567ffffffffffffffff811115613a5157613a506149bd565b5b613a5d8482850161372f565b91505092915050565b600060208284031215613a7c57613a7b6149c2565b5b6000613a8a84828501613772565b91505092915050565b600060208284031215613aa957613aa86149c2565b5b6000613ab784828501613787565b91505092915050565b600060208284031215613ad657613ad56149c2565b5b600082013567ffffffffffffffff811115613af457613af36149bd565b5b613b00848285016137ca565b91505092915050565b600060208284031215613b1f57613b1e6149c2565b5b6000613b2d848285016137f8565b91505092915050565b613b3f816146fc565b82525050565b613b4e8161470e565b82525050565b6000613b5f826145a4565b613b6981856145ba565b9350613b7981856020860161477f565b613b82816149c7565b840191505092915050565b6000613b98826145af565b613ba281856145cb565b9350613bb281856020860161477f565b613bbb816149c7565b840191505092915050565b6000613bd1826145af565b613bdb81856145dc565b9350613beb81856020860161477f565b80840191505092915050565b6000613c046023836145cb565b9150613c0f826149d8565b604082019050919050565b6000613c276033836145cb565b9150613c3282614a27565b604082019050919050565b6000613c4a602b836145cb565b9150613c5582614a76565b604082019050919050565b6000613c6d6032836145cb565b9150613c7882614ac5565b604082019050919050565b6000613c906026836145cb565b9150613c9b82614b14565b604082019050919050565b6000613cb3601c836145cb565b9150613cbe82614b63565b602082019050919050565b6000613cd66023836145cb565b9150613ce182614b8c565b604082019050919050565b6000613cf96027836145cb565b9150613d0482614bdb565b604082019050919050565b6000613d1c6020836145cb565b9150613d2782614c2a565b602082019050919050565b6000613d3f6024836145cb565b9150613d4a82614c53565b604082019050919050565b6000613d626019836145cb565b9150613d6d82614ca2565b602082019050919050565b6000613d85602c836145cb565b9150613d9082614ccb565b604082019050919050565b6000613da86038836145cb565b9150613db382614d1a565b604082019050919050565b6000613dcb602a836145cb565b9150613dd682614d69565b604082019050919050565b6000613dee6029836145cb565b9150613df982614db8565b604082019050919050565b6000613e11601d836145cb565b9150613e1c82614e07565b602082019050919050565b6000613e346020836145cb565b9150613e3f82614e30565b602082019050919050565b6000613e576020836145cb565b9150613e6282614e59565b602082019050919050565b6000613e7a602c836145cb565b9150613e8582614e82565b604082019050919050565b6000613e9d6030836145cb565b9150613ea882614ed1565b604082019050919050565b6000613ec06005836145dc565b9150613ecb82614f20565b600582019050919050565b6000613ee36020836145cb565b9150613eee82614f49565b602082019050919050565b6000613f06601e836145cb565b9150613f1182614f72565b602082019050919050565b6000613f29601a836145cb565b9150613f3482614f9b565b602082019050919050565b6000613f4c6029836145cb565b9150613f5782614fc4565b604082019050919050565b6000613f6f602f836145cb565b9150613f7a82615013565b604082019050919050565b6000613f926021836145cb565b9150613f9d82615062565b604082019050919050565b6000613fb56031836145cb565b9150613fc0826150b1565b604082019050919050565b6000613fd8602c836145cb565b9150613fe382615100565b604082019050919050565b6000613ffb6012836145cb565b91506140068261514f565b602082019050919050565b600061401e6020836145cb565b915061402982615178565b602082019050919050565b61403d81614766565b82525050565b600061404f8285613bc6565b915061405b8284613bc6565b915061406682613eb3565b91508190509392505050565b60006020820190506140876000830184613b36565b92915050565b60006080820190506140a26000830187613b36565b6140af6020830186613b36565b6140bc6040830185614034565b81810360608301526140ce8184613b54565b905095945050505050565b60006020820190506140ee6000830184613b45565b92915050565b6000602082019050818103600083015261410e8184613b8d565b905092915050565b6000602082019050818103600083015261412f81613bf7565b9050919050565b6000602082019050818103600083015261414f81613c1a565b9050919050565b6000602082019050818103600083015261416f81613c3d565b9050919050565b6000602082019050818103600083015261418f81613c60565b9050919050565b600060208201905081810360008301526141af81613c83565b9050919050565b600060208201905081810360008301526141cf81613ca6565b9050919050565b600060208201905081810360008301526141ef81613cc9565b9050919050565b6000602082019050818103600083015261420f81613cec565b9050919050565b6000602082019050818103600083015261422f81613d0f565b9050919050565b6000602082019050818103600083015261424f81613d32565b9050919050565b6000602082019050818103600083015261426f81613d55565b9050919050565b6000602082019050818103600083015261428f81613d78565b9050919050565b600060208201905081810360008301526142af81613d9b565b9050919050565b600060208201905081810360008301526142cf81613dbe565b9050919050565b600060208201905081810360008301526142ef81613de1565b9050919050565b6000602082019050818103600083015261430f81613e04565b9050919050565b6000602082019050818103600083015261432f81613e27565b9050919050565b6000602082019050818103600083015261434f81613e4a565b9050919050565b6000602082019050818103600083015261436f81613e6d565b9050919050565b6000602082019050818103600083015261438f81613e90565b9050919050565b600060208201905081810360008301526143af81613ed6565b9050919050565b600060208201905081810360008301526143cf81613ef9565b9050919050565b600060208201905081810360008301526143ef81613f1c565b9050919050565b6000602082019050818103600083015261440f81613f3f565b9050919050565b6000602082019050818103600083015261442f81613f62565b9050919050565b6000602082019050818103600083015261444f81613f85565b9050919050565b6000602082019050818103600083015261446f81613fa8565b9050919050565b6000602082019050818103600083015261448f81613fcb565b9050919050565b600060208201905081810360008301526144af81613fee565b9050919050565b600060208201905081810360008301526144cf81614011565b9050919050565b60006020820190506144eb6000830184614034565b92915050565b60006144fb61450c565b905061450782826147e4565b919050565b6000604051905090565b600067ffffffffffffffff8211156145315761453061497a565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561455d5761455c61497a565b5b614566826149c7565b9050602081019050919050565b600067ffffffffffffffff82111561458e5761458d61497a565b5b614597826149c7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006145f282614766565b91506145fd83614766565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156146325761463161488f565b5b828201905092915050565b600061464882614766565b915061465383614766565b925082614663576146626148be565b5b828204905092915050565b600061467982614766565b915061468483614766565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146bd576146bc61488f565b5b828202905092915050565b60006146d382614766565b91506146de83614766565b9250828210156146f1576146f061488f565b5b828203905092915050565b600061470782614746565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561479d578082015181840152602081019050614782565b838111156147ac576000848401525b50505050565b600060028204905060018216806147ca57607f821691505b602082108114156147de576147dd6148ed565b5b50919050565b6147ed826149c7565b810181811067ffffffffffffffff8211171561480c5761480b61497a565b5b80604052505050565b600061482082614766565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156148535761485261488f565b5b600182019050919050565b600061486982614766565b915061487483614766565b925082614884576148836148be565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f50726573616c65206973206e6f742061637469766520617420746865206d6f6d60008201527f656e740000000000000000000000000000000000000000000000000000000000602082015250565b7f4e756d626572206f6620746f6b656e732063616e206e6f74206265206c65737360008201527f207468616e206f7220657175616c20746f203000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f43616e206f6e6c79206d696e7420757020746f2031302070657220707572636860008201527f6173650000000000000000000000000000000000000000000000000000000000602082015250565b7f4578636565647320737570706c79206f662070726573616c6520796f7520636160008201527f6e206d696e742e00000000000000000000000000000000000000000000000000602082015250565b7f4e6f7420656e6f7567682072657365727665206c65667420666f72207465616d600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f53656e742065746865722076616c756520697320696e636f7272656374000000600082015250565b7f507572636861736520776f756c6420657863656564206d617820737570706c79600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f546869732061646472657373206973206e6f742077686974656c69737465642060008201527f666f72207468652070726573616c652e00000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f5a65726f2061646472657373206e6f74206f6e20416c6c6f77204c6973740000600082015250565b7f43616e27742061646420746865206e756c6c2061646472657373000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d65746164617461206973206c6f636b65640000000000000000000000000000600082015250565b7f53616c65206973206e6f742061637469766520617420746865206d6f6d656e74600082015250565b6151aa816146fc565b81146151b557600080fd5b50565b6151c18161470e565b81146151cc57600080fd5b50565b6151d88161471a565b81146151e357600080fd5b50565b6151ef81614766565b81146151fa57600080fd5b5056fea264697066735822122082c0832190034a63dbf081b4b0bda03e653ea6847f722a131dea0e0cb192f75464736f6c63430008070033
Deployed Bytecode Sourcemap
48956:5741:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50947:207;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42800:237;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49271:42;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31087:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32547:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32084:397;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43453:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33437:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43121:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49630:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49490:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51166:89;;;;;;;;;;;;;:::i;:::-;;50530:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51516:140;;;;;;;;;;;;;:::i;:::-;;33813:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49725:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43643:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53708:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30781:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49141:53;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30511:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28339:148;;;;;;;;;;;;;:::i;:::-;;50154:364;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27688:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31256:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51267:83;;;;;;;;;;;;;:::i;:::-;;49398:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52152:643;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32840:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50653:278;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34035:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53883:811;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51693:451;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49926:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33206:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49559:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28642:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52807:768;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51362:98;;;;;;;;;;;;;:::i;:::-;;50947:207;51013:7;51057:1;51040:19;;:5;:19;;;;51032:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;51122:17;:24;51140:5;51122:24;;;;;;;;;;;;;;;;51115:31;;50947:207;;;:::o;42800:237::-;42902:4;42941:35;42926:50;;;:11;:50;;;;:103;;;;42993:36;43017:11;42993:23;:36::i;:::-;42926:103;42919:110;;42800:237;;;:::o;49271:42::-;49311:2;49271:42;:::o;31087:100::-;31141:13;31174:5;31167:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31087:100;:::o;32547:221::-;32623:7;32651:16;32659:7;32651;:16::i;:::-;32643:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32736:15;:24;32752:7;32736:24;;;;;;;;;;;;;;;;;;;;;32729:31;;32547:221;;;:::o;32084:397::-;32165:13;32181:23;32196:7;32181:14;:23::i;:::-;32165:39;;32229:5;32223:11;;:2;:11;;;;32215:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;32309:5;32293:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;32318:37;32335:5;32342:12;:10;:12::i;:::-;32318:16;:37::i;:::-;32293:62;32285:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32452:21;32461:2;32465:7;32452:8;:21::i;:::-;32154:327;32084:397;;:::o;43453:113::-;43514:7;43541:10;:17;;;;43534:24;;43453:113;:::o;33437:305::-;33598:41;33617:12;:10;:12::i;:::-;33631:7;33598:18;:41::i;:::-;33590:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;33706:28;33716:4;33722:2;33726:7;33706:9;:28::i;:::-;33437:305;;;:::o;43121:256::-;43218:7;43254:23;43271:5;43254:16;:23::i;:::-;43246:5;:31;43238:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;43343:12;:19;43356:5;43343:19;;;;;;;;;;;;;;;:26;43363:5;43343:26;;;;;;;;;;;;43336:33;;43121:256;;;;:::o;49630:35::-;;;;;;;;;;;;;:::o;49490:33::-;;;;:::o;51166:89::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51235:12:::1;;;;;;;;;;;51234:13;51219:12;;:28;;;;;;;;;;;;;;;;;;51166:89::o:0;50530:107::-;50589:4;50613:10;:16;50624:4;50613:16;;;;;;;;;;;;;;;;;;;;;;;;;50606:23;;50530:107;;;:::o;51516:140::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51564:12:::1;51579:21;51564:36;;51619:10;51611:28;;:37;51640:7;51611:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;51553:103;51516:140::o:0;33813:151::-;33917:39;33934:4;33940:2;33944:7;33917:39;;;;;;;;;;;;:16;:39::i;:::-;33813:151;;;:::o;49725:31::-;;;;:::o;43643:233::-;43718:7;43754:30;:28;:30::i;:::-;43746:5;:38;43738:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43851:10;43862:5;43851:17;;;;;;;;:::i;:::-;;;;;;;;;;43844:24;;43643:233;;;:::o;53708:167::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53791:16:::1;;;;;;;;;;;53790:17;53782:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;53859:8;53840:16;:27;;;;;;;;;;;;:::i;:::-;;53708:167:::0;:::o;30781:239::-;30853:7;30873:13;30889:7;:16;30897:7;30889:16;;;;;;;;;;;;;;;;;;;;;30873:32;;30941:1;30924:19;;:5;:19;;;;30916:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31007:5;31000:12;;;30781:239;;;:::o;49141:53::-;49177:17;49141:53;:::o;30511:208::-;30583:7;30628:1;30611:19;;:5;:19;;;;30603:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;30695:9;:16;30705:5;30695:16;;;;;;;;;;;;;;;;30688:23;;30511:208;;;:::o;28339:148::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28446:1:::1;28409:40;;28430:6;;;;;;;;;;;28409:40;;;;;;;;;;;;28477:1;28460:6;;:19;;;;;;;;;;;;;;;;;;28339:148::o:0;50154:364::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50239:9:::1;50234:277;50258:9;:16;50254:1;:20;50234:277;;;50326:1;50302:26;;:9;50312:1;50302:12;;;;;;;;:::i;:::-;;;;;;;;:26;;;;50294:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50409:4;50382:10;:24;50393:9;50403:1;50393:12;;;;;;;;:::i;:::-;;;;;;;;50382:24;;;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;50460:1;50426:17;:31;50444:9;50454:1;50444:12;;;;;;;;:::i;:::-;;;;;;;;50426:31;;;;;;;;;;;;;;;;:35;:73;;50498:1;50426:73;;;50464:17;:31;50482:9;50492:1;50482:12;;;;;;;;:::i;:::-;;;;;;;;50464:31;;;;;;;;;;;;;;;;50426:73;;50276:3;;;;;:::i;:::-;;;;50234:277;;;;50154:364:::0;:::o;27688:87::-;27734:7;27761:6;;;;;;;;;;;27754:13;;27688:87;:::o;31256:104::-;31312:13;31345:7;31338:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31256:104;:::o;51267:83::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51338:4:::1;51319:16;;:23;;;;;;;;;;;;;;;;;;51267:83::o:0;49398:49::-;49446:1;49398:49;:::o;52152:643::-;52221:12;;;;;;;;;;;52213:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52306:1;52289:14;:18;52281:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;52419:27;52434:11;;52419:10;;:14;;:27;;;;:::i;:::-;52382:33;52400:14;52382:13;:11;:13::i;:::-;:17;;:33;;;;:::i;:::-;:64;;52374:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;49311:2;52502:14;:34;;52494:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;52627:9;52594:29;52608:14;49177:17;52594:13;;:29;;;;:::i;:::-;:42;;52586:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;52688:6;52683:105;52704:14;52700:1;:18;52683:105;;;52740:36;52750:10;52762:13;:11;:13::i;:::-;52740:9;:36::i;:::-;52720:3;;;;;:::i;:::-;;;;52683:105;;;;52152:643;:::o;32840:295::-;32955:12;:10;:12::i;:::-;32943:24;;:8;:24;;;;32935:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;33055:8;33010:18;:32;33029:12;:10;:12::i;:::-;33010:32;;;;;;;;;;;;;;;:42;33043:8;33010:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;33108:8;33079:48;;33094:12;:10;:12::i;:::-;33079:48;;;33118:8;33079:48;;;;;;:::i;:::-;;;;;;;;32840:295;;:::o;50653:278::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50747:9:::1;50742:182;50766:9;;:16;;50762:1;:20;50742:182;;;50834:1;50810:26;;:9;;50820:1;50810:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;:26;;;;50802:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;50907:5;50880:10;:24;50891:9;;50901:1;50891:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;50880:24;;;;;;;;;;;;;;;;:32;;;;;;;;;;;;;;;;;;50784:3;;;;;:::i;:::-;;;;50742:182;;;;50653:278:::0;;:::o;34035:285::-;34167:41;34186:12;:10;:12::i;:::-;34200:7;34167:18;:41::i;:::-;34159:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;34273:39;34287:4;34293:2;34297:7;34306:5;34273:13;:39::i;:::-;34035:285;;;;:::o;53883:811::-;53956:13;53990:16;53998:7;53990;:16::i;:::-;53982:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54071:23;54097:10;:19;54108:7;54097:19;;;;;;;;;;;54071:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54127:18;54148:10;:8;:10::i;:::-;54127:31;;54256:1;54240:4;54234:18;:23;54230:72;;;54281:9;54274:16;;;;;;54230:72;54432:1;54412:9;54406:23;:27;54402:117;;;54481:4;54487:9;54464:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54450:57;;;;;;54402:117;54651:4;54657:18;:7;:16;:18::i;:::-;54634:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54620:66;;;;53883:811;;;;:::o;51693:451::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51798:14:::1;51815:13;:11;:13::i;:::-;51798:30;;51878:1;51861:14;:18;:51;;;;;51901:11;;51883:14;:29;;51861:51;51839:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;51988:9;51983:98;52007:14;52003:1;:18;51983:98;;;52043:26;52053:3;52067:1;52058:6;:10;;;;:::i;:::-;52043:9;:26::i;:::-;52023:3;;;;;:::i;:::-;;;;51983:98;;;;52105:31;52121:14;52105:11;;:15;;:31;;;;:::i;:::-;52091:11;:45;;;;51787:357;51693:451:::0;;:::o;49926:36::-;;;;;;;;;;;;;:::o;33206:164::-;33303:4;33327:18;:25;33346:5;33327:25;;;;;;;;;;;;;;;:35;33353:8;33327:35;;;;;;;;;;;;;;;;;;;;;;;;;33320:42;;33206:164;;;;:::o;49559:32::-;;;;;;;;;;;;;:::o;28642:244::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;28751:1:::1;28731:22;;:8;:22;;;;28723:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28841:8;28812:38;;28833:6;;;;;;;;;;;28812:38;;;;;;;;;;;;28870:8;28861:6;;:17;;;;;;;;;;;;;;;;;;28642:244:::0;:::o;52807:768::-;52883:15;;;;;;;;;;;52875:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;52983:4;52957:30;;:10;:22;52968:10;52957:22;;;;;;;;;;;;;;;;;;;;;;;;;:30;;;52949:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;49446:1;53090:14;53058:17;:29;53076:10;53058:29;;;;;;;;;;;;;;;;:46;;;;:::i;:::-;:74;;53050:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;53211:1;53194:14;:18;53186:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;53320:9;53287:29;53301:14;49177:17;53287:13;;:29;;;;:::i;:::-;:42;;53279:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;53389:6;53384:106;53405:14;53401:1;:18;53384:106;;;53441:37;53451:10;53464:13;:11;:13::i;:::-;53441:9;:37::i;:::-;53421:3;;;;;:::i;:::-;;;;53384:106;;;;53553:14;53520:17;:29;53538:10;53520:29;;;;;;;;;;;;;;;;:47;;;;;;;:::i;:::-;;;;;;;;52807:768;:::o;51362:98::-;27919:12;:10;:12::i;:::-;27908:23;;:7;:5;:7::i;:::-;:23;;;27900:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;51437:15:::1;;;;;;;;;;;51436:16;51418:15;;:34;;;;;;;;;;;;;;;;;;51362:98::o:0;30155:292::-;30257:4;30296:25;30281:40;;;:11;:40;;;;:105;;;;30353:33;30338:48;;;:11;:48;;;;30281:105;:158;;;;30403:36;30427:11;30403:23;:36::i;:::-;30281:158;30274:165;;30155:292;;;:::o;35787:127::-;35852:4;35904:1;35876:30;;:7;:16;35884:7;35876:16;;;;;;;;;;;;;;;;;;;;;:30;;;;35869:37;;35787:127;;;:::o;26305:98::-;26358:7;26385:10;26378:17;;26305:98;:::o;39664:174::-;39766:2;39739:15;:24;39755:7;39739:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;39822:7;39818:2;39784:46;;39793:23;39808:7;39793:14;:23::i;:::-;39784:46;;;;;;;;;;;;39664:174;;:::o;36081:348::-;36174:4;36199:16;36207:7;36199;:16::i;:::-;36191:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36275:13;36291:23;36306:7;36291:14;:23::i;:::-;36275:39;;36344:5;36333:16;;:7;:16;;;:51;;;;36377:7;36353:31;;:20;36365:7;36353:11;:20::i;:::-;:31;;;36333:51;:87;;;;36388:32;36405:5;36412:7;36388:16;:32::i;:::-;36333:87;36325:96;;;36081:348;;;;:::o;39002:544::-;39127:4;39100:31;;:23;39115:7;39100:14;:23::i;:::-;:31;;;39092:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;39210:1;39196:16;;:2;:16;;;;39188:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;39266:39;39287:4;39293:2;39297:7;39266:20;:39::i;:::-;39370:29;39387:1;39391:7;39370:8;:29::i;:::-;39431:1;39412:9;:15;39422:4;39412:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;39460:1;39443:9;:13;39453:2;39443:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39491:2;39472:7;:16;39480:7;39472:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39530:7;39526:2;39511:27;;39520:4;39511:27;;;;;;;;;;;;39002:544;;;:::o;3144:98::-;3202:7;3233:1;3229;:5;;;;:::i;:::-;3222:12;;3144:98;;;;:::o;2763:::-;2821:7;2852:1;2848;:5;;;;:::i;:::-;2841:12;;2763:98;;;;:::o;3501:::-;3559:7;3590:1;3586;:5;;;;:::i;:::-;3579:12;;3501:98;;;;:::o;36771:110::-;36847:26;36857:2;36861:7;36847:26;;;;;;;;;;;;:9;:26::i;:::-;36771:110;;:::o;35202:272::-;35316:28;35326:4;35332:2;35336:7;35316:9;:28::i;:::-;35363:48;35386:4;35392:2;35396:7;35405:5;35363:22;:48::i;:::-;35355:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;35202:272;;;;:::o;53583:117::-;53643:13;53676:16;53669:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53583:117;:::o;7304:723::-;7360:13;7590:1;7581:5;:10;7577:53;;;7608:10;;;;;;;;;;;;;;;;;;;;;7577:53;7640:12;7655:5;7640:20;;7671:14;7696:78;7711:1;7703:4;:9;7696:78;;7729:8;;;;;:::i;:::-;;;;7760:2;7752:10;;;;;:::i;:::-;;;7696:78;;;7784:19;7816:6;7806:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7784:39;;7834:154;7850:1;7841:5;:10;7834:154;;7878:1;7868:11;;;;;:::i;:::-;;;7945:2;7937:5;:10;;;;:::i;:::-;7924:2;:24;;;;:::i;:::-;7911:39;;7894:6;7901;7894:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;7974:2;7965:11;;;;;:::i;:::-;;;7834:154;;;8012:6;7998:21;;;;;7304:723;;;;:::o;19378:157::-;19463:4;19502:25;19487:40;;;:11;:40;;;;19480:47;;19378:157;;;:::o;44489:555::-;44599:45;44626:4;44632:2;44636:7;44599:26;:45::i;:::-;44677:1;44661:18;;:4;:18;;;44657:187;;;44696:40;44728:7;44696:31;:40::i;:::-;44657:187;;;44766:2;44758:10;;:4;:10;;;44754:90;;44785:47;44818:4;44824:7;44785:32;:47::i;:::-;44754:90;44657:187;44872:1;44858:16;;:2;:16;;;44854:183;;;44891:45;44928:7;44891:36;:45::i;:::-;44854:183;;;44964:4;44958:10;;:2;:10;;;44954:83;;44985:40;45013:2;45017:7;44985:27;:40::i;:::-;44954:83;44854:183;44489:555;;;:::o;37108:250::-;37204:18;37210:2;37214:7;37204:5;:18::i;:::-;37241:54;37272:1;37276:2;37280:7;37289:5;37241:22;:54::i;:::-;37233:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;37108:250;;;:::o;40403:843::-;40524:4;40550:15;:2;:13;;;:15::i;:::-;40546:693;;;40602:2;40586:36;;;40623:12;:10;:12::i;:::-;40637:4;40643:7;40652:5;40586:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;40582:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40849:1;40832:6;:13;:18;40828:341;;;40875:60;;;;;;;;;;:::i;:::-;;;;;;;;40828:341;41119:6;41113:13;41104:6;41100:2;41096:15;41089:38;40582:602;40719:45;;;40709:55;;;:6;:55;;;;40702:62;;;;;40546:693;41223:4;41216:11;;40403:843;;;;;;;:::o;41859:93::-;;;;:::o;45767:164::-;45871:10;:17;;;;45844:15;:24;45860:7;45844:24;;;;;;;;;;;:44;;;;45899:10;45915:7;45899:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45767:164;:::o;46558:988::-;46824:22;46874:1;46849:22;46866:4;46849:16;:22::i;:::-;:26;;;;:::i;:::-;46824:51;;46886:18;46907:17;:26;46925:7;46907:26;;;;;;;;;;;;46886:47;;47054:14;47040:10;:28;47036:328;;47085:19;47107:12;:18;47120:4;47107:18;;;;;;;;;;;;;;;:34;47126:14;47107:34;;;;;;;;;;;;47085:56;;47191:11;47158:12;:18;47171:4;47158:18;;;;;;;;;;;;;;;:30;47177:10;47158:30;;;;;;;;;;;:44;;;;47308:10;47275:17;:30;47293:11;47275:30;;;;;;;;;;;:43;;;;47070:294;47036:328;47460:17;:26;47478:7;47460:26;;;;;;;;;;;47453:33;;;47504:12;:18;47517:4;47504:18;;;;;;;;;;;;;;;:34;47523:14;47504:34;;;;;;;;;;;47497:41;;;46639:907;;46558:988;;:::o;47841:1079::-;48094:22;48139:1;48119:10;:17;;;;:21;;;;:::i;:::-;48094:46;;48151:18;48172:15;:24;48188:7;48172:24;;;;;;;;;;;;48151:45;;48523:19;48545:10;48556:14;48545:26;;;;;;;;:::i;:::-;;;;;;;;;;48523:48;;48609:11;48584:10;48595;48584:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;48720:10;48689:15;:28;48705:11;48689:28;;;;;;;;;;;:41;;;;48861:15;:24;48877:7;48861:24;;;;;;;;;;;48854:31;;;48896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;47912:1008;;;47841:1079;:::o;45345:221::-;45430:14;45447:20;45464:2;45447:16;:20::i;:::-;45430:37;;45505:7;45478:12;:16;45491:2;45478:16;;;;;;;;;;;;;;;:24;45495:6;45478:24;;;;;;;;;;;:34;;;;45552:6;45523:17;:26;45541:7;45523:26;;;;;;;;;;;:35;;;;45419:147;45345:221;;:::o;37694:382::-;37788:1;37774:16;;:2;:16;;;;37766:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;37847:16;37855:7;37847;:16::i;:::-;37846:17;37838:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37909:45;37938:1;37942:2;37946:7;37909:20;:45::i;:::-;37984:1;37967:9;:13;37977:2;37967:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;38015:2;37996:7;:16;38004:7;37996:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;38060:7;38056:2;38035:33;;38052:1;38035:33;;;;;;;;;;;;37694:382;;:::o;9769:422::-;9829:4;10037:12;10148:7;10136:20;10128:28;;10182:1;10175:4;:8;10168:15;;;9769:422;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:370::-;2410:5;2459:3;2452:4;2444:6;2440:17;2436:27;2426:122;;2467:79;;:::i;:::-;2426:122;2584:6;2571:20;2609:94;2699:3;2691:6;2684:4;2676:6;2672:17;2609:94;:::i;:::-;2600:103;;2416:293;2339:370;;;;:::o;2715:133::-;2758:5;2796:6;2783:20;2774:29;;2812:30;2836:5;2812:30;:::i;:::-;2715:133;;;;:::o;2854:137::-;2899:5;2937:6;2924:20;2915:29;;2953:32;2979:5;2953:32;:::i;:::-;2854:137;;;;:::o;2997:141::-;3053:5;3084:6;3078:13;3069:22;;3100:32;3126:5;3100:32;:::i;:::-;2997:141;;;;:::o;3157:338::-;3212:5;3261:3;3254:4;3246:6;3242:17;3238:27;3228:122;;3269:79;;:::i;:::-;3228:122;3386:6;3373:20;3411:78;3485:3;3477:6;3470:4;3462:6;3458:17;3411:78;:::i;:::-;3402:87;;3218:277;3157:338;;;;:::o;3515:340::-;3571:5;3620:3;3613:4;3605:6;3601:17;3597:27;3587:122;;3628:79;;:::i;:::-;3587:122;3745:6;3732:20;3770:79;3845:3;3837:6;3830:4;3822:6;3818:17;3770:79;:::i;:::-;3761:88;;3577:278;3515:340;;;;:::o;3861:139::-;3907:5;3945:6;3932:20;3923:29;;3961:33;3988:5;3961:33;:::i;:::-;3861:139;;;;:::o;4006:329::-;4065:6;4114:2;4102:9;4093:7;4089:23;4085:32;4082:119;;;4120:79;;:::i;:::-;4082:119;4240:1;4265:53;4310:7;4301:6;4290:9;4286:22;4265:53;:::i;:::-;4255:63;;4211:117;4006:329;;;;:::o;4341:474::-;4409:6;4417;4466:2;4454:9;4445:7;4441:23;4437:32;4434:119;;;4472:79;;:::i;:::-;4434:119;4592:1;4617:53;4662:7;4653:6;4642:9;4638:22;4617:53;:::i;:::-;4607:63;;4563:117;4719:2;4745:53;4790:7;4781:6;4770:9;4766:22;4745:53;:::i;:::-;4735:63;;4690:118;4341:474;;;;;:::o;4821:619::-;4898:6;4906;4914;4963:2;4951:9;4942:7;4938:23;4934:32;4931:119;;;4969:79;;:::i;:::-;4931:119;5089:1;5114:53;5159:7;5150:6;5139:9;5135:22;5114:53;:::i;:::-;5104:63;;5060:117;5216:2;5242:53;5287:7;5278:6;5267:9;5263:22;5242:53;:::i;:::-;5232:63;;5187:118;5344:2;5370:53;5415:7;5406:6;5395:9;5391:22;5370:53;:::i;:::-;5360:63;;5315:118;4821:619;;;;;:::o;5446:943::-;5541:6;5549;5557;5565;5614:3;5602:9;5593:7;5589:23;5585:33;5582:120;;;5621:79;;:::i;:::-;5582:120;5741:1;5766:53;5811:7;5802:6;5791:9;5787:22;5766:53;:::i;:::-;5756:63;;5712:117;5868:2;5894:53;5939:7;5930:6;5919:9;5915:22;5894:53;:::i;:::-;5884:63;;5839:118;5996:2;6022:53;6067:7;6058:6;6047:9;6043:22;6022:53;:::i;:::-;6012:63;;5967:118;6152:2;6141:9;6137:18;6124:32;6183:18;6175:6;6172:30;6169:117;;;6205:79;;:::i;:::-;6169:117;6310:62;6364:7;6355:6;6344:9;6340:22;6310:62;:::i;:::-;6300:72;;6095:287;5446:943;;;;;;;:::o;6395:468::-;6460:6;6468;6517:2;6505:9;6496:7;6492:23;6488:32;6485:119;;;6523:79;;:::i;:::-;6485:119;6643:1;6668:53;6713:7;6704:6;6693:9;6689:22;6668:53;:::i;:::-;6658:63;;6614:117;6770:2;6796:50;6838:7;6829:6;6818:9;6814:22;6796:50;:::i;:::-;6786:60;;6741:115;6395:468;;;;;:::o;6869:474::-;6937:6;6945;6994:2;6982:9;6973:7;6969:23;6965:32;6962:119;;;7000:79;;:::i;:::-;6962:119;7120:1;7145:53;7190:7;7181:6;7170:9;7166:22;7145:53;:::i;:::-;7135:63;;7091:117;7247:2;7273:53;7318:7;7309:6;7298:9;7294:22;7273:53;:::i;:::-;7263:63;;7218:118;6869:474;;;;;:::o;7349:559::-;7435:6;7443;7492:2;7480:9;7471:7;7467:23;7463:32;7460:119;;;7498:79;;:::i;:::-;7460:119;7646:1;7635:9;7631:17;7618:31;7676:18;7668:6;7665:30;7662:117;;;7698:79;;:::i;:::-;7662:117;7811:80;7883:7;7874:6;7863:9;7859:22;7811:80;:::i;:::-;7793:98;;;;7589:312;7349:559;;;;;:::o;7914:539::-;7998:6;8047:2;8035:9;8026:7;8022:23;8018:32;8015:119;;;8053:79;;:::i;:::-;8015:119;8201:1;8190:9;8186:17;8173:31;8231:18;8223:6;8220:30;8217:117;;;8253:79;;:::i;:::-;8217:117;8358:78;8428:7;8419:6;8408:9;8404:22;8358:78;:::i;:::-;8348:88;;8144:302;7914:539;;;;:::o;8459:327::-;8517:6;8566:2;8554:9;8545:7;8541:23;8537:32;8534:119;;;8572:79;;:::i;:::-;8534:119;8692:1;8717:52;8761:7;8752:6;8741:9;8737:22;8717:52;:::i;:::-;8707:62;;8663:116;8459:327;;;;:::o;8792:349::-;8861:6;8910:2;8898:9;8889:7;8885:23;8881:32;8878:119;;;8916:79;;:::i;:::-;8878:119;9036:1;9061:63;9116:7;9107:6;9096:9;9092:22;9061:63;:::i;:::-;9051:73;;9007:127;8792:349;;;;:::o;9147:509::-;9216:6;9265:2;9253:9;9244:7;9240:23;9236:32;9233:119;;;9271:79;;:::i;:::-;9233:119;9419:1;9408:9;9404:17;9391:31;9449:18;9441:6;9438:30;9435:117;;;9471:79;;:::i;:::-;9435:117;9576:63;9631:7;9622:6;9611:9;9607:22;9576:63;:::i;:::-;9566:73;;9362:287;9147:509;;;;:::o;9662:329::-;9721:6;9770:2;9758:9;9749:7;9745:23;9741:32;9738:119;;;9776:79;;:::i;:::-;9738:119;9896:1;9921:53;9966:7;9957:6;9946:9;9942:22;9921:53;:::i;:::-;9911:63;;9867:117;9662:329;;;;:::o;9997:118::-;10084:24;10102:5;10084:24;:::i;:::-;10079:3;10072:37;9997:118;;:::o;10121:109::-;10202:21;10217:5;10202:21;:::i;:::-;10197:3;10190:34;10121:109;;:::o;10236:360::-;10322:3;10350:38;10382:5;10350:38;:::i;:::-;10404:70;10467:6;10462:3;10404:70;:::i;:::-;10397:77;;10483:52;10528:6;10523:3;10516:4;10509:5;10505:16;10483:52;:::i;:::-;10560:29;10582:6;10560:29;:::i;:::-;10555:3;10551:39;10544:46;;10326:270;10236:360;;;;:::o;10602:364::-;10690:3;10718:39;10751:5;10718:39;:::i;:::-;10773:71;10837:6;10832:3;10773:71;:::i;:::-;10766:78;;10853:52;10898:6;10893:3;10886:4;10879:5;10875:16;10853:52;:::i;:::-;10930:29;10952:6;10930:29;:::i;:::-;10925:3;10921:39;10914:46;;10694:272;10602:364;;;;:::o;10972:377::-;11078:3;11106:39;11139:5;11106:39;:::i;:::-;11161:89;11243:6;11238:3;11161:89;:::i;:::-;11154:96;;11259:52;11304:6;11299:3;11292:4;11285:5;11281:16;11259:52;:::i;:::-;11336:6;11331:3;11327:16;11320:23;;11082:267;10972:377;;;;:::o;11355:366::-;11497:3;11518:67;11582:2;11577:3;11518:67;:::i;:::-;11511:74;;11594:93;11683:3;11594:93;:::i;:::-;11712:2;11707:3;11703:12;11696:19;;11355:366;;;:::o;11727:::-;11869:3;11890:67;11954:2;11949:3;11890:67;:::i;:::-;11883:74;;11966:93;12055:3;11966:93;:::i;:::-;12084:2;12079:3;12075:12;12068:19;;11727:366;;;:::o;12099:::-;12241:3;12262:67;12326:2;12321:3;12262:67;:::i;:::-;12255:74;;12338:93;12427:3;12338:93;:::i;:::-;12456:2;12451:3;12447:12;12440:19;;12099:366;;;:::o;12471:::-;12613:3;12634:67;12698:2;12693:3;12634:67;:::i;:::-;12627:74;;12710:93;12799:3;12710:93;:::i;:::-;12828:2;12823:3;12819:12;12812:19;;12471:366;;;:::o;12843:::-;12985:3;13006:67;13070:2;13065:3;13006:67;:::i;:::-;12999:74;;13082:93;13171:3;13082:93;:::i;:::-;13200:2;13195:3;13191:12;13184:19;;12843:366;;;:::o;13215:::-;13357:3;13378:67;13442:2;13437:3;13378:67;:::i;:::-;13371:74;;13454:93;13543:3;13454:93;:::i;:::-;13572:2;13567:3;13563:12;13556:19;;13215:366;;;:::o;13587:::-;13729:3;13750:67;13814:2;13809:3;13750:67;:::i;:::-;13743:74;;13826:93;13915:3;13826:93;:::i;:::-;13944:2;13939:3;13935:12;13928:19;;13587:366;;;:::o;13959:::-;14101:3;14122:67;14186:2;14181:3;14122:67;:::i;:::-;14115:74;;14198:93;14287:3;14198:93;:::i;:::-;14316:2;14311:3;14307:12;14300:19;;13959:366;;;:::o;14331:::-;14473:3;14494:67;14558:2;14553:3;14494:67;:::i;:::-;14487:74;;14570:93;14659:3;14570:93;:::i;:::-;14688:2;14683:3;14679:12;14672:19;;14331:366;;;:::o;14703:::-;14845:3;14866:67;14930:2;14925:3;14866:67;:::i;:::-;14859:74;;14942:93;15031:3;14942:93;:::i;:::-;15060:2;15055:3;15051:12;15044:19;;14703:366;;;:::o;15075:::-;15217:3;15238:67;15302:2;15297:3;15238:67;:::i;:::-;15231:74;;15314:93;15403:3;15314:93;:::i;:::-;15432:2;15427:3;15423:12;15416:19;;15075:366;;;:::o;15447:::-;15589:3;15610:67;15674:2;15669:3;15610:67;:::i;:::-;15603:74;;15686:93;15775:3;15686:93;:::i;:::-;15804:2;15799:3;15795:12;15788:19;;15447:366;;;:::o;15819:::-;15961:3;15982:67;16046:2;16041:3;15982:67;:::i;:::-;15975:74;;16058:93;16147:3;16058:93;:::i;:::-;16176:2;16171:3;16167:12;16160:19;;15819:366;;;:::o;16191:::-;16333:3;16354:67;16418:2;16413:3;16354:67;:::i;:::-;16347:74;;16430:93;16519:3;16430:93;:::i;:::-;16548:2;16543:3;16539:12;16532:19;;16191:366;;;:::o;16563:::-;16705:3;16726:67;16790:2;16785:3;16726:67;:::i;:::-;16719:74;;16802:93;16891:3;16802:93;:::i;:::-;16920:2;16915:3;16911:12;16904:19;;16563:366;;;:::o;16935:::-;17077:3;17098:67;17162:2;17157:3;17098:67;:::i;:::-;17091:74;;17174:93;17263:3;17174:93;:::i;:::-;17292:2;17287:3;17283:12;17276:19;;16935:366;;;:::o;17307:::-;17449:3;17470:67;17534:2;17529:3;17470:67;:::i;:::-;17463:74;;17546:93;17635:3;17546:93;:::i;:::-;17664:2;17659:3;17655:12;17648:19;;17307:366;;;:::o;17679:::-;17821:3;17842:67;17906:2;17901:3;17842:67;:::i;:::-;17835:74;;17918:93;18007:3;17918:93;:::i;:::-;18036:2;18031:3;18027:12;18020:19;;17679:366;;;:::o;18051:::-;18193:3;18214:67;18278:2;18273:3;18214:67;:::i;:::-;18207:74;;18290:93;18379:3;18290:93;:::i;:::-;18408:2;18403:3;18399:12;18392:19;;18051:366;;;:::o;18423:::-;18565:3;18586:67;18650:2;18645:3;18586:67;:::i;:::-;18579:74;;18662:93;18751:3;18662:93;:::i;:::-;18780:2;18775:3;18771:12;18764:19;;18423:366;;;:::o;18795:400::-;18955:3;18976:84;19058:1;19053:3;18976:84;:::i;:::-;18969:91;;19069:93;19158:3;19069:93;:::i;:::-;19187:1;19182:3;19178:11;19171:18;;18795:400;;;:::o;19201:366::-;19343:3;19364:67;19428:2;19423:3;19364:67;:::i;:::-;19357:74;;19440:93;19529:3;19440:93;:::i;:::-;19558:2;19553:3;19549:12;19542:19;;19201:366;;;:::o;19573:::-;19715:3;19736:67;19800:2;19795:3;19736:67;:::i;:::-;19729:74;;19812:93;19901:3;19812:93;:::i;:::-;19930:2;19925:3;19921:12;19914:19;;19573:366;;;:::o;19945:::-;20087:3;20108:67;20172:2;20167:3;20108:67;:::i;:::-;20101:74;;20184:93;20273:3;20184:93;:::i;:::-;20302:2;20297:3;20293:12;20286:19;;19945:366;;;:::o;20317:::-;20459:3;20480:67;20544:2;20539:3;20480:67;:::i;:::-;20473:74;;20556:93;20645:3;20556:93;:::i;:::-;20674:2;20669:3;20665:12;20658:19;;20317:366;;;:::o;20689:::-;20831:3;20852:67;20916:2;20911:3;20852:67;:::i;:::-;20845:74;;20928:93;21017:3;20928:93;:::i;:::-;21046:2;21041:3;21037:12;21030:19;;20689:366;;;:::o;21061:::-;21203:3;21224:67;21288:2;21283:3;21224:67;:::i;:::-;21217:74;;21300:93;21389:3;21300:93;:::i;:::-;21418:2;21413:3;21409:12;21402:19;;21061:366;;;:::o;21433:::-;21575:3;21596:67;21660:2;21655:3;21596:67;:::i;:::-;21589:74;;21672:93;21761:3;21672:93;:::i;:::-;21790:2;21785:3;21781:12;21774:19;;21433:366;;;:::o;21805:::-;21947:3;21968:67;22032:2;22027:3;21968:67;:::i;:::-;21961:74;;22044:93;22133:3;22044:93;:::i;:::-;22162:2;22157:3;22153:12;22146:19;;21805:366;;;:::o;22177:::-;22319:3;22340:67;22404:2;22399:3;22340:67;:::i;:::-;22333:74;;22416:93;22505:3;22416:93;:::i;:::-;22534:2;22529:3;22525:12;22518:19;;22177:366;;;:::o;22549:::-;22691:3;22712:67;22776:2;22771:3;22712:67;:::i;:::-;22705:74;;22788:93;22877:3;22788:93;:::i;:::-;22906:2;22901:3;22897:12;22890:19;;22549:366;;;:::o;22921:118::-;23008:24;23026:5;23008:24;:::i;:::-;23003:3;22996:37;22921:118;;:::o;23045:701::-;23326:3;23348:95;23439:3;23430:6;23348:95;:::i;:::-;23341:102;;23460:95;23551:3;23542:6;23460:95;:::i;:::-;23453:102;;23572:148;23716:3;23572:148;:::i;:::-;23565:155;;23737:3;23730:10;;23045:701;;;;;:::o;23752:222::-;23845:4;23883:2;23872:9;23868:18;23860:26;;23896:71;23964:1;23953:9;23949:17;23940:6;23896:71;:::i;:::-;23752:222;;;;:::o;23980:640::-;24175:4;24213:3;24202:9;24198:19;24190:27;;24227:71;24295:1;24284:9;24280:17;24271:6;24227:71;:::i;:::-;24308:72;24376:2;24365:9;24361:18;24352:6;24308:72;:::i;:::-;24390;24458:2;24447:9;24443:18;24434:6;24390:72;:::i;:::-;24509:9;24503:4;24499:20;24494:2;24483:9;24479:18;24472:48;24537:76;24608:4;24599:6;24537:76;:::i;:::-;24529:84;;23980:640;;;;;;;:::o;24626:210::-;24713:4;24751:2;24740:9;24736:18;24728:26;;24764:65;24826:1;24815:9;24811:17;24802:6;24764:65;:::i;:::-;24626:210;;;;:::o;24842:313::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:78;25143:4;25134:6;25070:78;:::i;:::-;25062:86;;24842:313;;;;:::o;25161:419::-;25327:4;25365:2;25354:9;25350:18;25342:26;;25414:9;25408:4;25404:20;25400:1;25389:9;25385:17;25378:47;25442:131;25568:4;25442:131;:::i;:::-;25434:139;;25161:419;;;:::o;25586:::-;25752:4;25790:2;25779:9;25775:18;25767:26;;25839:9;25833:4;25829:20;25825:1;25814:9;25810:17;25803:47;25867:131;25993:4;25867:131;:::i;:::-;25859:139;;25586:419;;;:::o;26011:::-;26177:4;26215:2;26204:9;26200:18;26192:26;;26264:9;26258:4;26254:20;26250:1;26239:9;26235:17;26228:47;26292:131;26418:4;26292:131;:::i;:::-;26284:139;;26011:419;;;:::o;26436:::-;26602:4;26640:2;26629:9;26625:18;26617:26;;26689:9;26683:4;26679:20;26675:1;26664:9;26660:17;26653:47;26717:131;26843:4;26717:131;:::i;:::-;26709:139;;26436:419;;;:::o;26861:::-;27027:4;27065:2;27054:9;27050:18;27042:26;;27114:9;27108:4;27104:20;27100:1;27089:9;27085:17;27078:47;27142:131;27268:4;27142:131;:::i;:::-;27134:139;;26861:419;;;:::o;27286:::-;27452:4;27490:2;27479:9;27475:18;27467:26;;27539:9;27533:4;27529:20;27525:1;27514:9;27510:17;27503:47;27567:131;27693:4;27567:131;:::i;:::-;27559:139;;27286:419;;;:::o;27711:::-;27877:4;27915:2;27904:9;27900:18;27892:26;;27964:9;27958:4;27954:20;27950:1;27939:9;27935:17;27928:47;27992:131;28118:4;27992:131;:::i;:::-;27984:139;;27711:419;;;:::o;28136:::-;28302:4;28340:2;28329:9;28325:18;28317:26;;28389:9;28383:4;28379:20;28375:1;28364:9;28360:17;28353:47;28417:131;28543:4;28417:131;:::i;:::-;28409:139;;28136:419;;;:::o;28561:::-;28727:4;28765:2;28754:9;28750:18;28742:26;;28814:9;28808:4;28804:20;28800:1;28789:9;28785:17;28778:47;28842:131;28968:4;28842:131;:::i;:::-;28834:139;;28561:419;;;:::o;28986:::-;29152:4;29190:2;29179:9;29175:18;29167:26;;29239:9;29233:4;29229:20;29225:1;29214:9;29210:17;29203:47;29267:131;29393:4;29267:131;:::i;:::-;29259:139;;28986:419;;;:::o;29411:::-;29577:4;29615:2;29604:9;29600:18;29592:26;;29664:9;29658:4;29654:20;29650:1;29639:9;29635:17;29628:47;29692:131;29818:4;29692:131;:::i;:::-;29684:139;;29411:419;;;:::o;29836:::-;30002:4;30040:2;30029:9;30025:18;30017:26;;30089:9;30083:4;30079:20;30075:1;30064:9;30060:17;30053:47;30117:131;30243:4;30117:131;:::i;:::-;30109:139;;29836:419;;;:::o;30261:::-;30427:4;30465:2;30454:9;30450:18;30442:26;;30514:9;30508:4;30504:20;30500:1;30489:9;30485:17;30478:47;30542:131;30668:4;30542:131;:::i;:::-;30534:139;;30261:419;;;:::o;30686:::-;30852:4;30890:2;30879:9;30875:18;30867:26;;30939:9;30933:4;30929:20;30925:1;30914:9;30910:17;30903:47;30967:131;31093:4;30967:131;:::i;:::-;30959:139;;30686:419;;;:::o;31111:::-;31277:4;31315:2;31304:9;31300:18;31292:26;;31364:9;31358:4;31354:20;31350:1;31339:9;31335:17;31328:47;31392:131;31518:4;31392:131;:::i;:::-;31384:139;;31111:419;;;:::o;31536:::-;31702:4;31740:2;31729:9;31725:18;31717:26;;31789:9;31783:4;31779:20;31775:1;31764:9;31760:17;31753:47;31817:131;31943:4;31817:131;:::i;:::-;31809:139;;31536:419;;;:::o;31961:::-;32127:4;32165:2;32154:9;32150:18;32142:26;;32214:9;32208:4;32204:20;32200:1;32189:9;32185:17;32178:47;32242:131;32368:4;32242:131;:::i;:::-;32234:139;;31961:419;;;:::o;32386:::-;32552:4;32590:2;32579:9;32575:18;32567:26;;32639:9;32633:4;32629:20;32625:1;32614:9;32610:17;32603:47;32667:131;32793:4;32667:131;:::i;:::-;32659:139;;32386:419;;;:::o;32811:::-;32977:4;33015:2;33004:9;33000:18;32992:26;;33064:9;33058:4;33054:20;33050:1;33039:9;33035:17;33028:47;33092:131;33218:4;33092:131;:::i;:::-;33084:139;;32811:419;;;:::o;33236:::-;33402:4;33440:2;33429:9;33425:18;33417:26;;33489:9;33483:4;33479:20;33475:1;33464:9;33460:17;33453:47;33517:131;33643:4;33517:131;:::i;:::-;33509:139;;33236:419;;;:::o;33661:::-;33827:4;33865:2;33854:9;33850:18;33842:26;;33914:9;33908:4;33904:20;33900:1;33889:9;33885:17;33878:47;33942:131;34068:4;33942:131;:::i;:::-;33934:139;;33661:419;;;:::o;34086:::-;34252:4;34290:2;34279:9;34275:18;34267:26;;34339:9;34333:4;34329:20;34325:1;34314:9;34310:17;34303:47;34367:131;34493:4;34367:131;:::i;:::-;34359:139;;34086:419;;;:::o;34511:::-;34677:4;34715:2;34704:9;34700:18;34692:26;;34764:9;34758:4;34754:20;34750:1;34739:9;34735:17;34728:47;34792:131;34918:4;34792:131;:::i;:::-;34784:139;;34511:419;;;:::o;34936:::-;35102:4;35140:2;35129:9;35125:18;35117:26;;35189:9;35183:4;35179:20;35175:1;35164:9;35160:17;35153:47;35217:131;35343:4;35217:131;:::i;:::-;35209:139;;34936:419;;;:::o;35361:::-;35527:4;35565:2;35554:9;35550:18;35542:26;;35614:9;35608:4;35604:20;35600:1;35589:9;35585:17;35578:47;35642:131;35768:4;35642:131;:::i;:::-;35634:139;;35361:419;;;:::o;35786:::-;35952:4;35990:2;35979:9;35975:18;35967:26;;36039:9;36033:4;36029:20;36025:1;36014:9;36010:17;36003:47;36067:131;36193:4;36067:131;:::i;:::-;36059:139;;35786:419;;;:::o;36211:::-;36377:4;36415:2;36404:9;36400:18;36392:26;;36464:9;36458:4;36454:20;36450:1;36439:9;36435:17;36428:47;36492:131;36618:4;36492:131;:::i;:::-;36484:139;;36211:419;;;:::o;36636:::-;36802:4;36840:2;36829:9;36825:18;36817:26;;36889:9;36883:4;36879:20;36875:1;36864:9;36860:17;36853:47;36917:131;37043:4;36917:131;:::i;:::-;36909:139;;36636:419;;;:::o;37061:::-;37227:4;37265:2;37254:9;37250:18;37242:26;;37314:9;37308:4;37304:20;37300:1;37289:9;37285:17;37278:47;37342:131;37468:4;37342:131;:::i;:::-;37334:139;;37061:419;;;:::o;37486:::-;37652:4;37690:2;37679:9;37675:18;37667:26;;37739:9;37733:4;37729:20;37725:1;37714:9;37710:17;37703:47;37767:131;37893:4;37767:131;:::i;:::-;37759:139;;37486:419;;;:::o;37911:222::-;38004:4;38042:2;38031:9;38027:18;38019:26;;38055:71;38123:1;38112:9;38108:17;38099:6;38055:71;:::i;:::-;37911:222;;;;:::o;38139:129::-;38173:6;38200:20;;:::i;:::-;38190:30;;38229:33;38257:4;38249:6;38229:33;:::i;:::-;38139:129;;;:::o;38274:75::-;38307:6;38340:2;38334:9;38324:19;;38274:75;:::o;38355:311::-;38432:4;38522:18;38514:6;38511:30;38508:56;;;38544:18;;:::i;:::-;38508:56;38594:4;38586:6;38582:17;38574:25;;38654:4;38648;38644:15;38636:23;;38355:311;;;:::o;38672:307::-;38733:4;38823:18;38815:6;38812:30;38809:56;;;38845:18;;:::i;:::-;38809:56;38883:29;38905:6;38883:29;:::i;:::-;38875:37;;38967:4;38961;38957:15;38949:23;;38672:307;;;:::o;38985:308::-;39047:4;39137:18;39129:6;39126:30;39123:56;;;39159:18;;:::i;:::-;39123:56;39197:29;39219:6;39197:29;:::i;:::-;39189:37;;39281:4;39275;39271:15;39263:23;;38985:308;;;:::o;39299:98::-;39350:6;39384:5;39378:12;39368:22;;39299:98;;;:::o;39403:99::-;39455:6;39489:5;39483:12;39473:22;;39403:99;;;:::o;39508:168::-;39591:11;39625:6;39620:3;39613:19;39665:4;39660:3;39656:14;39641:29;;39508:168;;;;:::o;39682:169::-;39766:11;39800:6;39795:3;39788:19;39840:4;39835:3;39831:14;39816:29;;39682:169;;;;:::o;39857:148::-;39959:11;39996:3;39981:18;;39857:148;;;;:::o;40011:305::-;40051:3;40070:20;40088:1;40070:20;:::i;:::-;40065:25;;40104:20;40122:1;40104:20;:::i;:::-;40099:25;;40258:1;40190:66;40186:74;40183:1;40180:81;40177:107;;;40264:18;;:::i;:::-;40177:107;40308:1;40305;40301:9;40294:16;;40011:305;;;;:::o;40322:185::-;40362:1;40379:20;40397:1;40379:20;:::i;:::-;40374:25;;40413:20;40431:1;40413:20;:::i;:::-;40408:25;;40452:1;40442:35;;40457:18;;:::i;:::-;40442:35;40499:1;40496;40492:9;40487:14;;40322:185;;;;:::o;40513:348::-;40553:7;40576:20;40594:1;40576:20;:::i;:::-;40571:25;;40610:20;40628:1;40610:20;:::i;:::-;40605:25;;40798:1;40730:66;40726:74;40723:1;40720:81;40715:1;40708:9;40701:17;40697:105;40694:131;;;40805:18;;:::i;:::-;40694:131;40853:1;40850;40846:9;40835:20;;40513:348;;;;:::o;40867:191::-;40907:4;40927:20;40945:1;40927:20;:::i;:::-;40922:25;;40961:20;40979:1;40961:20;:::i;:::-;40956:25;;41000:1;40997;40994:8;40991:34;;;41005:18;;:::i;:::-;40991:34;41050:1;41047;41043:9;41035:17;;40867:191;;;;:::o;41064:96::-;41101:7;41130:24;41148:5;41130:24;:::i;:::-;41119:35;;41064:96;;;:::o;41166:90::-;41200:7;41243:5;41236:13;41229:21;41218:32;;41166:90;;;:::o;41262:149::-;41298:7;41338:66;41331:5;41327:78;41316:89;;41262:149;;;:::o;41417:126::-;41454:7;41494:42;41487:5;41483:54;41472:65;;41417:126;;;:::o;41549:77::-;41586:7;41615:5;41604:16;;41549:77;;;:::o;41632:154::-;41716:6;41711:3;41706;41693:30;41778:1;41769:6;41764:3;41760:16;41753:27;41632:154;;;:::o;41792:307::-;41860:1;41870:113;41884:6;41881:1;41878:13;41870:113;;;41969:1;41964:3;41960:11;41954:18;41950:1;41945:3;41941:11;41934:39;41906:2;41903:1;41899:10;41894:15;;41870:113;;;42001:6;41998:1;41995:13;41992:101;;;42081:1;42072:6;42067:3;42063:16;42056:27;41992:101;41841:258;41792:307;;;:::o;42105:320::-;42149:6;42186:1;42180:4;42176:12;42166:22;;42233:1;42227:4;42223:12;42254:18;42244:81;;42310:4;42302:6;42298:17;42288:27;;42244:81;42372:2;42364:6;42361:14;42341:18;42338:38;42335:84;;;42391:18;;:::i;:::-;42335:84;42156:269;42105:320;;;:::o;42431:281::-;42514:27;42536:4;42514:27;:::i;:::-;42506:6;42502:40;42644:6;42632:10;42629:22;42608:18;42596:10;42593:34;42590:62;42587:88;;;42655:18;;:::i;:::-;42587:88;42695:10;42691:2;42684:22;42474:238;42431:281;;:::o;42718:233::-;42757:3;42780:24;42798:5;42780:24;:::i;:::-;42771:33;;42826:66;42819:5;42816:77;42813:103;;;42896:18;;:::i;:::-;42813:103;42943:1;42936:5;42932:13;42925:20;;42718:233;;;:::o;42957:176::-;42989:1;43006:20;43024:1;43006:20;:::i;:::-;43001:25;;43040:20;43058:1;43040:20;:::i;:::-;43035:25;;43079:1;43069:35;;43084:18;;:::i;:::-;43069:35;43125:1;43122;43118:9;43113:14;;42957:176;;;;:::o;43139:180::-;43187:77;43184:1;43177:88;43284:4;43281:1;43274:15;43308:4;43305:1;43298:15;43325:180;43373:77;43370:1;43363:88;43470:4;43467:1;43460:15;43494:4;43491:1;43484:15;43511:180;43559:77;43556:1;43549:88;43656:4;43653:1;43646:15;43680:4;43677:1;43670:15;43697:180;43745:77;43742:1;43735:88;43842:4;43839:1;43832:15;43866:4;43863:1;43856:15;43883:180;43931:77;43928:1;43921:88;44028:4;44025:1;44018:15;44052:4;44049:1;44042:15;44069:180;44117:77;44114:1;44107:88;44214:4;44211:1;44204:15;44238:4;44235:1;44228:15;44255:117;44364:1;44361;44354:12;44378:117;44487:1;44484;44477:12;44501:117;44610:1;44607;44600:12;44624:117;44733:1;44730;44723:12;44747:117;44856:1;44853;44846:12;44870:117;44979:1;44976;44969:12;44993:102;45034:6;45085:2;45081:7;45076:2;45069:5;45065:14;45061:28;45051:38;;44993:102;;;:::o;45101:222::-;45241:34;45237:1;45229:6;45225:14;45218:58;45310:5;45305:2;45297:6;45293:15;45286:30;45101:222;:::o;45329:238::-;45469:34;45465:1;45457:6;45453:14;45446:58;45538:21;45533:2;45525:6;45521:15;45514:46;45329:238;:::o;45573:230::-;45713:34;45709:1;45701:6;45697:14;45690:58;45782:13;45777:2;45769:6;45765:15;45758:38;45573:230;:::o;45809:237::-;45949:34;45945:1;45937:6;45933:14;45926:58;46018:20;46013:2;46005:6;46001:15;45994:45;45809:237;:::o;46052:225::-;46192:34;46188:1;46180:6;46176:14;46169:58;46261:8;46256:2;46248:6;46244:15;46237:33;46052:225;:::o;46283:178::-;46423:30;46419:1;46411:6;46407:14;46400:54;46283:178;:::o;46467:222::-;46607:34;46603:1;46595:6;46591:14;46584:58;46676:5;46671:2;46663:6;46659:15;46652:30;46467:222;:::o;46695:226::-;46835:34;46831:1;46823:6;46819:14;46812:58;46904:9;46899:2;46891:6;46887:15;46880:34;46695:226;:::o;46927:182::-;47067:34;47063:1;47055:6;47051:14;47044:58;46927:182;:::o;47115:223::-;47255:34;47251:1;47243:6;47239:14;47232:58;47324:6;47319:2;47311:6;47307:15;47300:31;47115:223;:::o;47344:175::-;47484:27;47480:1;47472:6;47468:14;47461:51;47344:175;:::o;47525:231::-;47665:34;47661:1;47653:6;47649:14;47642:58;47734:14;47729:2;47721:6;47717:15;47710:39;47525:231;:::o;47762:243::-;47902:34;47898:1;47890:6;47886:14;47879:58;47971:26;47966:2;47958:6;47954:15;47947:51;47762:243;:::o;48011:229::-;48151:34;48147:1;48139:6;48135:14;48128:58;48220:12;48215:2;48207:6;48203:15;48196:37;48011:229;:::o;48246:228::-;48386:34;48382:1;48374:6;48370:14;48363:58;48455:11;48450:2;48442:6;48438:15;48431:36;48246:228;:::o;48480:179::-;48620:31;48616:1;48608:6;48604:14;48597:55;48480:179;:::o;48665:182::-;48805:34;48801:1;48793:6;48789:14;48782:58;48665:182;:::o;48853:::-;48993:34;48989:1;48981:6;48977:14;48970:58;48853:182;:::o;49041:231::-;49181:34;49177:1;49169:6;49165:14;49158:58;49250:14;49245:2;49237:6;49233:15;49226:39;49041:231;:::o;49278:235::-;49418:34;49414:1;49406:6;49402:14;49395:58;49487:18;49482:2;49474:6;49470:15;49463:43;49278:235;:::o;49519:155::-;49659:7;49655:1;49647:6;49643:14;49636:31;49519:155;:::o;49680:182::-;49820:34;49816:1;49808:6;49804:14;49797:58;49680:182;:::o;49868:180::-;50008:32;50004:1;49996:6;49992:14;49985:56;49868:180;:::o;50054:176::-;50194:28;50190:1;50182:6;50178:14;50171:52;50054:176;:::o;50236:228::-;50376:34;50372:1;50364:6;50360:14;50353:58;50445:11;50440:2;50432:6;50428:15;50421:36;50236:228;:::o;50470:234::-;50610:34;50606:1;50598:6;50594:14;50587:58;50679:17;50674:2;50666:6;50662:15;50655:42;50470:234;:::o;50710:220::-;50850:34;50846:1;50838:6;50834:14;50827:58;50919:3;50914:2;50906:6;50902:15;50895:28;50710:220;:::o;50936:236::-;51076:34;51072:1;51064:6;51060:14;51053:58;51145:19;51140:2;51132:6;51128:15;51121:44;50936:236;:::o;51178:231::-;51318:34;51314:1;51306:6;51302:14;51295:58;51387:14;51382:2;51374:6;51370:15;51363:39;51178:231;:::o;51415:168::-;51555:20;51551:1;51543:6;51539:14;51532:44;51415:168;:::o;51589:182::-;51729:34;51725:1;51717:6;51713:14;51706:58;51589:182;:::o;51777:122::-;51850:24;51868:5;51850:24;:::i;:::-;51843:5;51840:35;51830:63;;51889:1;51886;51879:12;51830:63;51777:122;:::o;51905:116::-;51975:21;51990:5;51975:21;:::i;:::-;51968:5;51965:32;51955:60;;52011:1;52008;52001:12;51955:60;51905:116;:::o;52027:120::-;52099:23;52116:5;52099:23;:::i;:::-;52092:5;52089:34;52079:62;;52137:1;52134;52127:12;52079:62;52027:120;:::o;52153:122::-;52226:24;52244:5;52226:24;:::i;:::-;52219:5;52216:35;52206:63;;52265:1;52262;52255:12;52206:63;52153:122;:::o
Swarm Source
ipfs://82c0832190034a63dbf081b4b0bda03e653ea6847f722a131dea0e0cb192f754
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.