ETH Price: $2,604.64 (+0.90%)

Token

LGBT NFT (LGBT+)
 

Overview

Max Total Supply

1 LGBT+

Holders

1

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LGBT+
0xe3eba092544ddb368705c8c672394ceaff49834c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LGBTNFT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 2: LGBTNFT.sol
pragma solidity <=8.7.0;
pragma experimental ABIEncoderV2;
//SPDX-License-Identifier: MIT

import "./ERC721.sol";

contract LGBTNFT is ERC721, ReentrancyGuard, Ownable {
	uint256 public price = 100000000000000000;
	uint256 public maxSupply = 4869;
	uint256 public currentSupply = 0;
	address public LGBTokenContract;
	uint256 public LGBTokenDropPerMint = 1000000000000;
	uint256 public openAt = 1638554400;

	constructor() ERC721("LGBT NFT", "LGBT+") {
		_setBaseURI(string("https://lgbt-nft.online/meta/"));
	}

	function isOpen() public view returns (bool) {
		if (block.timestamp >= openAt) {
			return true;
		}
		return false;
	}

	function mint() public payable nonReentrant {
		require(isOpen(), "Minting is not yet enabled");
		require(price <= msg.value, "Not enough Ether sent");
		uint256 Count = msg.value/price;
		require(currentSupply < maxSupply, "Minting closed");
		uint256 remaining = maxSupply-currentSupply;
		require(Count <= remaining, "Not enough NFT remaining for this Ether amount");
		for (uint256 i=0; i<Count; i++) {
			_safeMint(msg.sender, currentSupply);
			if (currentSupply < maxSupply/2) {
				ERC20(LGBTokenContract).transfer(msg.sender, LGBTokenDropPerMint);
			}
			currentSupply += 1;
		}
	}

	function withdraw() public onlyOwner {
		uint256 balance = address(this).balance;
		payable(msg.sender).transfer(balance);
	}

	function setLGBTokenContract(address contractAddress) external onlyOwner {
		LGBTokenContract = contractAddress;
	}

	receive() external payable {}
}

interface ERC20 {
	function transfer(address, uint256) external returns (bool);
	function approve(address, uint256) external returns (bool);
	function transferFrom(address, address, uint256) external returns (bool);
}

File 1 of 2: ERC721.sol
pragma solidity <=8.7.0;
pragma experimental ABIEncoderV2;
//SPDX-License-Identifier: MIT

abstract contract Context {
	function _msgSender() internal view virtual returns (address payable) {
		return payable(msg.sender);
	}

	function _msgData() internal view virtual returns (bytes memory) {
		this;
		return msg.data;
	}
}

library Base64 {
	bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

	function encode(bytes memory data) internal pure returns (string memory) {
		uint256 len = data.length;
		if (len == 0) return "";

		uint256 encodedLen = 4 * ((len + 2) / 3);
		bytes memory result = new bytes(encodedLen + 32);
		bytes memory table = TABLE;

		assembly {
			let tablePtr := add(table, 1)
			let resultPtr := add(result, 32)

			for {
				let i := 0
			} lt(i, len) {

			} {
				i := add(i, 3)
				let input := and(mload(add(data, i)), 0xffffff)

				let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
				out := shl(8, out)
				out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
				out := shl(8, out)
				out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
				out := shl(8, out)
				out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
				out := shl(224, out)

				mstore(resultPtr, out)

				resultPtr := add(resultPtr, 4)
			}

			switch mod(len, 3)
			case 1 {
				mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
			}
			case 2 {
				mstore(sub(resultPtr, 1), shl(248, 0x3d))
			}

			mstore(result, encodedLen)
		}

		return string(result);
	}
}

abstract contract Ownable is Context {
	address payable private _owner;
	event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

	constructor () {
		address payable msgSender = _msgSender();
		_owner = msgSender;
		emit OwnershipTransferred(address(0), msgSender);
	}

	function owner() public view virtual returns (address payable) {
		return _owner;
	}

	modifier onlyOwner() {
		require(owner() == _msgSender(), "Ownable: caller is not the owner");
		_;
	}

/*	function renounceOwnership() public virtual onlyOwner {
		emit OwnershipTransferred(_owner, address(0));
		_owner = address(0);
	}

	function transferOwnership(address newOwner) public virtual onlyOwner {
		require(newOwner != address(0), "Ownable: new owner is the zero address");
		emit OwnershipTransferred(_owner, newOwner);
		_owner = newOwner;
	}*/
}

abstract contract ReentrancyGuard {
	uint256 private constant _NOT_ENTERED = 1;
	uint256 private constant _ENTERED = 2;
	uint256 private _status;

	constructor() {
		_status = _NOT_ENTERED;
	}

	modifier nonReentrant() {
		require(_status != _ENTERED, "ReentrancyGuard: reentrant call");
		_status = _ENTERED;
		_;
		_status = _NOT_ENTERED;
	}
}

interface IERC721Receiver {
	function onERC721Received(address operator, address from, uint256 tokenId, bytes calldata data) external returns (bytes4);
}

library Strings {
	function toString(uint256 value) internal pure returns (string memory) {
		unchecked {
			if (value == 0) {
				return "0";
			}
			uint256 temp = value;
			uint256 digits;
			while (temp != 0) {
				digits++;
				temp /= 10;
			}
			bytes memory buffer = new bytes(digits);
			uint256 index = digits - 1;
			temp = value;
			while (temp != 0) {
				buffer[index--] = bytes1(uint8(48 + temp % 10));
				temp /= 10;
			}
			return string(buffer);
		}
	}
}

library EnumerableMap {
	struct MapEntry {
		bytes32 _key;
		bytes32 _value;
	}

	struct Map {
		MapEntry[] _entries;
		mapping (bytes32 => uint256) _indexes;
	}

	function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
		uint256 keyIndex = map._indexes[key];
		if (keyIndex == 0) {
			map._entries.push(MapEntry({ _key: key, _value: value }));
			map._indexes[key] = map._entries.length;
			return true;
		} else {
			map._entries[keyIndex - 1]._value = value;
			return false;
		}
	}

	function _remove(Map storage map, bytes32 key) private returns (bool) {
		uint256 keyIndex = map._indexes[key];
		if (keyIndex != 0) {
			uint256 toDeleteIndex = keyIndex - 1;
			uint256 lastIndex = map._entries.length - 1;
			MapEntry storage lastEntry = map._entries[lastIndex];
			map._entries[toDeleteIndex] = lastEntry;
			map._indexes[lastEntry._key] = toDeleteIndex + 1;
			map._entries.pop();
			delete map._indexes[key];
			return true;
		} else {
			return false;
		}
	}

	function _contains(Map storage map, bytes32 key) private view returns (bool) {
		return map._indexes[key] != 0;
	}

	function _length(Map storage map) private view returns (uint256) {
		return map._entries.length;
	}

	function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
		require(map._entries.length > index, "EnumerableMap: index out of bounds");

		MapEntry storage entry = map._entries[index];
		return (entry._key, entry._value);
	}

	function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
		uint256 keyIndex = map._indexes[key];
		if (keyIndex == 0) return (false, 0);
		return (true, map._entries[keyIndex - 1]._value);
	}

	function _get(Map storage map, bytes32 key) private view returns (bytes32) {
		uint256 keyIndex = map._indexes[key];
		require(keyIndex != 0, "EnumerableMap: nonexistent key");
		return map._entries[keyIndex - 1]._value;
	}

	function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
		uint256 keyIndex = map._indexes[key];
		require(keyIndex != 0, errorMessage);
		return map._entries[keyIndex - 1]._value;
	}

	struct UintToAddressMap {
		Map _inner;
	}

	function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
		return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
	}

	function remove(UintToAddressMap storage map, uint256 key) internal returns (bool) {
		return _remove(map._inner, bytes32(key));
	}

	function contains(UintToAddressMap storage map, uint256 key) internal view returns (bool) {
		return _contains(map._inner, bytes32(key));
	}

	function length(UintToAddressMap storage map) internal view returns (uint256) {
		return _length(map._inner);
	}

	function at(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
		(bytes32 key, bytes32 value) = _at(map._inner, index);
		return (uint256(key), address(uint160(uint256(value))));
	}

	function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
		(bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
		return (success, address(uint160(uint256(value))));
	}

	function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
		return address(uint160(uint256(_get(map._inner, bytes32(key)))));
	}

	function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
		return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
	}
}

library EnumerableSet {
	struct Set {
		bytes32[] _values;
		mapping (bytes32 => uint256) _indexes;
	}

	function _add(Set storage set, bytes32 value) private returns (bool) {
		if (!_contains(set, value)) {
			set._values.push(value);
			set._indexes[value] = set._values.length;
			return true;
		} else {
			return false;
		}
	}

	function _remove(Set storage set, bytes32 value) private returns (bool) {
		uint256 valueIndex = set._indexes[value];
		if (valueIndex != 0) {
			uint256 toDeleteIndex = valueIndex - 1;
			uint256 lastIndex = set._values.length - 1;
			bytes32 lastvalue = set._values[lastIndex];
			set._values[toDeleteIndex] = lastvalue;
			set._indexes[lastvalue] = toDeleteIndex + 1;
			set._values.pop();
			delete set._indexes[value];
			return true;
		} else {
			return false;
		}
	}

	function _contains(Set storage set, bytes32 value) private view returns (bool) {
		return set._indexes[value] != 0;
	}

	function _length(Set storage set) private view returns (uint256) {
		return set._values.length;
	}

	function _at(Set storage set, uint256 index) private view returns (bytes32) {
		require(set._values.length > index, "EnumerableSet: index out of bounds");
		return set._values[index];
	}

	struct Bytes32Set {
		Set _inner;
	}

	function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
		return _add(set._inner, value);
	}

	function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
		return _remove(set._inner, value);
	}

	function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
		return _contains(set._inner, value);
	}

	function length(Bytes32Set storage set) internal view returns (uint256) {
		return _length(set._inner);
	}

	function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
		return _at(set._inner, index);
	}

	struct AddressSet {
		Set _inner;
	}

	function add(AddressSet storage set, address value) internal returns (bool) {
		return _add(set._inner, bytes32(uint256(uint160(value))));
	}

	function remove(AddressSet storage set, address value) internal returns (bool) {
		return _remove(set._inner, bytes32(uint256(uint160(value))));
	}

	function contains(AddressSet storage set, address value) internal view returns (bool) {
		return _contains(set._inner, bytes32(uint256(uint160(value))));
	}

	function length(AddressSet storage set) internal view returns (uint256) {
		return _length(set._inner);
	}

	function at(AddressSet storage set, uint256 index) internal view returns (address) {
		return address(uint160(uint256(_at(set._inner, index))));
	}

	struct UintSet {
		Set _inner;
	}

	function add(UintSet storage set, uint256 value) internal returns (bool) {
		return _add(set._inner, bytes32(value));
	}

	function remove(UintSet storage set, uint256 value) internal returns (bool) {
		return _remove(set._inner, bytes32(value));
	}

	function contains(UintSet storage set, uint256 value) internal view returns (bool) {
		return _contains(set._inner, bytes32(value));
	}

	function length(UintSet storage set) internal view returns (uint256) {
		return _length(set._inner);
	}

	function at(UintSet storage set, uint256 index) internal view returns (uint256) {
		return uint256(_at(set._inner, index));
	}
}

library Address {

	function isContract(address account) internal view returns (bool) {
		uint256 size;
		assembly { size := extcodesize(account) }
		return size > 0;
	}

	function sendValue(address payable recipient, uint256 amount) internal {
		require(address(this).balance >= amount, "Address: insufficient balance");
		(bool success, ) = recipient.call{ value: amount }("");
		require(success, "Address: unable to send value, recipient may have reverted");
	}

	function functionCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionCall(target, data, "Address: low-level call failed");
	}

	function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
		return functionCallWithValue(target, data, 0, errorMessage);
	}

	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");
	}

	function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) {
		require(address(this).balance >= value, "Address: insufficient balance for call");
		require(isContract(target), "Address: call to non-contract");
		(bool success, bytes memory returndata) = target.call{ value: value }(data);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
		return functionStaticCall(target, data, "Address: low-level static call failed");
	}

	function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) {
		require(isContract(target), "Address: static call to non-contract");
		(bool success, bytes memory returndata) = target.staticcall(data);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
		return functionDelegateCall(target, data, "Address: low-level delegate call failed");
	}

	function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) {
		require(isContract(target), "Address: delegate call to non-contract");
		(bool success, bytes memory returndata) = target.delegatecall(data);
		return _verifyCallResult(success, returndata, errorMessage);
	}

	function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) {
		if (success) {
			return returndata;
		} else {
			if (returndata.length > 0) {
				assembly {
					let returndata_size := mload(returndata)
					revert(add(32, returndata), returndata_size)
				}
			} else {
				revert(errorMessage);
			}
		}
	}
}

library SafeMath {
	function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		uint256 c = a + b;
		if (c < a) return (false, 0);
		return (true, c);
	}

	function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		if (b > a) return (false, 0);
		return (true, a - b);
	}

	function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		if (a == 0) return (true, 0);
		uint256 c = a * b;
		if (c / a != b) return (false, 0);
		return (true, c);
	}

	function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		if (b == 0) return (false, 0);
		return (true, a / b);
	}

	function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
		if (b == 0) return (false, 0);
		return (true, a % b);
	}

	function add(uint256 a, uint256 b) internal pure returns (uint256) {
		uint256 c = a + b;
		require(c >= a, "SafeMath: addition overflow");
		return c;
	}

	function sub(uint256 a, uint256 b) internal pure returns (uint256) {
		require(b <= a, "SafeMath: subtraction overflow");
		return a - b;
	}

	function mul(uint256 a, uint256 b) internal pure returns (uint256) {
		if (a == 0) return 0;
		uint256 c = a * b;
		require(c / a == b, "SafeMath: multiplication overflow");
		return c;
	}

	function div(uint256 a, uint256 b) internal pure returns (uint256) {
		require(b > 0, "SafeMath: division by zero");
		return a / b;
	}

	function mod(uint256 a, uint256 b) internal pure returns (uint256) {
		require(b > 0, "SafeMath: modulo by zero");
		return a % b;
	}

	function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b <= a, errorMessage);
		return a - b;
	}

	function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b > 0, errorMessage);
		return a / b;
	}

	function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
		require(b > 0, errorMessage);
		return a % b;
	}
}

interface IERC165 {
	function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

abstract contract ERC165 is IERC165 {
	bytes4 private constant _INTERFACE_ID_ERC165 = 0x01ffc9a7;
	mapping(bytes4 => bool) private _supportedInterfaces;

	constructor() {
		_registerInterface(_INTERFACE_ID_ERC165);
	}

	function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
		return _supportedInterfaces[interfaceId];
	}

	function _registerInterface(bytes4 interfaceId) internal virtual {
		require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
		_supportedInterfaces[interfaceId] = true;
	}
}

interface IERC721 is IERC165 {
	event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);
	event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);
	event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

	function balanceOf(address owner) external view returns (uint256 balance);
	function ownerOf(uint256 tokenId) external view returns (address owner);
	function safeTransferFrom(address from, address to, uint256 tokenId) external;
	function transferFrom(address from, address to, uint256 tokenId) external;
	function approve(address to, uint256 tokenId) external;
	function getApproved(uint256 tokenId) external view returns (address operator);
	function setApprovalForAll(address operator, bool _approved) external;
	function isApprovedForAll(address owner, address operator) external view returns (bool);
	function safeTransferFrom(address from, address to, uint256 tokenId, bytes calldata data) external;
}

interface IERC721Enumerable is IERC721 {
	function totalSupply() external view returns (uint256);
	function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);
	function tokenByIndex(uint256 index) external view returns (uint256);
}

interface IERC721Metadata is IERC721 {
	function name() external view returns (string memory);
	function symbol() external view returns (string memory);
	function tokenURI(uint256 tokenId) external view returns (string memory);
}

contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
	using SafeMath for uint256;
	using Address for address;
	using EnumerableSet for EnumerableSet.UintSet;
	using EnumerableMap for EnumerableMap.UintToAddressMap;
	using Strings for uint256;

	bytes4 private constant _ERC721_RECEIVED = 0x150b7a02;
	mapping (address => EnumerableSet.UintSet) private _holderTokens;
	EnumerableMap.UintToAddressMap private _tokenOwners;
	mapping (uint256 => address) private _tokenApprovals;
	mapping (address => mapping (address => bool)) private _operatorApprovals;
	string private _name;
	string private _symbol;
	mapping (uint256 => string) private _tokenURIs;
	string private _baseURI;
	bytes4 private constant _INTERFACE_ID_ERC721 = 0x80ac58cd;
	bytes4 private constant _INTERFACE_ID_ERC721_METADATA = 0x5b5e139f;
	bytes4 private constant _INTERFACE_ID_ERC721_ENUMERABLE = 0x780e9d63;
	constructor (string memory name_, string memory symbol_) {
		_name = name_;
		_symbol = symbol_;

		_registerInterface(_INTERFACE_ID_ERC721);
		_registerInterface(_INTERFACE_ID_ERC721_METADATA);
		_registerInterface(_INTERFACE_ID_ERC721_ENUMERABLE);
	}

	function balanceOf(address owner) public view virtual override returns (uint256) {
		require(owner != address(0), "ERC721: balance query for the zero address");
		return _holderTokens[owner].length();
	}

	function ownerOf(uint256 tokenId) public view virtual override returns (address) {
		return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
	}

	function name() public view virtual override returns (string memory) {
		return _name;
	}

	function symbol() public view virtual override returns (string memory) {
		return _symbol;
	}

	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 (bytes(base).length == 0) {
			return _tokenURI;
		}
		if (bytes(_tokenURI).length > 0) {
			return string(abi.encodePacked(base, _tokenURI));
		}
		return string(abi.encodePacked(base, tokenId.toString(), string(".json")));
	}

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

	function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
		return _holderTokens[owner].at(index);
	}

	function totalSupply() public view virtual override returns (uint256) {
		return _tokenOwners.length();
	}

	function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
		(uint256 tokenId, ) = _tokenOwners.at(index);
		return tokenId;
	}

	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 || ERC721.isApprovedForAll(owner, _msgSender()),
			"ERC721: approve caller is not owner nor approved for all"
		);
		_approve(to, tokenId);
	}

	function getApproved(uint256 tokenId) public view virtual override returns (address) {
		require(_exists(tokenId), "ERC721: approved query for nonexistent token");
		return _tokenApprovals[tokenId];
	}

	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);
	}

	function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
		return _operatorApprovals[owner][operator];
	}

	function transferFrom(address from, address to, uint256 tokenId) public virtual override {
		require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
		_transfer(from, to, tokenId);
	}

	function safeTransferFrom(address from, address to, uint256 tokenId) public virtual override {
		safeTransferFrom(from, to, tokenId, "");
	}

	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);
	}

	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");
	}

	function _exists(uint256 tokenId) internal view virtual returns (bool) {
		return _tokenOwners.contains(tokenId);
	}

	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 || ERC721.isApprovedForAll(owner, spender));
	}

	function _safeMint(address to, uint256 tokenId) internal virtual {
		_safeMint(to, tokenId, "");
	}

	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");
	}

	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);
		_holderTokens[to].add(tokenId);
		_tokenOwners.set(tokenId, to);
		emit Transfer(address(0), to, tokenId);
	}

	function _burn(uint256 tokenId) internal virtual {
		address owner = ERC721.ownerOf(tokenId);
		_beforeTokenTransfer(owner, address(0), tokenId);
		_approve(address(0), tokenId);
		if (bytes(_tokenURIs[tokenId]).length != 0) {
			delete _tokenURIs[tokenId];
		}
		_holderTokens[owner].remove(tokenId);
		_tokenOwners.remove(tokenId);
		emit Transfer(owner, address(0), tokenId);
	}

	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);
		_approve(address(0), tokenId);
		_holderTokens[from].remove(tokenId);
		_holderTokens[to].add(tokenId);
		_tokenOwners.set(tokenId, to);
		emit Transfer(from, to, tokenId);
	}

	function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
		require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
		_tokenURIs[tokenId] = _tokenURI;
	}

	function _setBaseURI(string memory baseURI_) internal virtual {
		_baseURI = baseURI_;
	}

	function _checkOnERC721Received(address from, address to, uint256 tokenId, bytes memory _data)
	private returns (bool)
	{
		if (!to.isContract()) {
			return true;
		}
		bytes memory returndata = to.functionCall(abi.encodeWithSelector(
				IERC721Receiver(to).onERC721Received.selector,
				_msgSender(),
				from,
				tokenId,
				_data
			), "ERC721: transfer to non ERC721Receiver implementer");
		bytes4 retval = abi.decode(returndata, (bytes4));
		return (retval == _ERC721_RECEIVED);
	}

	function _approve(address to, uint256 tokenId) internal virtual {
		_tokenApprovals[tokenId] = to;
		emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
	}

	function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}

Contract Security Audit

Contract ABI

[{"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":"LGBTokenContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"LGBTokenDropPerMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"currentSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"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":"isOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"openAt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address payable","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":"price","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"contractAddress","type":"address"}],"name":"setLGBTokenContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"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":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405267016345785d8a0000600c55611305600d556000600e5564e8d4a510006010556361aa5b206011553480156200003957600080fd5b5060408051808201825260088152671311d0950813919560c21b602080830191909152825180840190935260058352644c4742542b60d81b9083015290620000886301ffc9a760e01b62000179565b81516200009d90600690602085019062000216565b508051620000b390600790602084019062000216565b50620000c66380ac58cd60e01b62000179565b620000d8635b5e139f60e01b62000179565b620000ea63780e9d6360e01b62000179565b50506001600a55600b80546001600160a01b0319163390811790915560405181906000907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a35060408051808201909152601d81527f68747470733a2f2f6c6762742d6e66742e6f6e6c696e652f6d6574612f00000060208201526200017390620001fd565b620002f9565b6001600160e01b03198082161415620001d85760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e7465726661636520696400000000604482015260640160405180910390fd5b6001600160e01b0319166000908152602081905260409020805460ff19166001179055565b80516200021290600990602084019062000216565b5050565b8280546200022490620002bc565b90600052602060002090601f01602090048101928262000248576000855562000293565b82601f106200026357805160ff191683800117855562000293565b8280016001018555821562000293579182015b828111156200029357825182559160200191906001019062000276565b50620002a1929150620002a5565b5090565b5b80821115620002a15760008155600101620002a6565b600181811c90821680620002d157607f821691505b60208210811415620002f357634e487b7160e01b600052602260045260246000fd5b50919050565b61206a80620003096000396000f3fe6080604052600436106101bb5760003560e01c80636c0360eb116100ec578063a0e23ebd1161008a578063c87b56dd11610064578063c87b56dd146104a7578063d5abeb01146104c7578063e985e9c5146104dd578063fa5047f61461052657600080fd5b8063a0e23ebd14610451578063a22cb46514610467578063b88d4fde1461048757600080fd5b80637c2aa621116100c65780637c2aa621146103e85780638da5cb5b1461040857806395d89b4114610426578063a035b1fe1461043b57600080fd5b80636c0360eb1461039d57806370a08231146103b2578063771282f6146103d257600080fd5b80632f745c591161015957806347535d7b1161013357806347535d7b1461033257806347f992bc146103475780634f6ccce71461035d5780636352211e1461037d57600080fd5b80632f745c59146102dd5780633ccfd60b146102fd57806342842e0e1461031257600080fd5b8063095ea7b311610195578063095ea7b3146102705780631249c58b1461029257806318160ddd1461029a57806323b872dd146102bd57600080fd5b806301ffc9a7146101c757806306fdde0314610216578063081812fc1461023857600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506102016101e2366004611c87565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561022257600080fd5b5061022b610546565b60405161020d9190611dd1565b34801561024457600080fd5b50610258610253366004611cc1565b6105d8565b6040516001600160a01b03909116815260200161020d565b34801561027c57600080fd5b5061029061028b366004611c40565b610665565b005b61029061077b565b3480156102a657600080fd5b506102af610a30565b60405190815260200161020d565b3480156102c957600080fd5b506102906102d8366004611af1565b610a41565b3480156102e957600080fd5b506102af6102f8366004611c40565b610a72565b34801561030957600080fd5b50610290610a9d565b34801561031e57600080fd5b5061029061032d366004611af1565b610b2a565b34801561033e57600080fd5b50610201610b45565b34801561035357600080fd5b506102af60105481565b34801561036957600080fd5b506102af610378366004611cc1565b610b5c565b34801561038957600080fd5b50610258610398366004611cc1565b610b72565b3480156103a957600080fd5b5061022b610b9a565b3480156103be57600080fd5b506102af6103cd366004611aa3565b610ba9565b3480156103de57600080fd5b506102af600e5481565b3480156103f457600080fd5b50610290610403366004611aa3565b610c35565b34801561041457600080fd5b50600b546001600160a01b0316610258565b34801561043257600080fd5b5061022b610cb1565b34801561044757600080fd5b506102af600c5481565b34801561045d57600080fd5b506102af60115481565b34801561047357600080fd5b50610290610482366004611c09565b610cc0565b34801561049357600080fd5b506102906104a2366004611b2d565b610d85565b3480156104b357600080fd5b5061022b6104c2366004611cc1565b610dbd565b3480156104d357600080fd5b506102af600d5481565b3480156104e957600080fd5b506102016104f8366004611abe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561053257600080fd5b50600f54610258906001600160a01b031681565b60606006805461055590611f04565b80601f016020809104026020016040519081016040528092919081815260200182805461058190611f04565b80156105ce5780601f106105a3576101008083540402835291602001916105ce565b820191906000526020600020905b8154815290600101906020018083116105b157829003601f168201915b5050505050905090565b60006105e382610f4e565b6106495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061067082610b72565b9050806001600160a01b0316836001600160a01b031614156106de5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610640565b336001600160a01b03821614806106fa57506106fa81336104f8565b61076c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610640565b6107768383610f5b565b505050565b6002600a5414156107ce5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600a556107db610b45565b6108275760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206973206e6f742079657420656e61626c65640000000000006044820152606401610640565b34600c5411156108715760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08115d1a195c881cd95b9d605a1b6044820152606401610640565b6000600c54346108819190611e9f565b9050600d54600e54106108c75760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d1a5b99c818db1bdcd95960921b6044820152606401610640565b6000600e54600d546108d99190611ec1565b9050808211156109425760405162461bcd60e51b815260206004820152602e60248201527f4e6f7420656e6f756768204e46542072656d61696e696e6720666f722074686960448201526d1cc8115d1a195c88185b5bdd5b9d60921b6064820152608401610640565b60005b82811015610a265761095933600e54610fc9565b6002600d546109689190611e9f565b600e5410156109fb57600f5460105460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f99190611c6a565b505b6001600e6000828254610a0e9190611e87565b90915550819050610a1e81611f3f565b915050610945565b50506001600a5550565b6000610a3c6002610fe3565b905090565b610a4b3382610fed565b610a675760405162461bcd60e51b815260040161064090611e36565b6107768383836110d7565b6001600160a01b0382166000908152600160205260408120610a949083611258565b90505b92915050565b600b546001600160a01b03163314610af75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6040514790339082156108fc029083906000818181858888f19350505050158015610b26573d6000803e3d6000fd5b5050565b61077683838360405180602001604052806000815250610d85565b60006011544210610b565750600190565b50600090565b600080610b6a600284611264565b509392505050565b6000610a978260405180606001604052806029815260200161200c6029913960029190611280565b60606009805461055590611f04565b60006001600160a01b038216610c145760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610640565b6001600160a01b0382166000908152600160205260409020610a9790610fe3565b600b546001600160a01b03163314610c8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606007805461055590611f04565b6001600160a01b038216331415610d195760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610640565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d8f3383610fed565b610dab5760405162461bcd60e51b815260040161064090611e36565b610db784848484611297565b50505050565b6060610dc882610f4e565b610e2c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610640565b60008281526008602052604081208054610e4590611f04565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7190611f04565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b505050505090506000610ecf610b9a565b9050805160001415610ee2575092915050565b815115610f14578082604051602001610efc929190611d22565b60405160208183030381529060405292505050919050565b80610f1e856112ca565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610efc93929190611d51565b6000610a976002836113ab565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f9082610b72565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610b268282604051806020016040528060008152506113c3565b6000610a97825490565b6000610ff882610f4e565b6110595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610640565b600061106483610b72565b9050806001600160a01b0316846001600160a01b0316148061109f5750836001600160a01b0316611094846105d8565b6001600160a01b0316145b806110cf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166110ea82610b72565b6001600160a01b0316146111525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610640565b6001600160a01b0382166111b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610640565b6111bf600082610f5b565b6001600160a01b03831660009081526001602052604090206111e190826113f6565b506001600160a01b03821660009081526001602052604090206112049082611402565b506112116002828461140e565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610a948383611424565b600080808061127386866114aa565b9097909650945050505050565b600061128d848484611547565b90505b9392505050565b6112a28484846110d7565b6112ae848484846115b0565b610db75760405162461bcd60e51b815260040161064090611de4565b6060816112ee5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561130657600101600a820491506112f2565b60008167ffffffffffffffff81111561132157611321611f9c565b6040519080825280601f01601f19166020018201604052801561134b576020820181803683370190505b50859350905060001982015b83156113a257600a840660300160f81b8282806001900393508151811061138057611380611f86565b60200101906001600160f81b031916908160001a905350600a84049350611357565b50949350505050565b60008181526001830160205260408120541515610a94565b6113cd8383611681565b6113da60008484846115b0565b6107765760405162461bcd60e51b815260040161064090611de4565b6000610a948383611799565b6000610a94838361188c565b600061128d84846001600160a01b0385166118db565b815460009082106114825760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610640565b82600001828154811061149757611497611f86565b9060005260206000200154905092915050565b81546000908190831061150a5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610640565b600084600001848154811061152157611521611f86565b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816115775760405162461bcd60e51b81526004016106409190611dd1565b5084611584600183611ec1565b8154811061159457611594611f86565b9060005260206000209060020201600101549150509392505050565b60006001600160a01b0384163b6115c9575060016110cf565b600061164a630a85bd0160e11b338887876040516024016115ed9493929190611d94565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611fda603291396001600160a01b038816919061197c565b90506000818060200190518101906116629190611ca4565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6001600160a01b0382166116d75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610640565b6116e081610f4e565b1561172d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610640565b6001600160a01b038216600090815260016020526040902061174f9082611402565b5061175c6002828461140e565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156118825760006117bd600183611ec1565b85549091506000906117d190600190611ec1565b905060008660000182815481106117ea576117ea611f86565b906000526020600020015490508087600001848154811061180d5761180d611f86565b600091825260209091200155611824836001611e87565b6000828152600189016020526040902055865487908061184657611846611f70565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a97565b6000915050610a97565b60008181526001830160205260408120546118d357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a97565b506000610a97565b600082815260018401602052604081205480611940575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611290565b828561194d600184611ec1565b8154811061195d5761195d611f86565b9060005260206000209060020201600101819055506000915050611290565b606061128d848460008585843b6119d55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610640565b600080866001600160a01b031685876040516119f19190611d06565b60006040518083038185875af1925050503d8060008114611a2e576040519150601f19603f3d011682016040523d82523d6000602084013e611a33565b606091505b5091509150611a43828286611a4e565b979650505050505050565b60608315611a5d575081611290565b825115611a6d5782518084602001fd5b8160405162461bcd60e51b81526004016106409190611dd1565b80356001600160a01b0381168114611a9e57600080fd5b919050565b600060208284031215611ab557600080fd5b610a9482611a87565b60008060408385031215611ad157600080fd5b611ada83611a87565b9150611ae860208401611a87565b90509250929050565b600080600060608486031215611b0657600080fd5b611b0f84611a87565b9250611b1d60208501611a87565b9150604084013590509250925092565b60008060008060808587031215611b4357600080fd5b611b4c85611a87565b9350611b5a60208601611a87565b925060408501359150606085013567ffffffffffffffff80821115611b7e57600080fd5b818701915087601f830112611b9257600080fd5b813581811115611ba457611ba4611f9c565b604051601f8201601f19908116603f01168101908382118183101715611bcc57611bcc611f9c565b816040528281528a6020848701011115611be557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611c1c57600080fd5b611c2583611a87565b91506020830135611c3581611fb2565b809150509250929050565b60008060408385031215611c5357600080fd5b611c5c83611a87565b946020939093013593505050565b600060208284031215611c7c57600080fd5b815161129081611fb2565b600060208284031215611c9957600080fd5b813561129081611fc3565b600060208284031215611cb657600080fd5b815161129081611fc3565b600060208284031215611cd357600080fd5b5035919050565b60008151808452611cf2816020860160208601611ed8565b601f01601f19169290920160200192915050565b60008251611d18818460208701611ed8565b9190910192915050565b60008351611d34818460208801611ed8565b835190830190611d48818360208801611ed8565b01949350505050565b60008451611d63818460208901611ed8565b845190830190611d77818360208901611ed8565b8451910190611d8a818360208801611ed8565b0195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611dc790830184611cda565b9695505050505050565b602081526000610a946020830184611cda565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115611e9a57611e9a611f5a565b500190565b600082611ebc57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611ed357611ed3611f5a565b500390565b60005b83811015611ef3578181015183820152602001611edb565b83811115610db75750506000910152565b600181811c90821680611f1857607f821691505b60208210811415611f3957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611f5357611f53611f5a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611fc057600080fd5b50565b6001600160e01b031981168114611fc057600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122091f6c2a1212b28bf2453d1d5489c403918f4efab8a3b9bf3859115ecd245c7bd64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101bb5760003560e01c80636c0360eb116100ec578063a0e23ebd1161008a578063c87b56dd11610064578063c87b56dd146104a7578063d5abeb01146104c7578063e985e9c5146104dd578063fa5047f61461052657600080fd5b8063a0e23ebd14610451578063a22cb46514610467578063b88d4fde1461048757600080fd5b80637c2aa621116100c65780637c2aa621146103e85780638da5cb5b1461040857806395d89b4114610426578063a035b1fe1461043b57600080fd5b80636c0360eb1461039d57806370a08231146103b2578063771282f6146103d257600080fd5b80632f745c591161015957806347535d7b1161013357806347535d7b1461033257806347f992bc146103475780634f6ccce71461035d5780636352211e1461037d57600080fd5b80632f745c59146102dd5780633ccfd60b146102fd57806342842e0e1461031257600080fd5b8063095ea7b311610195578063095ea7b3146102705780631249c58b1461029257806318160ddd1461029a57806323b872dd146102bd57600080fd5b806301ffc9a7146101c757806306fdde0314610216578063081812fc1461023857600080fd5b366101c257005b600080fd5b3480156101d357600080fd5b506102016101e2366004611c87565b6001600160e01b03191660009081526020819052604090205460ff1690565b60405190151581526020015b60405180910390f35b34801561022257600080fd5b5061022b610546565b60405161020d9190611dd1565b34801561024457600080fd5b50610258610253366004611cc1565b6105d8565b6040516001600160a01b03909116815260200161020d565b34801561027c57600080fd5b5061029061028b366004611c40565b610665565b005b61029061077b565b3480156102a657600080fd5b506102af610a30565b60405190815260200161020d565b3480156102c957600080fd5b506102906102d8366004611af1565b610a41565b3480156102e957600080fd5b506102af6102f8366004611c40565b610a72565b34801561030957600080fd5b50610290610a9d565b34801561031e57600080fd5b5061029061032d366004611af1565b610b2a565b34801561033e57600080fd5b50610201610b45565b34801561035357600080fd5b506102af60105481565b34801561036957600080fd5b506102af610378366004611cc1565b610b5c565b34801561038957600080fd5b50610258610398366004611cc1565b610b72565b3480156103a957600080fd5b5061022b610b9a565b3480156103be57600080fd5b506102af6103cd366004611aa3565b610ba9565b3480156103de57600080fd5b506102af600e5481565b3480156103f457600080fd5b50610290610403366004611aa3565b610c35565b34801561041457600080fd5b50600b546001600160a01b0316610258565b34801561043257600080fd5b5061022b610cb1565b34801561044757600080fd5b506102af600c5481565b34801561045d57600080fd5b506102af60115481565b34801561047357600080fd5b50610290610482366004611c09565b610cc0565b34801561049357600080fd5b506102906104a2366004611b2d565b610d85565b3480156104b357600080fd5b5061022b6104c2366004611cc1565b610dbd565b3480156104d357600080fd5b506102af600d5481565b3480156104e957600080fd5b506102016104f8366004611abe565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561053257600080fd5b50600f54610258906001600160a01b031681565b60606006805461055590611f04565b80601f016020809104026020016040519081016040528092919081815260200182805461058190611f04565b80156105ce5780601f106105a3576101008083540402835291602001916105ce565b820191906000526020600020905b8154815290600101906020018083116105b157829003601f168201915b5050505050905090565b60006105e382610f4e565b6106495760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061067082610b72565b9050806001600160a01b0316836001600160a01b031614156106de5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610640565b336001600160a01b03821614806106fa57506106fa81336104f8565b61076c5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610640565b6107768383610f5b565b505050565b6002600a5414156107ce5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610640565b6002600a556107db610b45565b6108275760405162461bcd60e51b815260206004820152601a60248201527f4d696e74696e67206973206e6f742079657420656e61626c65640000000000006044820152606401610640565b34600c5411156108715760405162461bcd60e51b8152602060048201526015602482015274139bdd08195b9bdd59da08115d1a195c881cd95b9d605a1b6044820152606401610640565b6000600c54346108819190611e9f565b9050600d54600e54106108c75760405162461bcd60e51b815260206004820152600e60248201526d135a5b9d1a5b99c818db1bdcd95960921b6044820152606401610640565b6000600e54600d546108d99190611ec1565b9050808211156109425760405162461bcd60e51b815260206004820152602e60248201527f4e6f7420656e6f756768204e46542072656d61696e696e6720666f722074686960448201526d1cc8115d1a195c88185b5bdd5b9d60921b6064820152608401610640565b60005b82811015610a265761095933600e54610fc9565b6002600d546109689190611e9f565b600e5410156109fb57600f5460105460405163a9059cbb60e01b815233600482015260248101919091526001600160a01b039091169063a9059cbb90604401602060405180830381600087803b1580156109c157600080fd5b505af11580156109d5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109f99190611c6a565b505b6001600e6000828254610a0e9190611e87565b90915550819050610a1e81611f3f565b915050610945565b50506001600a5550565b6000610a3c6002610fe3565b905090565b610a4b3382610fed565b610a675760405162461bcd60e51b815260040161064090611e36565b6107768383836110d7565b6001600160a01b0382166000908152600160205260408120610a949083611258565b90505b92915050565b600b546001600160a01b03163314610af75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b6040514790339082156108fc029083906000818181858888f19350505050158015610b26573d6000803e3d6000fd5b5050565b61077683838360405180602001604052806000815250610d85565b60006011544210610b565750600190565b50600090565b600080610b6a600284611264565b509392505050565b6000610a978260405180606001604052806029815260200161200c6029913960029190611280565b60606009805461055590611f04565b60006001600160a01b038216610c145760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610640565b6001600160a01b0382166000908152600160205260409020610a9790610fe3565b600b546001600160a01b03163314610c8f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610640565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b60606007805461055590611f04565b6001600160a01b038216331415610d195760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610640565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b610d8f3383610fed565b610dab5760405162461bcd60e51b815260040161064090611e36565b610db784848484611297565b50505050565b6060610dc882610f4e565b610e2c5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610640565b60008281526008602052604081208054610e4590611f04565b80601f0160208091040260200160405190810160405280929190818152602001828054610e7190611f04565b8015610ebe5780601f10610e9357610100808354040283529160200191610ebe565b820191906000526020600020905b815481529060010190602001808311610ea157829003601f168201915b505050505090506000610ecf610b9a565b9050805160001415610ee2575092915050565b815115610f14578082604051602001610efc929190611d22565b60405160208183030381529060405292505050919050565b80610f1e856112ca565b60405180604001604052806005815260200164173539b7b760d91b815250604051602001610efc93929190611d51565b6000610a976002836113ab565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190610f9082610b72565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b610b268282604051806020016040528060008152506113c3565b6000610a97825490565b6000610ff882610f4e565b6110595760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610640565b600061106483610b72565b9050806001600160a01b0316846001600160a01b0316148061109f5750836001600160a01b0316611094846105d8565b6001600160a01b0316145b806110cf57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166110ea82610b72565b6001600160a01b0316146111525760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610640565b6001600160a01b0382166111b45760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610640565b6111bf600082610f5b565b6001600160a01b03831660009081526001602052604090206111e190826113f6565b506001600160a01b03821660009081526001602052604090206112049082611402565b506112116002828461140e565b5080826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000610a948383611424565b600080808061127386866114aa565b9097909650945050505050565b600061128d848484611547565b90505b9392505050565b6112a28484846110d7565b6112ae848484846115b0565b610db75760405162461bcd60e51b815260040161064090611de4565b6060816112ee5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561130657600101600a820491506112f2565b60008167ffffffffffffffff81111561132157611321611f9c565b6040519080825280601f01601f19166020018201604052801561134b576020820181803683370190505b50859350905060001982015b83156113a257600a840660300160f81b8282806001900393508151811061138057611380611f86565b60200101906001600160f81b031916908160001a905350600a84049350611357565b50949350505050565b60008181526001830160205260408120541515610a94565b6113cd8383611681565b6113da60008484846115b0565b6107765760405162461bcd60e51b815260040161064090611de4565b6000610a948383611799565b6000610a94838361188c565b600061128d84846001600160a01b0385166118db565b815460009082106114825760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610640565b82600001828154811061149757611497611f86565b9060005260206000200154905092915050565b81546000908190831061150a5760405162461bcd60e51b815260206004820152602260248201527f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610640565b600084600001848154811061152157611521611f86565b906000526020600020906002020190508060000154816001015492509250509250929050565b600082815260018401602052604081205482816115775760405162461bcd60e51b81526004016106409190611dd1565b5084611584600183611ec1565b8154811061159457611594611f86565b9060005260206000209060020201600101549150509392505050565b60006001600160a01b0384163b6115c9575060016110cf565b600061164a630a85bd0160e11b338887876040516024016115ed9493929190611d94565b604051602081830303815290604052906001600160e01b0319166020820180516001600160e01b038381831617835250505050604051806060016040528060328152602001611fda603291396001600160a01b038816919061197c565b90506000818060200190518101906116629190611ca4565b6001600160e01b031916630a85bd0160e11b1492505050949350505050565b6001600160a01b0382166116d75760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610640565b6116e081610f4e565b1561172d5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610640565b6001600160a01b038216600090815260016020526040902061174f9082611402565b5061175c6002828461140e565b5060405181906001600160a01b038416906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600081815260018301602052604081205480156118825760006117bd600183611ec1565b85549091506000906117d190600190611ec1565b905060008660000182815481106117ea576117ea611f86565b906000526020600020015490508087600001848154811061180d5761180d611f86565b600091825260209091200155611824836001611e87565b6000828152600189016020526040902055865487908061184657611846611f70565b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050610a97565b6000915050610a97565b60008181526001830160205260408120546118d357508154600181810184556000848152602080822090930184905584548482528286019093526040902091909155610a97565b506000610a97565b600082815260018401602052604081205480611940575050604080518082018252838152602080820184815286546001818101895560008981528481209551600290930290950191825591519082015586548684528188019092529290912055611290565b828561194d600184611ec1565b8154811061195d5761195d611f86565b9060005260206000209060020201600101819055506000915050611290565b606061128d848460008585843b6119d55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610640565b600080866001600160a01b031685876040516119f19190611d06565b60006040518083038185875af1925050503d8060008114611a2e576040519150601f19603f3d011682016040523d82523d6000602084013e611a33565b606091505b5091509150611a43828286611a4e565b979650505050505050565b60608315611a5d575081611290565b825115611a6d5782518084602001fd5b8160405162461bcd60e51b81526004016106409190611dd1565b80356001600160a01b0381168114611a9e57600080fd5b919050565b600060208284031215611ab557600080fd5b610a9482611a87565b60008060408385031215611ad157600080fd5b611ada83611a87565b9150611ae860208401611a87565b90509250929050565b600080600060608486031215611b0657600080fd5b611b0f84611a87565b9250611b1d60208501611a87565b9150604084013590509250925092565b60008060008060808587031215611b4357600080fd5b611b4c85611a87565b9350611b5a60208601611a87565b925060408501359150606085013567ffffffffffffffff80821115611b7e57600080fd5b818701915087601f830112611b9257600080fd5b813581811115611ba457611ba4611f9c565b604051601f8201601f19908116603f01168101908382118183101715611bcc57611bcc611f9c565b816040528281528a6020848701011115611be557600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b60008060408385031215611c1c57600080fd5b611c2583611a87565b91506020830135611c3581611fb2565b809150509250929050565b60008060408385031215611c5357600080fd5b611c5c83611a87565b946020939093013593505050565b600060208284031215611c7c57600080fd5b815161129081611fb2565b600060208284031215611c9957600080fd5b813561129081611fc3565b600060208284031215611cb657600080fd5b815161129081611fc3565b600060208284031215611cd357600080fd5b5035919050565b60008151808452611cf2816020860160208601611ed8565b601f01601f19169290920160200192915050565b60008251611d18818460208701611ed8565b9190910192915050565b60008351611d34818460208801611ed8565b835190830190611d48818360208801611ed8565b01949350505050565b60008451611d63818460208901611ed8565b845190830190611d77818360208901611ed8565b8451910190611d8a818360208801611ed8565b0195945050505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090611dc790830184611cda565b9695505050505050565b602081526000610a946020830184611cda565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60008219821115611e9a57611e9a611f5a565b500190565b600082611ebc57634e487b7160e01b600052601260045260246000fd5b500490565b600082821015611ed357611ed3611f5a565b500390565b60005b83811015611ef3578181015183820152602001611edb565b83811115610db75750506000910152565b600181811c90821680611f1857607f821691505b60208210811415611f3957634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415611f5357611f53611f5a565b5060010190565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b8015158114611fc057600080fd5b50565b6001600160e01b031981168114611fc057600080fdfe4552433732313a207472616e7366657220746f206e6f6e20455243373231526563656976657220696d706c656d656e7465724552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122091f6c2a1212b28bf2453d1d5489c403918f4efab8a3b9bf3859115ecd245c7bd64736f6c63430008070033

Deployed Bytecode Sourcemap

115:1394:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15527:139:0;;;;;;;;;;-1:-1:-1;15527:139:0;;;;;:::i;:::-;-1:-1:-1;;;;;;15629:33:0;15612:4;15629:33;;;;;;;;;;;;;;15527:139;;;;6712:14:2;;6705:22;6687:41;;6675:2;6660:18;15527:139:0;;;;;;;;18899:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;20438:201::-;;;;;;;;;;-1:-1:-1;20438:201:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;5491:32:2;;;5473:51;;5461:2;5446:18;20438:201:0;5327:203:2;20084:351:0;;;;;;;;;;-1:-1:-1;20084:351:0;;;;;:::i;:::-;;:::i;:::-;;637:592:1;;;:::i;19818:106:0:-;;;;;;;;;;;;;:::i;:::-;;;16068:25:2;;;16056:2;16041:18;19818:106:0;15922:177:2;21069:232:0;;;;;;;;;;-1:-1:-1;21069:232:0;;;;;:::i;:::-;;:::i;19664:151::-;;;;;;;;;;-1:-1:-1;19664:151:0;;;;;:::i;:::-;;:::i;1232:125:1:-;;;;;;;;;;;;;:::i;21304:140:0:-;;;;;;;;;;-1:-1:-1;21304:140:0;;;;;:::i;:::-;;:::i;514:120:1:-;;;;;;;;;;;;;:::i;318:50::-;;;;;;;;;;;;;;;;19927:154:0;;;;;;;;;;-1:-1:-1;19927:154:0;;;;;:::i;:::-;;:::i;18730:166::-;;;;;;;;;;-1:-1:-1;18730:166:0;;;;;:::i;:::-;;:::i;19575:86::-;;;;;;;;;;;;;:::i;18524:203::-;;;;;;;;;;-1:-1:-1;18524:203:0;;;;;:::i;:::-;;:::i;249:32:1:-;;;;;;;;;;;;;;;;1360:115;;;;;;;;;;-1:-1:-1;1360:115:1;;;;;:::i;:::-;;:::i;1885:84:0:-;;;;;;;;;;-1:-1:-1;1959:6:0;;-1:-1:-1;;;;;1959:6:0;1885:84;;18991:93;;;;;;;;;;;;;:::i;171:41:1:-;;;;;;;;;;;;;;;;371:34;;;;;;;;;;;;;;;;20642:268:0;;;;;;;;;;-1:-1:-1;20642:268:0;;;;;:::i;:::-;;:::i;21447:267::-;;;;;;;;;;-1:-1:-1;21447:267:0;;;;;:::i;:::-;;:::i;19087:485::-;;;;;;;;;;-1:-1:-1;19087:485:0;;;;;:::i;:::-;;:::i;215:31:1:-;;;;;;;;;;;;;;;;20913:153:0;;;;;;;;;;-1:-1:-1;20913:153:0;;;;;:::i;:::-;-1:-1:-1;;;;;21027:25:0;;;21010:4;21027:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;20913:153;284:31:1;;;;;;;;;;-1:-1:-1;284:31:1;;;;-1:-1:-1;;;;;284:31:1;;;18899:89:0;18953:13;18979:5;18972:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18899:89;:::o;20438:201::-;20514:7;20535:16;20543:7;20535;:16::i;:::-;20527:73;;;;-1:-1:-1;;;20527:73:0;;12986:2:2;20527:73:0;;;12968:21:2;13025:2;13005:18;;;12998:30;13064:34;13044:18;;;13037:62;-1:-1:-1;;;13115:18:2;;;13108:42;13167:19;;20527:73:0;;;;;;;;;-1:-1:-1;20611:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;20611:24:0;;20438:201::o;20084:351::-;20158:13;20174:23;20189:7;20174:14;:23::i;:::-;20158:39;;20215:5;-1:-1:-1;;;;;20209:11:0;:2;-1:-1:-1;;;;;20209:11:0;;;20201:57;;;;-1:-1:-1;;;20201:57:0;;14586:2:2;20201:57:0;;;14568:21:2;14625:2;14605:18;;;14598:30;14664:34;14644:18;;;14637:62;-1:-1:-1;;;14715:18:2;;;14708:31;14756:19;;20201:57:0;14384:397:2;20201:57:0;209:10;-1:-1:-1;;;;;20270:21:0;;;;:69;;-1:-1:-1;20295:44:0;20319:5;209:10;20913:153;:::i;20295:44::-;20262:144;;;;-1:-1:-1;;;20262:144:0;;11386:2:2;20262:144:0;;;11368:21:2;11425:2;11405:18;;;11398:30;11464:34;11444:18;;;11437:62;11535:26;11515:18;;;11508:54;11579:19;;20262:144:0;11184:420:2;20262:144:0;20410:21;20419:2;20423:7;20410:8;:21::i;:::-;20154:281;20084:351;;:::o;637:592:1:-;2554:1:0;2668:7;;:19;;2660:63;;;;-1:-1:-1;;;2660:63:0;;15764:2:2;2660:63:0;;;15746:21:2;15803:2;15783:18;;;15776:30;15842:33;15822:18;;;15815:61;15893:18;;2660:63:0;15562:355:2;2660:63:0;2554:1;2727:7;:18;693:8:1::1;:6;:8::i;:::-;685:47;;;::::0;-1:-1:-1;;;685:47:1;;9452:2:2;685:47:1::1;::::0;::::1;9434:21:2::0;9491:2;9471:18;;;9464:30;9530:28;9510:18;;;9503:56;9576:18;;685:47:1::1;9250:350:2::0;685:47:1::1;753:9;744:5;;:18;;736:52;;;::::0;-1:-1:-1;;;736:52:1;;8326:2:2;736:52:1::1;::::0;::::1;8308:21:2::0;8365:2;8345:18;;;8338:30;-1:-1:-1;;;8384:18:2;;;8377:51;8445:18;;736:52:1::1;8124:345:2::0;736:52:1::1;792:13;818:5;;808:9;:15;;;;:::i;:::-;792:31;;851:9;;835:13;;:25;827:52;;;::::0;-1:-1:-1;;;827:52:1;;7983:2:2;827:52:1::1;::::0;::::1;7965:21:2::0;8022:2;8002:18;;;7995:30;-1:-1:-1;;;8041:18:2;;;8034:44;8095:18;;827:52:1::1;7781:338:2::0;827:52:1::1;883:17;913:13;;903:9;;:23;;;;:::i;:::-;883:43;;947:9;938:5;:18;;930:77;;;::::0;-1:-1:-1;;;930:77:1;;7568:2:2;930:77:1::1;::::0;::::1;7550:21:2::0;7607:2;7587:18;;;7580:30;7646:34;7626:18;;;7619:62;-1:-1:-1;;;7697:18:2;;;7690:44;7751:19;;930:77:1::1;7366:410:2::0;930:77:1::1;1016:9;1011:215;1031:5;1029:1;:7;1011:215;;;1048:36;1058:10;1070:13;;1048:9;:36::i;:::-;1119:1;1109:9;;:11;;;;:::i;:::-;1093:13;;:27;1089:110;;;1134:16;::::0;1173:19:::1;::::0;1128:65:::1;::::0;-1:-1:-1;;;1128:65:1;;1161:10:::1;1128:65;::::0;::::1;6442:51:2::0;6509:18;;;6502:34;;;;-1:-1:-1;;;;;1134:16:1;;::::1;::::0;1128:32:::1;::::0;6415:18:2;;1128:65:1::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;1089:110;1220:1;1203:13;;:18;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;1038:3:1;;-1:-1:-1;1038:3:1::1;::::0;::::1;:::i;:::-;;;;1011:215;;;-1:-1:-1::0;;2514:1:0;2754:7;:22;-1:-1:-1;637:592:1:o;19818:106:0:-;19879:7;19899:21;:12;:19;:21::i;:::-;19892:28;;19818:106;:::o;21069:232::-;21170:41;209:10;21203:7;21170:18;:41::i;:::-;21162:103;;;;-1:-1:-1;;;21162:103:0;;;;;;;:::i;:::-;21269:28;21279:4;21285:2;21289:7;21269:9;:28::i;19664:151::-;-1:-1:-1;;;;;19781:20:0;;19761:7;19781:20;;;:13;:20;;;;;:30;;19805:5;19781:23;:30::i;:::-;19774:37;;19664:151;;;;;:::o;1232:125:1:-;1959:6:0;;-1:-1:-1;;;;;1959:6:0;209:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;13399:2:2;1997:68:0;;;13381:21:2;;;13418:18;;;13411:30;13477:34;13457:18;;;13450:62;13529:18;;1997:68:0;13197:356:2;1997:68:0;1316:37:1::1;::::0;1291:21:::1;::::0;1324:10:::1;::::0;1316:37;::::1;;;::::0;1291:21;;1273:15:::1;1316:37:::0;1273:15;1316:37;1291:21;1324:10;1316:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;1269:88;1232:125::o:0;21304:140:0:-;21401:39;21418:4;21424:2;21428:7;21401:39;;;;;;;;;;;;:16;:39::i;514:120:1:-;553:4;586:6;;567:15;:25;563:52;;-1:-1:-1;606:4:1;;514:120::o;563:52::-;-1:-1:-1;625:5:1;;514:120::o;19927:154:0:-;20002:7;;20037:22;:12;20053:5;20037:15;:22::i;:::-;-1:-1:-1;20015:44:0;19927:154;-1:-1:-1;;;19927:154:0:o;18730:166::-;18802:7;18822:70;18839:7;18822:70;;;;;;;;;;;;;;;;;:12;;:70;:16;:70::i;19575:86::-;19623:13;19649:8;19642:15;;;;;:::i;18524:203::-;18596:7;-1:-1:-1;;;;;18617:19:0;;18609:74;;;;-1:-1:-1;;;18609:74:0;;11811:2:2;18609:74:0;;;11793:21:2;11850:2;11830:18;;;11823:30;11889:34;11869:18;;;11862:62;-1:-1:-1;;;11940:18:2;;;11933:40;11990:19;;18609:74:0;11609:406:2;18609:74:0;-1:-1:-1;;;;;18694:20:0;;;;;;:13;:20;;;;;:29;;:27;:29::i;1360:115:1:-;1959:6:0;;-1:-1:-1;;;;;1959:6:0;209:10;2005:23;1997:68;;;;-1:-1:-1;;;1997:68:0;;13399:2:2;1997:68:0;;;13381:21:2;;;13418:18;;;13411:30;13477:34;13457:18;;;13450:62;13529:18;;1997:68:0;13197:356:2;1997:68:0;1437:16:1::1;:34:::0;;-1:-1:-1;;;;;;1437:34:1::1;-1:-1:-1::0;;;;;1437:34:1;;;::::1;::::0;;;::::1;::::0;;1360:115::o;18991:93:0:-;19047:13;19073:7;19066:14;;;;;:::i;20642:268::-;-1:-1:-1;;;;;20738:24:0;;209:10;20738:24;;20730:62;;;;-1:-1:-1;;;20730:62:0;;10212:2:2;20730:62:0;;;10194:21:2;10251:2;10231:18;;;10224:30;10290:27;10270:18;;;10263:55;10335:18;;20730:62:0;10010:349:2;20730:62:0;209:10;20796:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;20796:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;20796:53:0;;;;;;;;;;20858:48;;6687:41:2;;;20796:42:0;;209:10;20858:48;;6660:18:2;20858:48:0;;;;;;;20642:268;;:::o;21447:267::-;21572:41;209:10;21605:7;21572:18;:41::i;:::-;21564:103;;;;-1:-1:-1;;;21564:103:0;;;;;;;:::i;:::-;21671:39;21685:4;21691:2;21695:7;21704:5;21671:13;:39::i;:::-;21447:267;;;;:::o;19087:485::-;19160:13;19187:16;19195:7;19187;:16::i;:::-;19179:76;;;;-1:-1:-1;;;19179:76:0;;14170:2:2;19179:76:0;;;14152:21:2;14209:2;14189:18;;;14182:30;14248:34;14228:18;;;14221:62;-1:-1:-1;;;14299:18:2;;;14292:45;14354:19;;19179:76:0;13968:411:2;19179:76:0;19259:23;19285:19;;;:10;:19;;;;;19259:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19308:18;19329:9;:7;:9::i;:::-;19308:30;;19352:4;19346:18;19368:1;19346:23;19342:55;;;-1:-1:-1;19383:9:0;19087:485;-1:-1:-1;;19087:485:0:o;19342:55::-;19404:23;;:27;19400:91;;19469:4;19475:9;19452:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;19438:48;;;;19087:485;;;:::o;19400:91::-;19525:4;19531:18;:7;:16;:18::i;:::-;19551:15;;;;;;;;;;;;;-1:-1:-1;;;19551:15:0;;;19508:59;;;;;;;;;;:::i;21974:116::-;22039:4;22056:30;:12;22078:7;22056:21;:30::i;24749:156::-;24817:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;24817:29:0;-1:-1:-1;;;;;24817:29:0;;;;;;;;:24;;24864:23;24817:24;24864:14;:23::i;:::-;-1:-1:-1;;;;;24855:46:0;;;;;;;;;;;24749:156;;:::o;22426:99::-;22495:26;22505:2;22509:7;22495:26;;;;;;;;;;;;:9;:26::i;6070:112::-;6139:7;6159:19;6167:3;4606:19;;4530:99;22093:330;22186:4;22204:16;22212:7;22204;:16::i;:::-;22196:73;;;;-1:-1:-1;;;22196:73:0;;10973:2:2;22196:73:0;;;10955:21:2;11012:2;10992:18;;;10985:30;11051:34;11031:18;;;11024:62;-1:-1:-1;;;11102:18:2;;;11095:42;11154:19;;22196:73:0;10771:408:2;22196:73:0;22273:13;22289:23;22304:7;22289:14;:23::i;:::-;22273:39;;22335:5;-1:-1:-1;;;;;22324:16:0;:7;-1:-1:-1;;;;;22324:16:0;;:51;;;;22368:7;-1:-1:-1;;;;;22344:31:0;:20;22356:7;22344:11;:20::i;:::-;-1:-1:-1;;;;;22344:31:0;;22324:51;:94;;;-1:-1:-1;;;;;;21027:25:0;;;21010:4;21027:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;22379:39;22316:103;22093:330;-1:-1:-1;;;;22093:330:0:o;23500:459::-;23618:4;-1:-1:-1;;;;;23591:31:0;:23;23606:7;23591:14;:23::i;:::-;-1:-1:-1;;;;;23591:31:0;;23583:85;;;;-1:-1:-1;;;23583:85:0;;13760:2:2;23583:85:0;;;13742:21:2;13799:2;13779:18;;;13772:30;13838:34;13818:18;;;13811:62;-1:-1:-1;;;13889:18:2;;;13882:39;13938:19;;23583:85:0;13558:405:2;23583:85:0;-1:-1:-1;;;;;23680:16:0;;23672:65;;;;-1:-1:-1;;;23672:65:0;;9807:2:2;23672:65:0;;;9789:21:2;9846:2;9826:18;;;9819:30;9885:34;9865:18;;;9858:62;-1:-1:-1;;;9936:18:2;;;9929:34;9980:19;;23672:65:0;9605:400:2;23672:65:0;23784:29;23801:1;23805:7;23784:8;:29::i;:::-;-1:-1:-1;;;;;23817:19:0;;;;;;:13;:19;;;;;:35;;23844:7;23817:26;:35::i;:::-;-1:-1:-1;;;;;;23856:17:0;;;;;;:13;:17;;;;;:30;;23878:7;23856:21;:30::i;:::-;-1:-1:-1;23890:29:0;:12;23907:7;23916:2;23890:16;:29::i;:::-;;23947:7;23943:2;-1:-1:-1;;;;;23928:27:0;23937:4;-1:-1:-1;;;;;23928:27:0;;;;;;;;;;;23500:459;;;:::o;10150:126::-;10221:7;10249:22;10253:3;10265:5;10249:3;:22::i;6185:218::-;6265:7;;;;6318:22;6322:3;6334:5;6318:3;:22::i;:::-;6287:53;;;;-1:-1:-1;6185:218:0;-1:-1:-1;;;;;6185:218:0:o;6796:202::-;6903:7;6947:44;6952:3;6972;6978:12;6947:4;:44::i;:::-;6939:53;-1:-1:-1;6796:202:0;;;;;;:::o;21717:254::-;21824:28;21834:4;21840:2;21844:7;21824:9;:28::i;:::-;21864:48;21887:4;21893:2;21897:7;21906:5;21864:22;:48::i;:::-;21856:111;;;;-1:-1:-1;;;21856:111:0;;;;;;;:::i;2958:452::-;3014:13;3052:10;3048:38;;-1:-1:-1;;3070:10:0;;;;;;;;;;;;-1:-1:-1;;;3070:10:0;;;;;2958:452::o;3048:38::-;3105:5;3090:12;3134:54;3141:9;;3134:54;;3158:8;;3180:2;3172:10;;;;3134:54;;;3192:19;3224:6;3214:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3214:17:0;-1:-1:-1;3274:5:0;;-1:-1:-1;3192:39:0;-1:-1:-1;;;3252:10:0;;3284:93;3291:9;;3284:93;;3351:2;3344:4;:9;3339:2;:14;3326:29;;3308:6;3315:7;;;;;;;3308:15;;;;;;;;:::i;:::-;;;;:47;-1:-1:-1;;;;;3308:47:0;;;;;;;;-1:-1:-1;3369:2:0;3361:10;;;;3284:93;;;-1:-1:-1;3395:6:0;2958:452;-1:-1:-1;;;;2958:452:0:o;5927:140::-;6011:4;4501:17;;;:12;;;:17;;;;;;:22;;6028:35;4413:114;22528:232;22617:18;22623:2;22627:7;22617:5;:18::i;:::-;22647:54;22678:1;22682:2;22686:7;22695:5;22647:22;:54::i;:::-;22639:117;;;;-1:-1:-1;;;22639:117:0;;;;;;;:::i;9777:126::-;9847:4;9864:35;9872:3;9892:5;9864:7;:35::i;9654:120::-;9721:4;9738:32;9743:3;9763:5;9738:4;:32::i;5616:174::-;5705:4;5722:64;5727:3;5747;-1:-1:-1;;;;;5761:23:0;;5722:4;:64::i;8035:186::-;8123:18;;8102:7;;8123:26;-1:-1:-1;8115:73:0;;;;-1:-1:-1;;;8115:73:0;;7165:2:2;8115:73:0;;;7147:21:2;7204:2;7184:18;;;7177:30;7243:34;7223:18;;;7216:62;-1:-1:-1;;;7294:18:2;;;7287:32;7336:19;;8115:73:0;6963:398:2;8115:73:0;8199:3;:11;;8211:5;8199:18;;;;;;;;:::i;:::-;;;;;;;;;8192:25;;8035:186;;;;:::o;4632:253::-;4729:19;;4699:7;;;;4729:27;-1:-1:-1;4721:74:0;;;;-1:-1:-1;;;4721:74:0;;12222:2:2;4721:74:0;;;12204:21:2;12261:2;12241:18;;;12234:30;12300:34;12280:18;;;12273:62;-1:-1:-1;;;12351:18:2;;;12344:32;12393:19;;4721:74:0;12020:398:2;4721:74:0;4800:22;4825:3;:12;;4838:5;4825:19;;;;;;;;:::i;:::-;;;;;;;;;;;4800:44;;4856:5;:10;;;4868:5;:12;;;4848:33;;;;;4632:253;;;;;:::o;5337:231::-;5431:7;5463:17;;;:12;;;:17;;;;;;5507:12;5492:13;5484:36;;;;-1:-1:-1;;;5484:36:0;;;;;;;;:::i;:::-;-1:-1:-1;5531:3:0;5544:12;5555:1;5544:8;:12;:::i;:::-;5531:26;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;;5524:40;;;5337:231;;;;;:::o;24254:492::-;24367:4;-1:-1:-1;;;;;24383:13:0;;10405:20;24378:43;;-1:-1:-1;24412:4:0;24405:11;;24378:43;24424:23;24450:201;-1:-1:-1;;;209:10:0;24563:4;24573:7;24586:5;24466:130;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;-1:-1:-1;;;;;24466:130:0;;;;;;;-1:-1:-1;;;;;24466:130:0;;;;;;;;;;;24450:201;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;24450:15:0;;;:201;:15;:201::i;:::-;24424:227;;24655:13;24682:10;24671:32;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24715:26:0;-1:-1:-1;;;24715:26:0;;-1:-1:-1;;;24254:492:0;;;;;;:::o;22763:350::-;-1:-1:-1;;;;;22836:16:0;;22828:61;;;;-1:-1:-1;;;22828:61:0;;12625:2:2;22828:61:0;;;12607:21:2;;;12644:18;;;12637:30;12703:34;12683:18;;;12676:62;12755:18;;22828:61:0;12423:356:2;22828:61:0;22902:16;22910:7;22902;:16::i;:::-;22901:17;22893:58;;;;-1:-1:-1;;;22893:58:0;;9095:2:2;22893:58:0;;;9077:21:2;9134:2;9114:18;;;9107:30;9173;9153:18;;;9146:58;9221:18;;22893:58:0;8893:352:2;22893:58:0;-1:-1:-1;;;;;23004:17:0;;;;;;:13;:17;;;;;:30;;23026:7;23004:21;:30::i;:::-;-1:-1:-1;23038:29:0;:12;23055:7;23064:2;23038:16;:29::i;:::-;-1:-1:-1;23076:33:0;;23101:7;;-1:-1:-1;;;;;23076:33:0;;;23093:1;;23076:33;;23093:1;;23076:33;22763:350;;:::o;7336:474::-;7402:4;7433:19;;;:12;;;:19;;;;;;7460:15;;7456:351;;7482:21;7506:14;7519:1;7506:10;:14;:::i;:::-;7545:18;;7482:38;;-1:-1:-1;7525:17:0;;7545:22;;7566:1;;7545:22;:::i;:::-;7525:42;;7572:17;7592:3;:11;;7604:9;7592:22;;;;;;;;:::i;:::-;;;;;;;;;7572:42;;7648:9;7619:3;:11;;7631:13;7619:26;;;;;;;;:::i;:::-;;;;;;;;;;:38;7688:17;:13;7704:1;7688:17;:::i;:::-;7662:23;;;;:12;;;:23;;;;;:43;7710:17;;7662:3;;7710:17;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;7739:3;:12;;:19;7752:5;7739:19;;;;;;;;;;;7732:26;;;7770:4;7763:11;;;;;;;;7456:351;7797:5;7790:12;;;;;7107:226;7170:4;4501:17;;;:12;;;:17;;;;;;7180:150;;-1:-1:-1;7213:23:0;;;;;;;;:11;:23;;;;;;;;;;;;;7263:18;;7241:19;;;:12;;;:19;;;;;;:40;;;;7286:11;;7180:150;-1:-1:-1;7320:5:0;7313:12;;3578:349;3654:4;3683:17;;;:12;;;:17;;;;;;3708:13;3704:220;;-1:-1:-1;;3746:38:0;;;;;;;;;;;;;;;;;;3728:57;;;;;;;;:12;:57;;;;;;;;;;;;;;;;;;;;;;;;3810:19;;3790:17;;;:12;;;:17;;;;;;;:39;3834:11;;3704:220;3897:5;3861:3;3874:12;3885:1;3874:8;:12;:::i;:::-;3861:26;;;;;;;;:::i;:::-;;;;;;;;;;;:33;;:41;;;;3914:5;3907:12;;;;;10914:184;11017:12;11042:52;11064:6;11072:4;11078:1;11081:12;11017;10405:20;;11549:60;;;;-1:-1:-1;;;11549:60:0;;15406:2:2;11549:60:0;;;15388:21:2;15445:2;15425:18;;;15418:30;15484:31;15464:18;;;15457:59;15533:18;;11549:60:0;15204:353:2;11549:60:0;11614:12;11628:23;11655:6;-1:-1:-1;;;;;11655:11:0;11675:5;11683:4;11655:33;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;11613:75;;;;11699:52;11717:7;11726:10;11738:12;11699:17;:52::i;:::-;11692:59;11319:436;-1:-1:-1;;;;;;;11319:436:0:o;12818:379::-;12933:12;12955:7;12951:243;;;-1:-1:-1;12976:10:0;12969:17;;12951:243;13006:17;;:21;13002:188;;13080:10;13074:17;13125:15;13112:10;13108:2;13104:19;13097:44;13002:188;13171:12;13164:20;;-1:-1:-1;;;13164:20:0;;;;;;;;:::i;14:173:2:-;82:20;;-1:-1:-1;;;;;131:31:2;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:186::-;251:6;304:2;292:9;283:7;279:23;275:32;272:52;;;320:1;317;310:12;272:52;343:29;362:9;343:29;:::i;383:260::-;451:6;459;512:2;500:9;491:7;487:23;483:32;480:52;;;528:1;525;518:12;480:52;551:29;570:9;551:29;:::i;:::-;541:39;;599:38;633:2;622:9;618:18;599:38;:::i;:::-;589:48;;383:260;;;;;:::o;648:328::-;725:6;733;741;794:2;782:9;773:7;769:23;765:32;762:52;;;810:1;807;800:12;762:52;833:29;852:9;833:29;:::i;:::-;823:39;;881:38;915:2;904:9;900:18;881:38;:::i;:::-;871:48;;966:2;955:9;951:18;938:32;928:42;;648:328;;;;;:::o;981:1138::-;1076:6;1084;1092;1100;1153:3;1141:9;1132:7;1128:23;1124:33;1121:53;;;1170:1;1167;1160:12;1121:53;1193:29;1212:9;1193:29;:::i;:::-;1183:39;;1241:38;1275:2;1264:9;1260:18;1241:38;:::i;:::-;1231:48;;1326:2;1315:9;1311:18;1298:32;1288:42;;1381:2;1370:9;1366:18;1353:32;1404:18;1445:2;1437:6;1434:14;1431:34;;;1461:1;1458;1451:12;1431:34;1499:6;1488:9;1484:22;1474:32;;1544:7;1537:4;1533:2;1529:13;1525:27;1515:55;;1566:1;1563;1556:12;1515:55;1602:2;1589:16;1624:2;1620;1617:10;1614:36;;;1630:18;;:::i;:::-;1705:2;1699:9;1673:2;1759:13;;-1:-1:-1;;1755:22:2;;;1779:2;1751:31;1747:40;1735:53;;;1803:18;;;1823:22;;;1800:46;1797:72;;;1849:18;;:::i;:::-;1889:10;1885:2;1878:22;1924:2;1916:6;1909:18;1964:7;1959:2;1954;1950;1946:11;1942:20;1939:33;1936:53;;;1985:1;1982;1975:12;1936:53;2041:2;2036;2032;2028:11;2023:2;2015:6;2011:15;1998:46;2086:1;2081:2;2076;2068:6;2064:15;2060:24;2053:35;2107:6;2097:16;;;;;;;981:1138;;;;;;;:::o;2124:315::-;2189:6;2197;2250:2;2238:9;2229:7;2225:23;2221:32;2218:52;;;2266:1;2263;2256:12;2218:52;2289:29;2308:9;2289:29;:::i;:::-;2279:39;;2368:2;2357:9;2353:18;2340:32;2381:28;2403:5;2381:28;:::i;:::-;2428:5;2418:15;;;2124:315;;;;;:::o;2444:254::-;2512:6;2520;2573:2;2561:9;2552:7;2548:23;2544:32;2541:52;;;2589:1;2586;2579:12;2541:52;2612:29;2631:9;2612:29;:::i;:::-;2602:39;2688:2;2673:18;;;;2660:32;;-1:-1:-1;;;2444:254:2:o;2703:245::-;2770:6;2823:2;2811:9;2802:7;2798:23;2794:32;2791:52;;;2839:1;2836;2829:12;2791:52;2871:9;2865:16;2890:28;2912:5;2890:28;:::i;2953:245::-;3011:6;3064:2;3052:9;3043:7;3039:23;3035:32;3032:52;;;3080:1;3077;3070:12;3032:52;3119:9;3106:23;3138:30;3162:5;3138:30;:::i;3203:249::-;3272:6;3325:2;3313:9;3304:7;3300:23;3296:32;3293:52;;;3341:1;3338;3331:12;3293:52;3373:9;3367:16;3392:30;3416:5;3392:30;:::i;3457:180::-;3516:6;3569:2;3557:9;3548:7;3544:23;3540:32;3537:52;;;3585:1;3582;3575:12;3537:52;-1:-1:-1;3608:23:2;;3457:180;-1:-1:-1;3457:180:2:o;3642:257::-;3683:3;3721:5;3715:12;3748:6;3743:3;3736:19;3764:63;3820:6;3813:4;3808:3;3804:14;3797:4;3790:5;3786:16;3764:63;:::i;:::-;3881:2;3860:15;-1:-1:-1;;3856:29:2;3847:39;;;;3888:4;3843:50;;3642:257;-1:-1:-1;;3642:257:2:o;3904:274::-;4033:3;4071:6;4065:13;4087:53;4133:6;4128:3;4121:4;4113:6;4109:17;4087:53;:::i;:::-;4156:16;;;;;3904:274;-1:-1:-1;;3904:274:2:o;4183:470::-;4362:3;4400:6;4394:13;4416:53;4462:6;4457:3;4450:4;4442:6;4438:17;4416:53;:::i;:::-;4532:13;;4491:16;;;;4554:57;4532:13;4491:16;4588:4;4576:17;;4554:57;:::i;:::-;4627:20;;4183:470;-1:-1:-1;;;;4183:470:2:o;4658:664::-;4885:3;4923:6;4917:13;4939:53;4985:6;4980:3;4973:4;4965:6;4961:17;4939:53;:::i;:::-;5055:13;;5014:16;;;;5077:57;5055:13;5014:16;5111:4;5099:17;;5077:57;:::i;:::-;5201:13;;5156:20;;;5223:57;5201:13;5156:20;5257:4;5245:17;;5223:57;:::i;:::-;5296:20;;4658:664;-1:-1:-1;;;;;4658:664:2:o;5759:504::-;-1:-1:-1;;;;;6044:15:2;;;6026:34;;6096:15;;6091:2;6076:18;;6069:43;6143:2;6128:18;;6121:34;;;6191:3;6186:2;6171:18;;6164:31;;;5969:4;;6212:45;;6237:19;;6229:6;6212:45;:::i;:::-;6204:53;5759:504;-1:-1:-1;;;;;;5759:504:2:o;6739:219::-;6888:2;6877:9;6870:21;6851:4;6908:44;6948:2;6937:9;6933:18;6925:6;6908:44;:::i;8474:414::-;8676:2;8658:21;;;8715:2;8695:18;;;8688:30;8754:34;8749:2;8734:18;;8727:62;-1:-1:-1;;;8820:2:2;8805:18;;8798:48;8878:3;8863:19;;8474:414::o;14786:413::-;14988:2;14970:21;;;15027:2;15007:18;;;15000:30;15066:34;15061:2;15046:18;;15039:62;-1:-1:-1;;;15132:2:2;15117:18;;15110:47;15189:3;15174:19;;14786:413::o;16104:128::-;16144:3;16175:1;16171:6;16168:1;16165:13;16162:39;;;16181:18;;:::i;:::-;-1:-1:-1;16217:9:2;;16104:128::o;16237:217::-;16277:1;16303;16293:132;;16347:10;16342:3;16338:20;16335:1;16328:31;16382:4;16379:1;16372:15;16410:4;16407:1;16400:15;16293:132;-1:-1:-1;16439:9:2;;16237:217::o;16459:125::-;16499:4;16527:1;16524;16521:8;16518:34;;;16532:18;;:::i;:::-;-1:-1:-1;16569:9:2;;16459:125::o;16589:258::-;16661:1;16671:113;16685:6;16682:1;16679:13;16671:113;;;16761:11;;;16755:18;16742:11;;;16735:39;16707:2;16700:10;16671:113;;;16802:6;16799:1;16796:13;16793:48;;;-1:-1:-1;;16837:1:2;16819:16;;16812:27;16589:258::o;16852:380::-;16931:1;16927:12;;;;16974;;;16995:61;;17049:4;17041:6;17037:17;17027:27;;16995:61;17102:2;17094:6;17091:14;17071:18;17068:38;17065:161;;;17148:10;17143:3;17139:20;17136:1;17129:31;17183:4;17180:1;17173:15;17211:4;17208:1;17201:15;17065:161;;16852:380;;;:::o;17237:135::-;17276:3;-1:-1:-1;;17297:17:2;;17294:43;;;17317:18;;:::i;:::-;-1:-1:-1;17364:1:2;17353:13;;17237:135::o;17377:127::-;17438:10;17433:3;17429:20;17426:1;17419:31;17469:4;17466:1;17459:15;17493:4;17490:1;17483:15;17641:127;17702:10;17697:3;17693:20;17690:1;17683:31;17733:4;17730:1;17723:15;17757:4;17754:1;17747:15;17773:127;17834:10;17829:3;17825:20;17822:1;17815:31;17865:4;17862:1;17855:15;17889:4;17886:1;17879:15;17905:127;17966:10;17961:3;17957:20;17954:1;17947:31;17997:4;17994:1;17987:15;18021:4;18018:1;18011:15;18037:118;18123:5;18116:13;18109:21;18102:5;18099:32;18089:60;;18145:1;18142;18135:12;18089:60;18037:118;:::o;18160:131::-;-1:-1:-1;;;;;;18234:32:2;;18224:43;;18214:71;;18281:1;18278;18271:12

Swarm Source

ipfs://91f6c2a1212b28bf2453d1d5489c403918f4efab8a3b9bf3859115ecd245c7bd
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.