ETH Price: $3,860.57 (-1.66%)

RareApepeYachtClub (RAYC)
 

Overview

TokenID

5758

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Rare Apepes is a derivative nod to two of NFT culture's most iconic works: @BoredApeYC and #RarePepes (unaffiliated). Designed by @rare_labs. This is the intersection of NFTs, Meme, and Culture.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
RAYC

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU GPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-03-05
*/

// File: hardhat/console.sol


pragma solidity >= 0.4.22 <0.9.0;

library console {
	address constant CONSOLE_ADDRESS = address(0x000000000000000000636F6e736F6c652e6c6f67);

	function _sendLogPayload(bytes memory payload) private view {
		uint256 payloadLength = payload.length;
		address consoleAddress = CONSOLE_ADDRESS;
		assembly {
			let payloadStart := add(payload, 32)
			let r := staticcall(gas(), consoleAddress, payloadStart, payloadLength, 0, 0)
		}
	}

	function log() internal view {
		_sendLogPayload(abi.encodeWithSignature("log()"));
	}

	function logInt(int p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int)", p0));
	}

	function logUint(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function logString(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function logBool(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function logAddress(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function logBytes(bytes memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes)", p0));
	}

	function logBytes1(bytes1 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes1)", p0));
	}

	function logBytes2(bytes2 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes2)", p0));
	}

	function logBytes3(bytes3 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes3)", p0));
	}

	function logBytes4(bytes4 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes4)", p0));
	}

	function logBytes5(bytes5 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes5)", p0));
	}

	function logBytes6(bytes6 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes6)", p0));
	}

	function logBytes7(bytes7 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes7)", p0));
	}

	function logBytes8(bytes8 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes8)", p0));
	}

	function logBytes9(bytes9 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes9)", p0));
	}

	function logBytes10(bytes10 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes10)", p0));
	}

	function logBytes11(bytes11 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes11)", p0));
	}

	function logBytes12(bytes12 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes12)", p0));
	}

	function logBytes13(bytes13 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes13)", p0));
	}

	function logBytes14(bytes14 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes14)", p0));
	}

	function logBytes15(bytes15 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes15)", p0));
	}

	function logBytes16(bytes16 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes16)", p0));
	}

	function logBytes17(bytes17 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes17)", p0));
	}

	function logBytes18(bytes18 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes18)", p0));
	}

	function logBytes19(bytes19 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes19)", p0));
	}

	function logBytes20(bytes20 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes20)", p0));
	}

	function logBytes21(bytes21 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes21)", p0));
	}

	function logBytes22(bytes22 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes22)", p0));
	}

	function logBytes23(bytes23 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes23)", p0));
	}

	function logBytes24(bytes24 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes24)", p0));
	}

	function logBytes25(bytes25 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes25)", p0));
	}

	function logBytes26(bytes26 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes26)", p0));
	}

	function logBytes27(bytes27 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes27)", p0));
	}

	function logBytes28(bytes28 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes28)", p0));
	}

	function logBytes29(bytes29 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes29)", p0));
	}

	function logBytes30(bytes30 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes30)", p0));
	}

	function logBytes31(bytes31 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes31)", p0));
	}

	function logBytes32(bytes32 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bytes32)", p0));
	}

	function log(uint p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint)", p0));
	}

	function log(string memory p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string)", p0));
	}

	function log(bool p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool)", p0));
	}

	function log(address p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address)", p0));
	}

	function log(uint p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint)", p0, p1));
	}

	function log(uint p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string)", p0, p1));
	}

	function log(uint p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool)", p0, p1));
	}

	function log(uint p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address)", p0, p1));
	}

	function log(string memory p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint)", p0, p1));
	}

	function log(string memory p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string)", p0, p1));
	}

	function log(string memory p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool)", p0, p1));
	}

	function log(string memory p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address)", p0, p1));
	}

	function log(bool p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint)", p0, p1));
	}

	function log(bool p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string)", p0, p1));
	}

	function log(bool p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool)", p0, p1));
	}

	function log(bool p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address)", p0, p1));
	}

	function log(address p0, uint p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint)", p0, p1));
	}

	function log(address p0, string memory p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string)", p0, p1));
	}

	function log(address p0, bool p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool)", p0, p1));
	}

	function log(address p0, address p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address)", p0, p1));
	}

	function log(uint p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint)", p0, p1, p2));
	}

	function log(uint p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string)", p0, p1, p2));
	}

	function log(uint p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool)", p0, p1, p2));
	}

	function log(uint p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool)", p0, p1, p2));
	}

	function log(uint p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address)", p0, p1, p2));
	}

	function log(uint p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint)", p0, p1, p2));
	}

	function log(uint p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string)", p0, p1, p2));
	}

	function log(uint p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool)", p0, p1, p2));
	}

	function log(uint p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address)", p0, p1, p2));
	}

	function log(uint p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint)", p0, p1, p2));
	}

	function log(uint p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string)", p0, p1, p2));
	}

	function log(uint p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool)", p0, p1, p2));
	}

	function log(uint p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool)", p0, p1, p2));
	}

	function log(string memory p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool)", p0, p1, p2));
	}

	function log(string memory p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool)", p0, p1, p2));
	}

	function log(string memory p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address)", p0, p1, p2));
	}

	function log(string memory p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint)", p0, p1, p2));
	}

	function log(string memory p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string)", p0, p1, p2));
	}

	function log(string memory p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool)", p0, p1, p2));
	}

	function log(string memory p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address)", p0, p1, p2));
	}

	function log(bool p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint)", p0, p1, p2));
	}

	function log(bool p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string)", p0, p1, p2));
	}

	function log(bool p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool)", p0, p1, p2));
	}

	function log(bool p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool)", p0, p1, p2));
	}

	function log(bool p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address)", p0, p1, p2));
	}

	function log(bool p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint)", p0, p1, p2));
	}

	function log(bool p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string)", p0, p1, p2));
	}

	function log(bool p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool)", p0, p1, p2));
	}

	function log(bool p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address)", p0, p1, p2));
	}

	function log(bool p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint)", p0, p1, p2));
	}

	function log(bool p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string)", p0, p1, p2));
	}

	function log(bool p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool)", p0, p1, p2));
	}

	function log(bool p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address)", p0, p1, p2));
	}

	function log(address p0, uint p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint)", p0, p1, p2));
	}

	function log(address p0, uint p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string)", p0, p1, p2));
	}

	function log(address p0, uint p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool)", p0, p1, p2));
	}

	function log(address p0, uint p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address)", p0, p1, p2));
	}

	function log(address p0, string memory p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint)", p0, p1, p2));
	}

	function log(address p0, string memory p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string)", p0, p1, p2));
	}

	function log(address p0, string memory p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool)", p0, p1, p2));
	}

	function log(address p0, string memory p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address)", p0, p1, p2));
	}

	function log(address p0, bool p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint)", p0, p1, p2));
	}

	function log(address p0, bool p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string)", p0, p1, p2));
	}

	function log(address p0, bool p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool)", p0, p1, p2));
	}

	function log(address p0, bool p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address)", p0, p1, p2));
	}

	function log(address p0, address p1, uint p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint)", p0, p1, p2));
	}

	function log(address p0, address p1, string memory p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string)", p0, p1, p2));
	}

	function log(address p0, address p1, bool p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool)", p0, p1, p2));
	}

	function log(address p0, address p1, address p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address)", p0, p1, p2));
	}

	function log(uint p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,uint,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,string,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,bool,address,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,uint,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,string,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,bool,address)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,uint)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,string)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,bool)", p0, p1, p2, p3));
	}

	function log(uint p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint,address,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,address)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,string)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,bool)", p0, p1, p2, p3));
	}

	function log(string memory p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,address)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,string)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,bool)", p0, p1, p2, p3));
	}

	function log(bool p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, uint p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, string memory p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, bool p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, uint p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, string memory p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, bool p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,address)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, uint p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, string memory p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,string)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, bool p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,bool)", p0, p1, p2, p3));
	}

	function log(address p0, address p1, address p2, address p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,address)", p0, p1, p2, p3));
	}

}

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


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

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) {
        return msg.data;
    }
}

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

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}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

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


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

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

// File: contracts/RAYC.sol



pragma solidity >=0.7.0 <0.9.0;





// contract by @kntrvlr

contract RAYC is ERC721Enumerable, Ownable {
  using Strings for uint256;

  string public baseURI;
  string public baseExtension = ".json";
  uint256 public cost = 0.05 ether;
  uint256 public maxSupply = 10000;
  uint256 public maxMintAmount = 20;
  bool public saleIsActive = true;
  address public payoutAddress = 0xa7Ed357b43C364BbCE59434cFcDf0245b70e3EfA;
  uint256 public publicSaleStart;

  constructor(
    string memory _name,
    string memory _symbol,
    string memory _initBaseURI,
    uint256 _publicSaleStart
  ) ERC721(_name, _symbol) {
    setBaseURI(_initBaseURI);
    setPublicSaleStart(_publicSaleStart);
    mint(msg.sender, 10);
  }

  function _baseURI() internal view virtual override returns (string memory) {
    return baseURI;
  }
 
  function mint(address _to, uint256 _mintAmount) public payable {
    uint256 supply = totalSupply();
    if (msg.sender != owner()) {
        require(saleIsActive, "Not yet active.");
        require(msg.value >= cost * _mintAmount, "Sold out.");
        require(block.timestamp >= publicSaleStart, "Not started");
    }
    require(_mintAmount > 0);
    require(_mintAmount <= maxMintAmount);
    require(supply + _mintAmount <= maxSupply);

    for (uint256 i = 0; i <= _mintAmount - 1; i++) {
      _safeMint(_to, supply + i);
    }
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory tokenIds = new uint256[](ownerTokenCount);
    for (uint256 i; i < ownerTokenCount; i++) {
      tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
    }
    return tokenIds;
  }

  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

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

  function setPublicSaleStart(uint256 _timestamp) public onlyOwner {
    publicSaleStart = _timestamp;
  }

  function setCost(uint256 _newCost) public onlyOwner {
    cost = _newCost;
  }

  function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner {
    maxMintAmount = _newmaxMintAmount;
  }

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

  function setBaseExtension(string memory _newBaseExtension) public onlyOwner {
    baseExtension = _newBaseExtension;
  }

  function setSaleIsActive(bool _state) public onlyOwner {
    saleIsActive = _state;
  }

  function withdraw() public payable onlyOwner {
    // =============================================================================
    (bool os, ) = payable(payoutAddress).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","type":"string"},{"internalType":"uint256","name":"_publicSaleStart","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"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":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","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":"payoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"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":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_timestamp","type":"uint256"}],"name":"setPublicSaleStart","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setSaleIsActive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","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":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000fa7565b5066b1a2bc2ec50000600d55612710600e556014600f556001601060006101000a81548160ff02191690831515021790555073a7ed357b43c364bbce59434cfcdf0245b70e3efa601060016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550348015620000e557600080fd5b5060405162005fa438038062005fa483398181016040528101906200010b919062001135565b838381600090805190602001906200012592919062000fa7565b5080600190805190602001906200013e92919062000fa7565b5050506200016162000155620001a060201b60201c565b620001a860201b60201c565b62000172826200026e60201b60201c565b62000183816200031960201b60201c565b6200019633600a620003b260201b60201c565b5050505062001aba565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200027e620001a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002a46200058860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002f490620014bf565b60405180910390fd5b80600b90805190602001906200031592919062000fa7565b5050565b62000329620001a060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200034f6200058860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620003a8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039f90620014bf565b60405180910390fd5b8060118190555050565b6000620003c4620005b260201b60201c565b9050620003d66200058860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614620004f957601060009054906101000a900460ff166200045b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200045290620013f3565b60405180910390fd5b81600d546200046b9190620015ec565b341015620004b0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004a790620014e1565b60405180910390fd5b601154421015620004f8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ef9062001415565b60405180910390fd5b5b600082116200050757600080fd5b600f548211156200051757600080fd5b600e5482826200052891906200158f565b11156200053457600080fd5b60005b6001836200054691906200164d565b811162000582576200056c8482846200056091906200158f565b620005bf60201b60201c565b8080620005799062001794565b91505062000537565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600880549050905090565b620005e1828260405180602001604052806000815250620005e560201b60201c565b5050565b620005f783836200065360201b60201c565b6200060c60008484846200083960201b60201c565b6200064e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006459062001437565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006c6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006bd906200149d565b60405180910390fd5b620006d781620009f360201b60201c565b156200071a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007119062001459565b60405180910390fd5b6200072e6000838362000a5f60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200078091906200158f565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008678473ffffffffffffffffffffffffffffffffffffffff1662000ba660201b62001a3c1760201c565b15620009e6578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000899620001a060201b60201c565b8786866040518563ffffffff1660e01b8152600401620008bd94939291906200139f565b602060405180830381600087803b158015620008d857600080fd5b505af19250505080156200090c57506040513d601f19601f8201168201806040525081019062000909919062001103565b60015b62000995573d80600081146200093f576040519150601f19603f3d011682016040523d82523d6000602084013e62000944565b606091505b506000815114156200098d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009849062001437565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620009eb565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000a7783838362000bb960201b62001a4f1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000ac45762000abe8162000bbe60201b60201c565b62000b0c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000b0b5762000b0a838262000c0760201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000b595762000b538162000d8460201b60201c565b62000ba1565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000ba05762000b9f828262000e6060201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000c218462000eec60201b620013cf1760201c565b62000c2d91906200164d565b905060006007600084815260200190815260200160002054905081811462000d13576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000d9a91906200164d565b905060006009600084815260200190815260200160002054905060006008838154811062000dcd5762000dcc6200186f565b5b90600052602060002001549050806008838154811062000df25762000df16200186f565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000e445762000e4362001840565b5b6001900381819060005260206000200160009055905550505050565b600062000e788362000eec60201b620013cf1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000f60576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000f57906200147b565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000fb59062001728565b90600052602060002090601f01602090048101928262000fd9576000855562001025565b82601f1062000ff457805160ff191683800117855562001025565b8280016001018555821562001025579182015b828111156200102457825182559160200191906001019062001007565b5b50905062001034919062001038565b5090565b5b808211156200105357600081600090555060010162001039565b5090565b60006200106e62001068846200152c565b62001503565b9050828152602081018484840111156200108d576200108c620018d2565b5b6200109a848285620016f2565b509392505050565b600081519050620010b38162001a86565b92915050565b600082601f830112620010d157620010d0620018cd565b5b8151620010e384826020860162001057565b91505092915050565b600081519050620010fd8162001aa0565b92915050565b6000602082840312156200111c576200111b620018dc565b5b60006200112c84828501620010a2565b91505092915050565b60008060008060808587031215620011525762001151620018dc565b5b600085015167ffffffffffffffff811115620011735762001172620018d7565b5b6200118187828801620010b9565b945050602085015167ffffffffffffffff811115620011a557620011a4620018d7565b5b620011b387828801620010b9565b935050604085015167ffffffffffffffff811115620011d757620011d6620018d7565b5b620011e587828801620010b9565b9250506060620011f887828801620010ec565b91505092959194509250565b6200120f8162001688565b82525050565b6000620012228262001562565b6200122e81856200156d565b935062001240818560208601620016f2565b6200124b81620018e1565b840191505092915050565b600062001265600f836200157e565b91506200127282620018f2565b602082019050919050565b60006200128c600b836200157e565b915062001299826200191b565b602082019050919050565b6000620012b36032836200157e565b9150620012c08262001944565b604082019050919050565b6000620012da601c836200157e565b9150620012e78262001993565b602082019050919050565b600062001301602a836200157e565b91506200130e82620019bc565b604082019050919050565b6000620013286020836200157e565b9150620013358262001a0b565b602082019050919050565b60006200134f6020836200157e565b91506200135c8262001a34565b602082019050919050565b6000620013766009836200157e565b9150620013838262001a5d565b602082019050919050565b6200139981620016e8565b82525050565b6000608082019050620013b6600083018762001204565b620013c5602083018662001204565b620013d460408301856200138e565b8181036060830152620013e8818462001215565b905095945050505050565b600060208201905081810360008301526200140e8162001256565b9050919050565b6000602082019050818103600083015262001430816200127d565b9050919050565b600060208201905081810360008301526200145281620012a4565b9050919050565b600060208201905081810360008301526200147481620012cb565b9050919050565b600060208201905081810360008301526200149681620012f2565b9050919050565b60006020820190508181036000830152620014b88162001319565b9050919050565b60006020820190508181036000830152620014da8162001340565b9050919050565b60006020820190508181036000830152620014fc8162001367565b9050919050565b60006200150f62001522565b90506200151d82826200175e565b919050565b6000604051905090565b600067ffffffffffffffff8211156200154a57620015496200189e565b5b6200155582620018e1565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b60006200159c82620016e8565b9150620015a983620016e8565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620015e157620015e0620017e2565b5b828201905092915050565b6000620015f982620016e8565b91506200160683620016e8565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620016425762001641620017e2565b5b828202905092915050565b60006200165a82620016e8565b91506200166783620016e8565b9250828210156200167d576200167c620017e2565b5b828203905092915050565b60006200169582620016c8565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562001712578082015181840152602081019050620016f5565b8381111562001722576000848401525b50505050565b600060028204905060018216806200174157607f821691505b6020821081141562001758576200175762001811565b5b50919050565b6200176982620018e1565b810181811067ffffffffffffffff821117156200178b576200178a6200189e565b5b80604052505050565b6000620017a182620016e8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415620017d757620017d6620017e2565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e6f7420796574206163746976652e0000000000000000000000000000000000600082015250565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b62001a91816200169c565b811462001a9d57600080fd5b50565b62001aab81620016e8565b811462001ab757600080fd5b50565b6144da8062001aca6000396000f3fe60806040526004361061020f5760003560e01c806355f804b311610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610781578063da3ef23f146107ac578063e985e9c5146107d5578063eb8d244414610812578063f2fde38b1461083d5761020f565b8063a22cb465146106c7578063b88d4fde146106f0578063c668286214610719578063c87b56dd146107445761020f565b806370a08231116100e757806370a08231146105f4578063715018a6146106315780637f00c7a6146106485780638da5cb5b1461067157806395d89b411461069c5761020f565b806355f804b3146105385780635b8d02d7146105615780636352211e1461058c5780636c0360eb146105c95761020f565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461045057806342842e0e1461046c578063438b63001461049557806344a0d68a146104d25780634f6ccce7146104fb5761020f565b806323b872dd146103b55780632f745c59146103de5780633360caa01461041b5780633ccfd60b146104465761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630ca282f71461030b57806313faede61461033457806318160ddd1461035f578063239c70ae1461038a5761020f565b806301ffc9a71461021457806302c889891461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061305d565b610866565b60405161024891906136d2565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613030565b6108e0565b005b34801561028657600080fd5b5061028f610979565b60405161029c91906136ed565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613100565b610a0b565b6040516102d99190613649565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612ff0565b610a90565b005b34801561031757600080fd5b50610332600480360381019061032d9190613100565b610ba8565b005b34801561034057600080fd5b50610349610c2e565b60405161035691906139af565b60405180910390f35b34801561036b57600080fd5b50610374610c34565b60405161038191906139af565b60405180910390f35b34801561039657600080fd5b5061039f610c41565b6040516103ac91906139af565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d79190612eda565b610c47565b005b3480156103ea57600080fd5b5061040560048036038101906104009190612ff0565b610ca7565b60405161041291906139af565b60405180910390f35b34801561042757600080fd5b50610430610d4c565b60405161043d91906139af565b60405180910390f35b61044e610d52565b005b61046a60048036038101906104659190612ff0565b610e69565b005b34801561047857600080fd5b50610493600480360381019061048e9190612eda565b61100e565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190612e6d565b61102e565b6040516104c991906136b0565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190613100565b6110dc565b005b34801561050757600080fd5b50610522600480360381019061051d9190613100565b611162565b60405161052f91906139af565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a91906130b7565b6111d3565b005b34801561056d57600080fd5b50610576611269565b6040516105839190613649565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190613100565b61128f565b6040516105c09190613649565b60405180910390f35b3480156105d557600080fd5b506105de611341565b6040516105eb91906136ed565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612e6d565b6113cf565b60405161062891906139af565b60405180910390f35b34801561063d57600080fd5b50610646611487565b005b34801561065457600080fd5b5061066f600480360381019061066a9190613100565b61150f565b005b34801561067d57600080fd5b50610686611595565b6040516106939190613649565b60405180910390f35b3480156106a857600080fd5b506106b16115bf565b6040516106be91906136ed565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612fb0565b611651565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612f2d565b611667565b005b34801561072557600080fd5b5061072e6116c9565b60405161073b91906136ed565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613100565b611757565b60405161077891906136ed565b60405180910390f35b34801561078d57600080fd5b50610796611801565b6040516107a391906139af565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce91906130b7565b611807565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190612e9a565b61189d565b60405161080991906136d2565b60405180910390f35b34801561081e57600080fd5b50610827611931565b60405161083491906136d2565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190612e6d565b611944565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d957506108d882611a54565b5b9050919050565b6108e8611b36565b73ffffffffffffffffffffffffffffffffffffffff16610906611595565b73ffffffffffffffffffffffffffffffffffffffff161461095c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610953906138cf565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60606000805461098890613cb8565b80601f01602080910402602001604051908101604052809291908181526020018280546109b490613cb8565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b6000610a1682611b3e565b610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9b8261128f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b039061392f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2b611b36565b73ffffffffffffffffffffffffffffffffffffffff161480610b5a5750610b5981610b54611b36565b61189d565b5b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b909061382f565b60405180910390fd5b610ba38383611baa565b505050565b610bb0611b36565b73ffffffffffffffffffffffffffffffffffffffff16610bce611595565b73ffffffffffffffffffffffffffffffffffffffff1614610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b906138cf565b60405180910390fd5b8060118190555050565b600d5481565b6000600880549050905090565b600f5481565b610c58610c52611b36565b82611c63565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e9061394f565b60405180910390fd5b610ca2838383611d41565b505050565b6000610cb2836113cf565b8210610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061370f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610d5a611b36565b73ffffffffffffffffffffffffffffffffffffffff16610d78611595565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906138cf565b60405180910390fd5b6000601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e1690613634565b60006040518083038185875af1925050503d8060008114610e53576040519150601f19603f3d011682016040523d82523d6000602084013e610e58565b606091505b5050905080610e6657600080fd5b50565b6000610e73610c34565b9050610e7d611595565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9457601060009054906101000a900460ff16610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef59061372f565b60405180910390fd5b81600d54610f0c9190613b74565b341015610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061396f565b60405180910390fd5b601154421015610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061374f565b60405180910390fd5b5b60008211610fa157600080fd5b600f54821115610fb057600080fd5b600e548282610fbf9190613aed565b1115610fca57600080fd5b60005b600183610fda9190613bce565b811161100857610ff5848284610ff09190613aed565b611f9d565b808061100090613d1b565b915050610fcd565b50505050565b61102983838360405180602001604052806000815250611667565b505050565b6060600061103b836113cf565b905060008167ffffffffffffffff81111561105957611058613e80565b5b6040519080825280602002602001820160405280156110875781602001602082028036833780820191505090505b50905060005b828110156110d15761109f8582610ca7565b8282815181106110b2576110b1613e51565b5b60200260200101818152505080806110c990613d1b565b91505061108d565b508092505050919050565b6110e4611b36565b73ffffffffffffffffffffffffffffffffffffffff16611102611595565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906138cf565b60405180910390fd5b80600d8190555050565b600061116c610c34565b82106111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a49061398f565b60405180910390fd5b600882815481106111c1576111c0613e51565b5b90600052602060002001549050919050565b6111db611b36565b73ffffffffffffffffffffffffffffffffffffffff166111f9611595565b73ffffffffffffffffffffffffffffffffffffffff161461124f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611246906138cf565b60405180910390fd5b80600b9080519060200190611265929190612c81565b5050565b601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061386f565b60405180910390fd5b80915050919050565b600b805461134e90613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90613cb8565b80156113c75780601f1061139c576101008083540402835291602001916113c7565b820191906000526020600020905b8154815290600101906020018083116113aa57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611440576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114379061384f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61148f611b36565b73ffffffffffffffffffffffffffffffffffffffff166114ad611595565b73ffffffffffffffffffffffffffffffffffffffff1614611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa906138cf565b60405180910390fd5b61150d6000611fbb565b565b611517611b36565b73ffffffffffffffffffffffffffffffffffffffff16611535611595565b73ffffffffffffffffffffffffffffffffffffffff161461158b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611582906138cf565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ce90613cb8565b80601f01602080910402602001604051908101604052809291908181526020018280546115fa90613cb8565b80156116475780601f1061161c57610100808354040283529160200191611647565b820191906000526020600020905b81548152906001019060200180831161162a57829003601f168201915b5050505050905090565b61166361165c611b36565b8383612081565b5050565b611678611672611b36565b83611c63565b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae9061394f565b60405180910390fd5b6116c3848484846121ee565b50505050565b600c80546116d690613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461170290613cb8565b801561174f5780601f106117245761010080835404028352916020019161174f565b820191906000526020600020905b81548152906001019060200180831161173257829003601f168201915b505050505081565b606061176282611b3e565b6117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061390f565b60405180910390fd5b60006117ab61224a565b905060008151116117cb57604051806020016040528060008152506117f9565b806117d5846122dc565b600c6040516020016117e993929190613603565b6040516020818303038152906040525b915050919050565b600e5481565b61180f611b36565b73ffffffffffffffffffffffffffffffffffffffff1661182d611595565b73ffffffffffffffffffffffffffffffffffffffff1614611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a906138cf565b60405180910390fd5b80600c9080519060200190611899929190612c81565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61194c611b36565b73ffffffffffffffffffffffffffffffffffffffff1661196a611595565b73ffffffffffffffffffffffffffffffffffffffff16146119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906138cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a279061378f565b60405180910390fd5b611a3981611fbb565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b1f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b2f5750611b2e8261243d565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c1d8361128f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c6e82611b3e565b611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061380f565b60405180910390fd5b6000611cb88361128f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d2757508373ffffffffffffffffffffffffffffffffffffffff16611d0f84610a0b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d385750611d37818561189d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d618261128f565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906138ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906137cf565b60405180910390fd5b611e328383836124a7565b611e3d600082611baa565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e8d9190613bce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee49190613aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb78282604051806020016040528060008152506125bb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906137ef565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121e191906136d2565b60405180910390a3505050565b6121f9848484611d41565b61220584848484612616565b612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223b9061376f565b60405180910390fd5b50505050565b6060600b805461225990613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461228590613cb8565b80156122d25780601f106122a7576101008083540402835291602001916122d2565b820191906000526020600020905b8154815290600101906020018083116122b557829003601f168201915b5050505050905090565b60606000821415612324576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612438565b600082905060005b6000821461235657808061233f90613d1b565b915050600a8261234f9190613b43565b915061232c565b60008167ffffffffffffffff81111561237257612371613e80565b5b6040519080825280601f01601f1916602001820160405280156123a45781602001600182028036833780820191505090505b5090505b60008514612431576001826123bd9190613bce565b9150600a856123cc9190613d64565b60306123d89190613aed565b60f81b8183815181106123ee576123ed613e51565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561242a9190613b43565b94506123a8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124b2838383611a4f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f5576124f0816127ad565b612534565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125335761253283826127f6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125775761257281612963565b6125b6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b5576125b48282612a34565b5b5b505050565b6125c58383612ab3565b6125d26000848484612616565b612611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126089061376f565b60405180910390fd5b505050565b60006126378473ffffffffffffffffffffffffffffffffffffffff16611a3c565b156127a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612660611b36565b8786866040518563ffffffff1660e01b81526004016126829493929190613664565b602060405180830381600087803b15801561269c57600080fd5b505af19250505080156126cd57506040513d601f19601f820116820180604052508101906126ca919061308a565b60015b612750573d80600081146126fd576040519150601f19603f3d011682016040523d82523d6000602084013e612702565b606091505b50600081511415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f9061376f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a5565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612803846113cf565b61280d9190613bce565b90506000600760008481526020019081526020016000205490508181146128f2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129779190613bce565b90506000600960008481526020019081526020016000205490506000600883815481106129a7576129a6613e51565b5b9060005260206000200154905080600883815481106129c9576129c8613e51565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a1857612a17613e22565b5b6001900381819060005260206000200160009055905550505050565b6000612a3f836113cf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1a9061388f565b60405180910390fd5b612b2c81611b3e565b15612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906137af565b60405180910390fd5b612b78600083836124a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc89190613aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c8d90613cb8565b90600052602060002090601f016020900481019282612caf5760008555612cf6565b82601f10612cc857805160ff1916838001178555612cf6565b82800160010185558215612cf6579182015b82811115612cf5578251825591602001919060010190612cda565b5b509050612d039190612d07565b5090565b5b80821115612d20576000816000905550600101612d08565b5090565b6000612d37612d32846139ef565b6139ca565b905082815260208101848484011115612d5357612d52613eb4565b5b612d5e848285613c76565b509392505050565b6000612d79612d7484613a20565b6139ca565b905082815260208101848484011115612d9557612d94613eb4565b5b612da0848285613c76565b509392505050565b600081359050612db781614448565b92915050565b600081359050612dcc8161445f565b92915050565b600081359050612de181614476565b92915050565b600081519050612df681614476565b92915050565b600082601f830112612e1157612e10613eaf565b5b8135612e21848260208601612d24565b91505092915050565b600082601f830112612e3f57612e3e613eaf565b5b8135612e4f848260208601612d66565b91505092915050565b600081359050612e678161448d565b92915050565b600060208284031215612e8357612e82613ebe565b5b6000612e9184828501612da8565b91505092915050565b60008060408385031215612eb157612eb0613ebe565b5b6000612ebf85828601612da8565b9250506020612ed085828601612da8565b9150509250929050565b600080600060608486031215612ef357612ef2613ebe565b5b6000612f0186828701612da8565b9350506020612f1286828701612da8565b9250506040612f2386828701612e58565b9150509250925092565b60008060008060808587031215612f4757612f46613ebe565b5b6000612f5587828801612da8565b9450506020612f6687828801612da8565b9350506040612f7787828801612e58565b925050606085013567ffffffffffffffff811115612f9857612f97613eb9565b5b612fa487828801612dfc565b91505092959194509250565b60008060408385031215612fc757612fc6613ebe565b5b6000612fd585828601612da8565b9250506020612fe685828601612dbd565b9150509250929050565b6000806040838503121561300757613006613ebe565b5b600061301585828601612da8565b925050602061302685828601612e58565b9150509250929050565b60006020828403121561304657613045613ebe565b5b600061305484828501612dbd565b91505092915050565b60006020828403121561307357613072613ebe565b5b600061308184828501612dd2565b91505092915050565b6000602082840312156130a05761309f613ebe565b5b60006130ae84828501612de7565b91505092915050565b6000602082840312156130cd576130cc613ebe565b5b600082013567ffffffffffffffff8111156130eb576130ea613eb9565b5b6130f784828501612e2a565b91505092915050565b60006020828403121561311657613115613ebe565b5b600061312484828501612e58565b91505092915050565b600061313983836135e5565b60208301905092915050565b61314e81613c02565b82525050565b600061315f82613a76565b6131698185613aa4565b935061317483613a51565b8060005b838110156131a557815161318c888261312d565b975061319783613a97565b925050600181019050613178565b5085935050505092915050565b6131bb81613c14565b82525050565b60006131cc82613a81565b6131d68185613ab5565b93506131e6818560208601613c85565b6131ef81613ec3565b840191505092915050565b600061320582613a8c565b61320f8185613ad1565b935061321f818560208601613c85565b61322881613ec3565b840191505092915050565b600061323e82613a8c565b6132488185613ae2565b9350613258818560208601613c85565b80840191505092915050565b6000815461327181613cb8565b61327b8186613ae2565b9450600182166000811461329657600181146132a7576132da565b60ff198316865281860193506132da565b6132b085613a61565b60005b838110156132d2578154818901526001820191506020810190506132b3565b838801955050505b50505092915050565b60006132f0602b83613ad1565b91506132fb82613ed4565b604082019050919050565b6000613313600f83613ad1565b915061331e82613f23565b602082019050919050565b6000613336600b83613ad1565b915061334182613f4c565b602082019050919050565b6000613359603283613ad1565b915061336482613f75565b604082019050919050565b600061337c602683613ad1565b915061338782613fc4565b604082019050919050565b600061339f601c83613ad1565b91506133aa82614013565b602082019050919050565b60006133c2602483613ad1565b91506133cd8261403c565b604082019050919050565b60006133e5601983613ad1565b91506133f08261408b565b602082019050919050565b6000613408602c83613ad1565b9150613413826140b4565b604082019050919050565b600061342b603883613ad1565b915061343682614103565b604082019050919050565b600061344e602a83613ad1565b915061345982614152565b604082019050919050565b6000613471602983613ad1565b915061347c826141a1565b604082019050919050565b6000613494602083613ad1565b915061349f826141f0565b602082019050919050565b60006134b7602c83613ad1565b91506134c282614219565b604082019050919050565b60006134da602083613ad1565b91506134e582614268565b602082019050919050565b60006134fd602983613ad1565b915061350882614291565b604082019050919050565b6000613520602f83613ad1565b915061352b826142e0565b604082019050919050565b6000613543602183613ad1565b915061354e8261432f565b604082019050919050565b6000613566600083613ac6565b91506135718261437e565b600082019050919050565b6000613589603183613ad1565b915061359482614381565b604082019050919050565b60006135ac600983613ad1565b91506135b7826143d0565b602082019050919050565b60006135cf602c83613ad1565b91506135da826143f9565b604082019050919050565b6135ee81613c6c565b82525050565b6135fd81613c6c565b82525050565b600061360f8286613233565b915061361b8285613233565b91506136278284613264565b9150819050949350505050565b600061363f82613559565b9150819050919050565b600060208201905061365e6000830184613145565b92915050565b60006080820190506136796000830187613145565b6136866020830186613145565b61369360408301856135f4565b81810360608301526136a581846131c1565b905095945050505050565b600060208201905081810360008301526136ca8184613154565b905092915050565b60006020820190506136e760008301846131b2565b92915050565b6000602082019050818103600083015261370781846131fa565b905092915050565b60006020820190508181036000830152613728816132e3565b9050919050565b6000602082019050818103600083015261374881613306565b9050919050565b6000602082019050818103600083015261376881613329565b9050919050565b600060208201905081810360008301526137888161334c565b9050919050565b600060208201905081810360008301526137a88161336f565b9050919050565b600060208201905081810360008301526137c881613392565b9050919050565b600060208201905081810360008301526137e8816133b5565b9050919050565b60006020820190508181036000830152613808816133d8565b9050919050565b60006020820190508181036000830152613828816133fb565b9050919050565b600060208201905081810360008301526138488161341e565b9050919050565b6000602082019050818103600083015261386881613441565b9050919050565b6000602082019050818103600083015261388881613464565b9050919050565b600060208201905081810360008301526138a881613487565b9050919050565b600060208201905081810360008301526138c8816134aa565b9050919050565b600060208201905081810360008301526138e8816134cd565b9050919050565b60006020820190508181036000830152613908816134f0565b9050919050565b6000602082019050818103600083015261392881613513565b9050919050565b6000602082019050818103600083015261394881613536565b9050919050565b600060208201905081810360008301526139688161357c565b9050919050565b600060208201905081810360008301526139888161359f565b9050919050565b600060208201905081810360008301526139a8816135c2565b9050919050565b60006020820190506139c460008301846135f4565b92915050565b60006139d46139e5565b90506139e08282613cea565b919050565b6000604051905090565b600067ffffffffffffffff821115613a0a57613a09613e80565b5b613a1382613ec3565b9050602081019050919050565b600067ffffffffffffffff821115613a3b57613a3a613e80565b5b613a4482613ec3565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613af882613c6c565b9150613b0383613c6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3857613b37613d95565b5b828201905092915050565b6000613b4e82613c6c565b9150613b5983613c6c565b925082613b6957613b68613dc4565b5b828204905092915050565b6000613b7f82613c6c565b9150613b8a83613c6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc357613bc2613d95565b5b828202905092915050565b6000613bd982613c6c565b9150613be483613c6c565b925082821015613bf757613bf6613d95565b5b828203905092915050565b6000613c0d82613c4c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ca3578082015181840152602081019050613c88565b83811115613cb2576000848401525b50505050565b60006002820490506001821680613cd057607f821691505b60208210811415613ce457613ce3613df3565b5b50919050565b613cf382613ec3565b810181811067ffffffffffffffff82111715613d1257613d11613e80565b5b80604052505050565b6000613d2682613c6c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d5957613d58613d95565b5b600182019050919050565b6000613d6f82613c6c565b9150613d7a83613c6c565b925082613d8a57613d89613dc4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4e6f7420796574206163746976652e0000000000000000000000000000000000600082015250565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61445181613c02565b811461445c57600080fd5b50565b61446881613c14565b811461447357600080fd5b50565b61447f81613c20565b811461448a57600080fd5b50565b61449681613c6c565b81146144a157600080fd5b5056fea2646970667358221220a1acb4f3c3ab75af7a6826d3fa471cc072e6644d173e96e27c49997164da84da64736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000006223971000000000000000000000000000000000000000000000000000000000000000125261726541706570655961636874436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452415943000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e544c6e6d58526b51354351534b43556d5542506835535879385557675a4a334163714431326563457662512f00000000000000000000

Deployed Bytecode

0x60806040526004361061020f5760003560e01c806355f804b311610118578063a22cb465116100a0578063d5abeb011161006f578063d5abeb0114610781578063da3ef23f146107ac578063e985e9c5146107d5578063eb8d244414610812578063f2fde38b1461083d5761020f565b8063a22cb465146106c7578063b88d4fde146106f0578063c668286214610719578063c87b56dd146107445761020f565b806370a08231116100e757806370a08231146105f4578063715018a6146106315780637f00c7a6146106485780638da5cb5b1461067157806395d89b411461069c5761020f565b806355f804b3146105385780635b8d02d7146105615780636352211e1461058c5780636c0360eb146105c95761020f565b806323b872dd1161019b57806340c10f191161016a57806340c10f191461045057806342842e0e1461046c578063438b63001461049557806344a0d68a146104d25780634f6ccce7146104fb5761020f565b806323b872dd146103b55780632f745c59146103de5780633360caa01461041b5780633ccfd60b146104465761020f565b8063095ea7b3116101e2578063095ea7b3146102e25780630ca282f71461030b57806313faede61461033457806318160ddd1461035f578063239c70ae1461038a5761020f565b806301ffc9a71461021457806302c889891461025157806306fdde031461027a578063081812fc146102a5575b600080fd5b34801561022057600080fd5b5061023b6004803603810190610236919061305d565b610866565b60405161024891906136d2565b60405180910390f35b34801561025d57600080fd5b5061027860048036038101906102739190613030565b6108e0565b005b34801561028657600080fd5b5061028f610979565b60405161029c91906136ed565b60405180910390f35b3480156102b157600080fd5b506102cc60048036038101906102c79190613100565b610a0b565b6040516102d99190613649565b60405180910390f35b3480156102ee57600080fd5b5061030960048036038101906103049190612ff0565b610a90565b005b34801561031757600080fd5b50610332600480360381019061032d9190613100565b610ba8565b005b34801561034057600080fd5b50610349610c2e565b60405161035691906139af565b60405180910390f35b34801561036b57600080fd5b50610374610c34565b60405161038191906139af565b60405180910390f35b34801561039657600080fd5b5061039f610c41565b6040516103ac91906139af565b60405180910390f35b3480156103c157600080fd5b506103dc60048036038101906103d79190612eda565b610c47565b005b3480156103ea57600080fd5b5061040560048036038101906104009190612ff0565b610ca7565b60405161041291906139af565b60405180910390f35b34801561042757600080fd5b50610430610d4c565b60405161043d91906139af565b60405180910390f35b61044e610d52565b005b61046a60048036038101906104659190612ff0565b610e69565b005b34801561047857600080fd5b50610493600480360381019061048e9190612eda565b61100e565b005b3480156104a157600080fd5b506104bc60048036038101906104b79190612e6d565b61102e565b6040516104c991906136b0565b60405180910390f35b3480156104de57600080fd5b506104f960048036038101906104f49190613100565b6110dc565b005b34801561050757600080fd5b50610522600480360381019061051d9190613100565b611162565b60405161052f91906139af565b60405180910390f35b34801561054457600080fd5b5061055f600480360381019061055a91906130b7565b6111d3565b005b34801561056d57600080fd5b50610576611269565b6040516105839190613649565b60405180910390f35b34801561059857600080fd5b506105b360048036038101906105ae9190613100565b61128f565b6040516105c09190613649565b60405180910390f35b3480156105d557600080fd5b506105de611341565b6040516105eb91906136ed565b60405180910390f35b34801561060057600080fd5b5061061b60048036038101906106169190612e6d565b6113cf565b60405161062891906139af565b60405180910390f35b34801561063d57600080fd5b50610646611487565b005b34801561065457600080fd5b5061066f600480360381019061066a9190613100565b61150f565b005b34801561067d57600080fd5b50610686611595565b6040516106939190613649565b60405180910390f35b3480156106a857600080fd5b506106b16115bf565b6040516106be91906136ed565b60405180910390f35b3480156106d357600080fd5b506106ee60048036038101906106e99190612fb0565b611651565b005b3480156106fc57600080fd5b5061071760048036038101906107129190612f2d565b611667565b005b34801561072557600080fd5b5061072e6116c9565b60405161073b91906136ed565b60405180910390f35b34801561075057600080fd5b5061076b60048036038101906107669190613100565b611757565b60405161077891906136ed565b60405180910390f35b34801561078d57600080fd5b50610796611801565b6040516107a391906139af565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce91906130b7565b611807565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190612e9a565b61189d565b60405161080991906136d2565b60405180910390f35b34801561081e57600080fd5b50610827611931565b60405161083491906136d2565b60405180910390f35b34801561084957600080fd5b50610864600480360381019061085f9190612e6d565b611944565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806108d957506108d882611a54565b5b9050919050565b6108e8611b36565b73ffffffffffffffffffffffffffffffffffffffff16610906611595565b73ffffffffffffffffffffffffffffffffffffffff161461095c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610953906138cf565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b60606000805461098890613cb8565b80601f01602080910402602001604051908101604052809291908181526020018280546109b490613cb8565b8015610a015780601f106109d657610100808354040283529160200191610a01565b820191906000526020600020905b8154815290600101906020018083116109e457829003601f168201915b5050505050905090565b6000610a1682611b3e565b610a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4c906138af565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610a9b8261128f565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b039061392f565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b2b611b36565b73ffffffffffffffffffffffffffffffffffffffff161480610b5a5750610b5981610b54611b36565b61189d565b5b610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b909061382f565b60405180910390fd5b610ba38383611baa565b505050565b610bb0611b36565b73ffffffffffffffffffffffffffffffffffffffff16610bce611595565b73ffffffffffffffffffffffffffffffffffffffff1614610c24576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1b906138cf565b60405180910390fd5b8060118190555050565b600d5481565b6000600880549050905090565b600f5481565b610c58610c52611b36565b82611c63565b610c97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8e9061394f565b60405180910390fd5b610ca2838383611d41565b505050565b6000610cb2836113cf565b8210610cf3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cea9061370f565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60115481565b610d5a611b36565b73ffffffffffffffffffffffffffffffffffffffff16610d78611595565b73ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc5906138cf565b60405180910390fd5b6000601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1647604051610e1690613634565b60006040518083038185875af1925050503d8060008114610e53576040519150601f19603f3d011682016040523d82523d6000602084013e610e58565b606091505b5050905080610e6657600080fd5b50565b6000610e73610c34565b9050610e7d611595565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610f9457601060009054906101000a900460ff16610efe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ef59061372f565b60405180910390fd5b81600d54610f0c9190613b74565b341015610f4e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f459061396f565b60405180910390fd5b601154421015610f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8a9061374f565b60405180910390fd5b5b60008211610fa157600080fd5b600f54821115610fb057600080fd5b600e548282610fbf9190613aed565b1115610fca57600080fd5b60005b600183610fda9190613bce565b811161100857610ff5848284610ff09190613aed565b611f9d565b808061100090613d1b565b915050610fcd565b50505050565b61102983838360405180602001604052806000815250611667565b505050565b6060600061103b836113cf565b905060008167ffffffffffffffff81111561105957611058613e80565b5b6040519080825280602002602001820160405280156110875781602001602082028036833780820191505090505b50905060005b828110156110d15761109f8582610ca7565b8282815181106110b2576110b1613e51565b5b60200260200101818152505080806110c990613d1b565b91505061108d565b508092505050919050565b6110e4611b36565b73ffffffffffffffffffffffffffffffffffffffff16611102611595565b73ffffffffffffffffffffffffffffffffffffffff1614611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161114f906138cf565b60405180910390fd5b80600d8190555050565b600061116c610c34565b82106111ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a49061398f565b60405180910390fd5b600882815481106111c1576111c0613e51565b5b90600052602060002001549050919050565b6111db611b36565b73ffffffffffffffffffffffffffffffffffffffff166111f9611595565b73ffffffffffffffffffffffffffffffffffffffff161461124f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611246906138cf565b60405180910390fd5b80600b9080519060200190611265929190612c81565b5050565b601060019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611338576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132f9061386f565b60405180910390fd5b80915050919050565b600b805461134e90613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461137a90613cb8565b80156113c75780601f1061139c576101008083540402835291602001916113c7565b820191906000526020600020905b8154815290600101906020018083116113aa57829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611440576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114379061384f565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61148f611b36565b73ffffffffffffffffffffffffffffffffffffffff166114ad611595565b73ffffffffffffffffffffffffffffffffffffffff1614611503576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114fa906138cf565b60405180910390fd5b61150d6000611fbb565b565b611517611b36565b73ffffffffffffffffffffffffffffffffffffffff16611535611595565b73ffffffffffffffffffffffffffffffffffffffff161461158b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611582906138cf565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546115ce90613cb8565b80601f01602080910402602001604051908101604052809291908181526020018280546115fa90613cb8565b80156116475780601f1061161c57610100808354040283529160200191611647565b820191906000526020600020905b81548152906001019060200180831161162a57829003601f168201915b5050505050905090565b61166361165c611b36565b8383612081565b5050565b611678611672611b36565b83611c63565b6116b7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116ae9061394f565b60405180910390fd5b6116c3848484846121ee565b50505050565b600c80546116d690613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461170290613cb8565b801561174f5780601f106117245761010080835404028352916020019161174f565b820191906000526020600020905b81548152906001019060200180831161173257829003601f168201915b505050505081565b606061176282611b3e565b6117a1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117989061390f565b60405180910390fd5b60006117ab61224a565b905060008151116117cb57604051806020016040528060008152506117f9565b806117d5846122dc565b600c6040516020016117e993929190613603565b6040516020818303038152906040525b915050919050565b600e5481565b61180f611b36565b73ffffffffffffffffffffffffffffffffffffffff1661182d611595565b73ffffffffffffffffffffffffffffffffffffffff1614611883576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161187a906138cf565b60405180910390fd5b80600c9080519060200190611899929190612c81565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b601060009054906101000a900460ff1681565b61194c611b36565b73ffffffffffffffffffffffffffffffffffffffff1661196a611595565b73ffffffffffffffffffffffffffffffffffffffff16146119c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119b7906138cf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a279061378f565b60405180910390fd5b611a3981611fbb565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b1f57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611b2f5750611b2e8261243d565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c1d8361128f565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c6e82611b3e565b611cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ca49061380f565b60405180910390fd5b6000611cb88361128f565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d2757508373ffffffffffffffffffffffffffffffffffffffff16611d0f84610a0b565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d385750611d37818561189d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d618261128f565b73ffffffffffffffffffffffffffffffffffffffff1614611db7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dae906138ef565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e1e906137cf565b60405180910390fd5b611e328383836124a7565b611e3d600082611baa565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e8d9190613bce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ee49190613aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb78282604051806020016040528060008152506125bb565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156120f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e7906137ef565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516121e191906136d2565b60405180910390a3505050565b6121f9848484611d41565b61220584848484612616565b612244576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161223b9061376f565b60405180910390fd5b50505050565b6060600b805461225990613cb8565b80601f016020809104026020016040519081016040528092919081815260200182805461228590613cb8565b80156122d25780601f106122a7576101008083540402835291602001916122d2565b820191906000526020600020905b8154815290600101906020018083116122b557829003601f168201915b5050505050905090565b60606000821415612324576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612438565b600082905060005b6000821461235657808061233f90613d1b565b915050600a8261234f9190613b43565b915061232c565b60008167ffffffffffffffff81111561237257612371613e80565b5b6040519080825280601f01601f1916602001820160405280156123a45781602001600182028036833780820191505090505b5090505b60008514612431576001826123bd9190613bce565b9150600a856123cc9190613d64565b60306123d89190613aed565b60f81b8183815181106123ee576123ed613e51565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561242a9190613b43565b94506123a8565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6124b2838383611a4f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156124f5576124f0816127ad565b612534565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125335761253283826127f6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125775761257281612963565b6125b6565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b5576125b48282612a34565b5b5b505050565b6125c58383612ab3565b6125d26000848484612616565b612611576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126089061376f565b60405180910390fd5b505050565b60006126378473ffffffffffffffffffffffffffffffffffffffff16611a3c565b156127a0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612660611b36565b8786866040518563ffffffff1660e01b81526004016126829493929190613664565b602060405180830381600087803b15801561269c57600080fd5b505af19250505080156126cd57506040513d601f19601f820116820180604052508101906126ca919061308a565b60015b612750573d80600081146126fd576040519150601f19603f3d011682016040523d82523d6000602084013e612702565b606091505b50600081511415612748576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161273f9061376f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506127a5565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612803846113cf565b61280d9190613bce565b90506000600760008481526020019081526020016000205490508181146128f2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506129779190613bce565b90506000600960008481526020019081526020016000205490506000600883815481106129a7576129a6613e51565b5b9060005260206000200154905080600883815481106129c9576129c8613e51565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612a1857612a17613e22565b5b6001900381819060005260206000200160009055905550505050565b6000612a3f836113cf565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b1a9061388f565b60405180910390fd5b612b2c81611b3e565b15612b6c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b63906137af565b60405180910390fd5b612b78600083836124a7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bc89190613aed565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b828054612c8d90613cb8565b90600052602060002090601f016020900481019282612caf5760008555612cf6565b82601f10612cc857805160ff1916838001178555612cf6565b82800160010185558215612cf6579182015b82811115612cf5578251825591602001919060010190612cda565b5b509050612d039190612d07565b5090565b5b80821115612d20576000816000905550600101612d08565b5090565b6000612d37612d32846139ef565b6139ca565b905082815260208101848484011115612d5357612d52613eb4565b5b612d5e848285613c76565b509392505050565b6000612d79612d7484613a20565b6139ca565b905082815260208101848484011115612d9557612d94613eb4565b5b612da0848285613c76565b509392505050565b600081359050612db781614448565b92915050565b600081359050612dcc8161445f565b92915050565b600081359050612de181614476565b92915050565b600081519050612df681614476565b92915050565b600082601f830112612e1157612e10613eaf565b5b8135612e21848260208601612d24565b91505092915050565b600082601f830112612e3f57612e3e613eaf565b5b8135612e4f848260208601612d66565b91505092915050565b600081359050612e678161448d565b92915050565b600060208284031215612e8357612e82613ebe565b5b6000612e9184828501612da8565b91505092915050565b60008060408385031215612eb157612eb0613ebe565b5b6000612ebf85828601612da8565b9250506020612ed085828601612da8565b9150509250929050565b600080600060608486031215612ef357612ef2613ebe565b5b6000612f0186828701612da8565b9350506020612f1286828701612da8565b9250506040612f2386828701612e58565b9150509250925092565b60008060008060808587031215612f4757612f46613ebe565b5b6000612f5587828801612da8565b9450506020612f6687828801612da8565b9350506040612f7787828801612e58565b925050606085013567ffffffffffffffff811115612f9857612f97613eb9565b5b612fa487828801612dfc565b91505092959194509250565b60008060408385031215612fc757612fc6613ebe565b5b6000612fd585828601612da8565b9250506020612fe685828601612dbd565b9150509250929050565b6000806040838503121561300757613006613ebe565b5b600061301585828601612da8565b925050602061302685828601612e58565b9150509250929050565b60006020828403121561304657613045613ebe565b5b600061305484828501612dbd565b91505092915050565b60006020828403121561307357613072613ebe565b5b600061308184828501612dd2565b91505092915050565b6000602082840312156130a05761309f613ebe565b5b60006130ae84828501612de7565b91505092915050565b6000602082840312156130cd576130cc613ebe565b5b600082013567ffffffffffffffff8111156130eb576130ea613eb9565b5b6130f784828501612e2a565b91505092915050565b60006020828403121561311657613115613ebe565b5b600061312484828501612e58565b91505092915050565b600061313983836135e5565b60208301905092915050565b61314e81613c02565b82525050565b600061315f82613a76565b6131698185613aa4565b935061317483613a51565b8060005b838110156131a557815161318c888261312d565b975061319783613a97565b925050600181019050613178565b5085935050505092915050565b6131bb81613c14565b82525050565b60006131cc82613a81565b6131d68185613ab5565b93506131e6818560208601613c85565b6131ef81613ec3565b840191505092915050565b600061320582613a8c565b61320f8185613ad1565b935061321f818560208601613c85565b61322881613ec3565b840191505092915050565b600061323e82613a8c565b6132488185613ae2565b9350613258818560208601613c85565b80840191505092915050565b6000815461327181613cb8565b61327b8186613ae2565b9450600182166000811461329657600181146132a7576132da565b60ff198316865281860193506132da565b6132b085613a61565b60005b838110156132d2578154818901526001820191506020810190506132b3565b838801955050505b50505092915050565b60006132f0602b83613ad1565b91506132fb82613ed4565b604082019050919050565b6000613313600f83613ad1565b915061331e82613f23565b602082019050919050565b6000613336600b83613ad1565b915061334182613f4c565b602082019050919050565b6000613359603283613ad1565b915061336482613f75565b604082019050919050565b600061337c602683613ad1565b915061338782613fc4565b604082019050919050565b600061339f601c83613ad1565b91506133aa82614013565b602082019050919050565b60006133c2602483613ad1565b91506133cd8261403c565b604082019050919050565b60006133e5601983613ad1565b91506133f08261408b565b602082019050919050565b6000613408602c83613ad1565b9150613413826140b4565b604082019050919050565b600061342b603883613ad1565b915061343682614103565b604082019050919050565b600061344e602a83613ad1565b915061345982614152565b604082019050919050565b6000613471602983613ad1565b915061347c826141a1565b604082019050919050565b6000613494602083613ad1565b915061349f826141f0565b602082019050919050565b60006134b7602c83613ad1565b91506134c282614219565b604082019050919050565b60006134da602083613ad1565b91506134e582614268565b602082019050919050565b60006134fd602983613ad1565b915061350882614291565b604082019050919050565b6000613520602f83613ad1565b915061352b826142e0565b604082019050919050565b6000613543602183613ad1565b915061354e8261432f565b604082019050919050565b6000613566600083613ac6565b91506135718261437e565b600082019050919050565b6000613589603183613ad1565b915061359482614381565b604082019050919050565b60006135ac600983613ad1565b91506135b7826143d0565b602082019050919050565b60006135cf602c83613ad1565b91506135da826143f9565b604082019050919050565b6135ee81613c6c565b82525050565b6135fd81613c6c565b82525050565b600061360f8286613233565b915061361b8285613233565b91506136278284613264565b9150819050949350505050565b600061363f82613559565b9150819050919050565b600060208201905061365e6000830184613145565b92915050565b60006080820190506136796000830187613145565b6136866020830186613145565b61369360408301856135f4565b81810360608301526136a581846131c1565b905095945050505050565b600060208201905081810360008301526136ca8184613154565b905092915050565b60006020820190506136e760008301846131b2565b92915050565b6000602082019050818103600083015261370781846131fa565b905092915050565b60006020820190508181036000830152613728816132e3565b9050919050565b6000602082019050818103600083015261374881613306565b9050919050565b6000602082019050818103600083015261376881613329565b9050919050565b600060208201905081810360008301526137888161334c565b9050919050565b600060208201905081810360008301526137a88161336f565b9050919050565b600060208201905081810360008301526137c881613392565b9050919050565b600060208201905081810360008301526137e8816133b5565b9050919050565b60006020820190508181036000830152613808816133d8565b9050919050565b60006020820190508181036000830152613828816133fb565b9050919050565b600060208201905081810360008301526138488161341e565b9050919050565b6000602082019050818103600083015261386881613441565b9050919050565b6000602082019050818103600083015261388881613464565b9050919050565b600060208201905081810360008301526138a881613487565b9050919050565b600060208201905081810360008301526138c8816134aa565b9050919050565b600060208201905081810360008301526138e8816134cd565b9050919050565b60006020820190508181036000830152613908816134f0565b9050919050565b6000602082019050818103600083015261392881613513565b9050919050565b6000602082019050818103600083015261394881613536565b9050919050565b600060208201905081810360008301526139688161357c565b9050919050565b600060208201905081810360008301526139888161359f565b9050919050565b600060208201905081810360008301526139a8816135c2565b9050919050565b60006020820190506139c460008301846135f4565b92915050565b60006139d46139e5565b90506139e08282613cea565b919050565b6000604051905090565b600067ffffffffffffffff821115613a0a57613a09613e80565b5b613a1382613ec3565b9050602081019050919050565b600067ffffffffffffffff821115613a3b57613a3a613e80565b5b613a4482613ec3565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613af882613c6c565b9150613b0383613c6c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613b3857613b37613d95565b5b828201905092915050565b6000613b4e82613c6c565b9150613b5983613c6c565b925082613b6957613b68613dc4565b5b828204905092915050565b6000613b7f82613c6c565b9150613b8a83613c6c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613bc357613bc2613d95565b5b828202905092915050565b6000613bd982613c6c565b9150613be483613c6c565b925082821015613bf757613bf6613d95565b5b828203905092915050565b6000613c0d82613c4c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ca3578082015181840152602081019050613c88565b83811115613cb2576000848401525b50505050565b60006002820490506001821680613cd057607f821691505b60208210811415613ce457613ce3613df3565b5b50919050565b613cf382613ec3565b810181811067ffffffffffffffff82111715613d1257613d11613e80565b5b80604052505050565b6000613d2682613c6c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613d5957613d58613d95565b5b600182019050919050565b6000613d6f82613c6c565b9150613d7a83613c6c565b925082613d8a57613d89613dc4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4e6f7420796574206163746976652e0000000000000000000000000000000000600082015250565b7f4e6f742073746172746564000000000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b61445181613c02565b811461445c57600080fd5b50565b61446881613c14565b811461447357600080fd5b50565b61447f81613c20565b811461448a57600080fd5b50565b61449681613c6c565b81146144a157600080fd5b5056fea2646970667358221220a1acb4f3c3ab75af7a6826d3fa471cc072e6644d173e96e27c49997164da84da64736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000006223971000000000000000000000000000000000000000000000000000000000000000125261726541706570655961636874436c75620000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000452415943000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d4e544c6e6d58526b51354351534b43556d5542506835535879385557675a4a334163714431326563457662512f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): RareApepeYachtClub
Arg [1] : _symbol (string): RAYC
Arg [2] : _initBaseURI (string): ipfs://QmNTLnmXRkQ5CQSKCUmUBPh5SXy8UWgZJ3AcqD12ecEvbQ/
Arg [3] : _publicSaleStart (uint256): 1646499600

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000062239710
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 5261726541706570655961636874436c75620000000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [7] : 5241594300000000000000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d4e544c6e6d58526b51354351534b43556d554250683553
Arg [10] : 5879385557675a4a334163714431326563457662512f00000000000000000000


Deployed Bytecode Sourcemap

108102:3106:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101849:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110787:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;89343:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90902:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;90425:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;110235:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108250:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;102489:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108324:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91652:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102157:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108476:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110882:323;;;:::i;:::-;;108893:553;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92062:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;109452:348;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110347:80;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;102679:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110555:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108398:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89037:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108182:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;88767:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68313:103;;;;;;;;;;;;;:::i;:::-;;110433:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67662:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;89512:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91195:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92318:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;108208:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;109806:423;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108287:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;110659:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;91421:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;108362:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;68571:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101849:224;101951:4;101990:35;101975:50;;;:11;:50;;;;:90;;;;102029:36;102053:11;102029:23;:36::i;:::-;101975:90;101968:97;;101849:224;;;:::o;110787:89::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110864:6:::1;110849:12;;:21;;;;;;;;;;;;;;;;;;110787:89:::0;:::o;89343:100::-;89397:13;89430:5;89423:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89343:100;:::o;90902:221::-;90978:7;91006:16;91014:7;91006;:16::i;:::-;90998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;91091:15;:24;91107:7;91091:24;;;;;;;;;;;;;;;;;;;;;91084:31;;90902:221;;;:::o;90425:411::-;90506:13;90522:23;90537:7;90522:14;:23::i;:::-;90506:39;;90570:5;90564:11;;:2;:11;;;;90556:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;90664:5;90648:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;90673:37;90690:5;90697:12;:10;:12::i;:::-;90673:16;:37::i;:::-;90648:62;90626:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;90807:21;90816:2;90820:7;90807:8;:21::i;:::-;90495:341;90425:411;;:::o;110235:106::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110325:10:::1;110307:15;:28;;;;110235:106:::0;:::o;108250:32::-;;;;:::o;102489:113::-;102550:7;102577:10;:17;;;;102570:24;;102489:113;:::o;108324:33::-;;;;:::o;91652:339::-;91847:41;91866:12;:10;:12::i;:::-;91880:7;91847:18;:41::i;:::-;91839:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;91955:28;91965:4;91971:2;91975:7;91955:9;:28::i;:::-;91652:339;;;:::o;102157:256::-;102254:7;102290:23;102307:5;102290:16;:23::i;:::-;102282:5;:31;102274:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;102379:12;:19;102392:5;102379:19;;;;;;;;;;;;;;;:26;102399:5;102379:26;;;;;;;;;;;;102372:33;;102157:256;;;;:::o;108476:30::-;;;;:::o;110882:323::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;111021:7:::1;111042:13;;;;;;;;;;;111034:27;;111069:21;111034:61;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;111020:75;;;111110:2;111102:11;;;::::0;::::1;;110927:278;110882:323::o:0;108893:553::-;108963:14;108980:13;:11;:13::i;:::-;108963:30;;109018:7;:5;:7::i;:::-;109004:21;;:10;:21;;;109000:219;;109046:12;;;;;;;;;;;109038:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;109117:11;109110:4;;:18;;;;:::i;:::-;109097:9;:31;;109089:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;109180:15;;109161;:34;;109153:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;109000:219;109247:1;109233:11;:15;109225:24;;;;;;109279:13;;109264:11;:28;;109256:37;;;;;;109332:9;;109317:11;109308:6;:20;;;;:::i;:::-;:33;;109300:42;;;;;;109356:9;109351:90;109390:1;109376:11;:15;;;;:::i;:::-;109371:1;:20;109351:90;;109407:26;109417:3;109431:1;109422:6;:10;;;;:::i;:::-;109407:9;:26::i;:::-;109393:3;;;;;:::i;:::-;;;;109351:90;;;;108956:490;108893:553;;:::o;92062:185::-;92200:39;92217:4;92223:2;92227:7;92200:39;;;;;;;;;;;;:16;:39::i;:::-;92062:185;;;:::o;109452:348::-;109527:16;109555:23;109581:17;109591:6;109581:9;:17::i;:::-;109555:43;;109605:25;109647:15;109633:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;109605:58;;109675:9;109670:103;109690:15;109686:1;:19;109670:103;;;109735:30;109755:6;109763:1;109735:19;:30::i;:::-;109721:8;109730:1;109721:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;109707:3;;;;;:::i;:::-;;;;109670:103;;;;109786:8;109779:15;;;;109452:348;;;:::o;110347:80::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110413:8:::1;110406:4;:15;;;;110347:80:::0;:::o;102679:233::-;102754:7;102790:30;:28;:30::i;:::-;102782:5;:38;102774:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;102887:10;102898:5;102887:17;;;;;;;;:::i;:::-;;;;;;;;;;102880:24;;102679:233;;;:::o;110555:98::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110636:11:::1;110626:7;:21;;;;;;;;;;;;:::i;:::-;;110555:98:::0;:::o;108398:73::-;;;;;;;;;;;;;:::o;89037:239::-;89109:7;89129:13;89145:7;:16;89153:7;89145:16;;;;;;;;;;;;;;;;;;;;;89129:32;;89197:1;89180:19;;:5;:19;;;;89172:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;89263:5;89256:12;;;89037:239;;;:::o;108182:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;88767:208::-;88839:7;88884:1;88867:19;;:5;:19;;;;88859:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;88951:9;:16;88961:5;88951:16;;;;;;;;;;;;;;;;88944:23;;88767:208;;;:::o;68313:103::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68378:30:::1;68405:1;68378:18;:30::i;:::-;68313:103::o:0;110433:116::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110526:17:::1;110510:13;:33;;;;110433:116:::0;:::o;67662:87::-;67708:7;67735:6;;;;;;;;;;;67728:13;;67662:87;:::o;89512:104::-;89568:13;89601:7;89594:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;89512:104;:::o;91195:155::-;91290:52;91309:12;:10;:12::i;:::-;91323:8;91333;91290:18;:52::i;:::-;91195:155;;:::o;92318:328::-;92493:41;92512:12;:10;:12::i;:::-;92526:7;92493:18;:41::i;:::-;92485:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;92599:39;92613:4;92619:2;92623:7;92632:5;92599:13;:39::i;:::-;92318:328;;;;:::o;108208:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;109806:423::-;109904:13;109945:16;109953:7;109945;:16::i;:::-;109929:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;110035:28;110066:10;:8;:10::i;:::-;110035:41;;110121:1;110096:14;110090:28;:32;:133;;;;;;;;;;;;;;;;;110158:14;110174:18;:7;:16;:18::i;:::-;110194:13;110141:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;110090:133;110083:140;;;109806:423;;;:::o;108287:32::-;;;;:::o;110659:122::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;110758:17:::1;110742:13;:33;;;;;;;;;;;;:::i;:::-;;110659:122:::0;:::o;91421:164::-;91518:4;91542:18;:25;91561:5;91542:25;;;;;;;;;;;;;;;:35;91568:8;91542:35;;;;;;;;;;;;;;;;;;;;;;;;;91535:42;;91421:164;;;;:::o;108362:31::-;;;;;;;;;;;;;:::o;68571:201::-;67893:12;:10;:12::i;:::-;67882:23;;:7;:5;:7::i;:::-;:23;;;67874:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;68680:1:::1;68660:22;;:8;:22;;;;68652:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;68736:28;68755:8;68736:18;:28::i;:::-;68571:201:::0;:::o;69950:387::-;70010:4;70218:12;70285:7;70273:20;70265:28;;70328:1;70321:4;:8;70314:15;;;69950:387;;;:::o;100705:126::-;;;;:::o;88398:305::-;88500:4;88552:25;88537:40;;;:11;:40;;;;:105;;;;88609:33;88594:48;;;:11;:48;;;;88537:105;:158;;;;88659:36;88683:11;88659:23;:36::i;:::-;88537:158;88517:178;;88398:305;;;:::o;66386:98::-;66439:7;66466:10;66459:17;;66386:98;:::o;94156:127::-;94221:4;94273:1;94245:30;;:7;:16;94253:7;94245:16;;;;;;;;;;;;;;;;;;;;;:30;;;;94238:37;;94156:127;;;:::o;98138:174::-;98240:2;98213:15;:24;98229:7;98213:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;98296:7;98292:2;98258:46;;98267:23;98282:7;98267:14;:23::i;:::-;98258:46;;;;;;;;;;;;98138:174;;:::o;94450:348::-;94543:4;94568:16;94576:7;94568;:16::i;:::-;94560:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;94644:13;94660:23;94675:7;94660:14;:23::i;:::-;94644:39;;94713:5;94702:16;;:7;:16;;;:51;;;;94746:7;94722:31;;:20;94734:7;94722:11;:20::i;:::-;:31;;;94702:51;:87;;;;94757:32;94774:5;94781:7;94757:16;:32::i;:::-;94702:87;94694:96;;;94450:348;;;;:::o;97442:578::-;97601:4;97574:31;;:23;97589:7;97574:14;:23::i;:::-;:31;;;97566:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;97684:1;97670:16;;:2;:16;;;;97662:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;97740:39;97761:4;97767:2;97771:7;97740:20;:39::i;:::-;97844:29;97861:1;97865:7;97844:8;:29::i;:::-;97905:1;97886:9;:15;97896:4;97886:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;97934:1;97917:9;:13;97927:2;97917:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;97965:2;97946:7;:16;97954:7;97946:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;98004:7;98000:2;97985:27;;97994:4;97985:27;;;;;;;;;;;;97442:578;;;:::o;95140:110::-;95216:26;95226:2;95230:7;95216:26;;;;;;;;;;;;:9;:26::i;:::-;95140:110;;:::o;68932:191::-;69006:16;69025:6;;;;;;;;;;;69006:25;;69051:8;69042:6;;:17;;;;;;;;;;;;;;;;;;69106:8;69075:40;;69096:8;69075:40;;;;;;;;;;;;68995:128;68932:191;:::o;98454:315::-;98609:8;98600:17;;:5;:17;;;;98592:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;98696:8;98658:18;:25;98677:5;98658:25;;;;;;;;;;;;;;;:35;98684:8;98658:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;98742:8;98720:41;;98735:5;98720:41;;;98752:8;98720:41;;;;;;:::i;:::-;;;;;;;;98454:315;;;:::o;93528:::-;93685:28;93695:4;93701:2;93705:7;93685:9;:28::i;:::-;93732:48;93755:4;93761:2;93765:7;93774:5;93732:22;:48::i;:::-;93724:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;93528:315;;;;:::o;108784:102::-;108844:13;108873:7;108866:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108784:102;:::o;63948:723::-;64004:13;64234:1;64225:5;:10;64221:53;;;64252:10;;;;;;;;;;;;;;;;;;;;;64221:53;64284:12;64299:5;64284:20;;64315:14;64340:78;64355:1;64347:4;:9;64340:78;;64373:8;;;;;:::i;:::-;;;;64404:2;64396:10;;;;;:::i;:::-;;;64340:78;;;64428:19;64460:6;64450:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64428:39;;64478:154;64494:1;64485:5;:10;64478:154;;64522:1;64512:11;;;;;:::i;:::-;;;64589:2;64581:5;:10;;;;:::i;:::-;64568:2;:24;;;;:::i;:::-;64555:39;;64538:6;64545;64538:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;64618:2;64609:11;;;;;:::i;:::-;;;64478:154;;;64656:6;64642:21;;;;;63948:723;;;;:::o;80094:157::-;80179:4;80218:25;80203:40;;;:11;:40;;;;80196:47;;80094:157;;;:::o;103525:589::-;103669:45;103696:4;103702:2;103706:7;103669:26;:45::i;:::-;103747:1;103731:18;;:4;:18;;;103727:187;;;103766:40;103798:7;103766:31;:40::i;:::-;103727:187;;;103836:2;103828:10;;:4;:10;;;103824:90;;103855:47;103888:4;103894:7;103855:32;:47::i;:::-;103824:90;103727:187;103942:1;103928:16;;:2;:16;;;103924:183;;;103961:45;103998:7;103961:36;:45::i;:::-;103924:183;;;104034:4;104028:10;;:2;:10;;;104024:83;;104055:40;104083:2;104087:7;104055:27;:40::i;:::-;104024:83;103924:183;103525:589;;;:::o;95477:321::-;95607:18;95613:2;95617:7;95607:5;:18::i;:::-;95658:54;95689:1;95693:2;95697:7;95706:5;95658:22;:54::i;:::-;95636:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;95477:321;;;:::o;99334:799::-;99489:4;99510:15;:2;:13;;;:15::i;:::-;99506:620;;;99562:2;99546:36;;;99583:12;:10;:12::i;:::-;99597:4;99603:7;99612:5;99546:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;99542:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;99805:1;99788:6;:13;:18;99784:272;;;99831:60;;;;;;;;;;:::i;:::-;;;;;;;;99784:272;100006:6;100000:13;99991:6;99987:2;99983:15;99976:38;99542:529;99679:41;;;99669:51;;;:6;:51;;;;99662:58;;;;;99506:620;100110:4;100103:11;;99334:799;;;;;;;:::o;104837:164::-;104941:10;:17;;;;104914:15;:24;104930:7;104914:24;;;;;;;;;;;:44;;;;104969:10;104985:7;104969:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;104837:164;:::o;105628:988::-;105894:22;105944:1;105919:22;105936:4;105919:16;:22::i;:::-;:26;;;;:::i;:::-;105894:51;;105956:18;105977:17;:26;105995:7;105977:26;;;;;;;;;;;;105956:47;;106124:14;106110:10;:28;106106:328;;106155:19;106177:12;:18;106190:4;106177:18;;;;;;;;;;;;;;;:34;106196:14;106177:34;;;;;;;;;;;;106155:56;;106261:11;106228:12;:18;106241:4;106228:18;;;;;;;;;;;;;;;:30;106247:10;106228:30;;;;;;;;;;;:44;;;;106378:10;106345:17;:30;106363:11;106345:30;;;;;;;;;;;:43;;;;106140:294;106106:328;106530:17;:26;106548:7;106530:26;;;;;;;;;;;106523:33;;;106574:12;:18;106587:4;106574:18;;;;;;;;;;;;;;;:34;106593:14;106574:34;;;;;;;;;;;106567:41;;;105709:907;;105628:988;;:::o;106911:1079::-;107164:22;107209:1;107189:10;:17;;;;:21;;;;:::i;:::-;107164:46;;107221:18;107242:15;:24;107258:7;107242:24;;;;;;;;;;;;107221:45;;107593:19;107615:10;107626:14;107615:26;;;;;;;;:::i;:::-;;;;;;;;;;107593:48;;107679:11;107654:10;107665;107654:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;107790:10;107759:15;:28;107775:11;107759:28;;;;;;;;;;;:41;;;;107931:15;:24;107947:7;107931:24;;;;;;;;;;;107924:31;;;107966:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;106982:1008;;;106911:1079;:::o;104415:221::-;104500:14;104517:20;104534:2;104517:16;:20::i;:::-;104500:37;;104575:7;104548:12;:16;104561:2;104548:16;;;;;;;;;;;;;;;:24;104565:6;104548:24;;;;;;;;;;;:34;;;;104622:6;104593:17;:26;104611:7;104593:26;;;;;;;;;;;:35;;;;104489:147;104415:221;;:::o;96134:382::-;96228:1;96214:16;;:2;:16;;;;96206:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;96287:16;96295:7;96287;:16::i;:::-;96286:17;96278:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;96349:45;96378:1;96382:2;96386:7;96349:20;:45::i;:::-;96424:1;96407:9;:13;96417:2;96407:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;96455:2;96436:7;:16;96444:7;96436:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;96500:7;96496:2;96475:33;;96492:1;96475:33;;;;;;;;;;;;96134:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:329::-;2336:6;2385:2;2373:9;2364:7;2360:23;2356:32;2353:119;;;2391:79;;:::i;:::-;2353:119;2511:1;2536:53;2581:7;2572:6;2561:9;2557:22;2536:53;:::i;:::-;2526:63;;2482:117;2277:329;;;;:::o;2612:474::-;2680:6;2688;2737:2;2725:9;2716:7;2712:23;2708:32;2705:119;;;2743:79;;:::i;:::-;2705:119;2863:1;2888:53;2933:7;2924:6;2913:9;2909:22;2888:53;:::i;:::-;2878:63;;2834:117;2990:2;3016:53;3061:7;3052:6;3041:9;3037:22;3016:53;:::i;:::-;3006:63;;2961:118;2612:474;;;;;:::o;3092:619::-;3169:6;3177;3185;3234:2;3222:9;3213:7;3209:23;3205:32;3202:119;;;3240:79;;:::i;:::-;3202:119;3360:1;3385:53;3430:7;3421:6;3410:9;3406:22;3385:53;:::i;:::-;3375:63;;3331:117;3487:2;3513:53;3558:7;3549:6;3538:9;3534:22;3513:53;:::i;:::-;3503:63;;3458:118;3615:2;3641:53;3686:7;3677:6;3666:9;3662:22;3641:53;:::i;:::-;3631:63;;3586:118;3092:619;;;;;:::o;3717:943::-;3812:6;3820;3828;3836;3885:3;3873:9;3864:7;3860:23;3856:33;3853:120;;;3892:79;;:::i;:::-;3853:120;4012:1;4037:53;4082:7;4073:6;4062:9;4058:22;4037:53;:::i;:::-;4027:63;;3983:117;4139:2;4165:53;4210:7;4201:6;4190:9;4186:22;4165:53;:::i;:::-;4155:63;;4110:118;4267:2;4293:53;4338:7;4329:6;4318:9;4314:22;4293:53;:::i;:::-;4283:63;;4238:118;4423:2;4412:9;4408:18;4395:32;4454:18;4446:6;4443:30;4440:117;;;4476:79;;:::i;:::-;4440:117;4581:62;4635:7;4626:6;4615:9;4611:22;4581:62;:::i;:::-;4571:72;;4366:287;3717:943;;;;;;;:::o;4666:468::-;4731:6;4739;4788:2;4776:9;4767:7;4763:23;4759:32;4756:119;;;4794:79;;:::i;:::-;4756:119;4914:1;4939:53;4984:7;4975:6;4964:9;4960:22;4939:53;:::i;:::-;4929:63;;4885:117;5041:2;5067:50;5109:7;5100:6;5089:9;5085:22;5067:50;:::i;:::-;5057:60;;5012:115;4666:468;;;;;:::o;5140:474::-;5208:6;5216;5265:2;5253:9;5244:7;5240:23;5236:32;5233:119;;;5271:79;;:::i;:::-;5233:119;5391:1;5416:53;5461:7;5452:6;5441:9;5437:22;5416:53;:::i;:::-;5406:63;;5362:117;5518:2;5544:53;5589:7;5580:6;5569:9;5565:22;5544:53;:::i;:::-;5534:63;;5489:118;5140:474;;;;;:::o;5620:323::-;5676:6;5725:2;5713:9;5704:7;5700:23;5696:32;5693:119;;;5731:79;;:::i;:::-;5693:119;5851:1;5876:50;5918:7;5909:6;5898:9;5894:22;5876:50;:::i;:::-;5866:60;;5822:114;5620:323;;;;:::o;5949:327::-;6007:6;6056:2;6044:9;6035:7;6031:23;6027:32;6024:119;;;6062:79;;:::i;:::-;6024:119;6182:1;6207:52;6251:7;6242:6;6231:9;6227:22;6207:52;:::i;:::-;6197:62;;6153:116;5949:327;;;;:::o;6282:349::-;6351:6;6400:2;6388:9;6379:7;6375:23;6371:32;6368:119;;;6406:79;;:::i;:::-;6368:119;6526:1;6551:63;6606:7;6597:6;6586:9;6582:22;6551:63;:::i;:::-;6541:73;;6497:127;6282:349;;;;:::o;6637:509::-;6706:6;6755:2;6743:9;6734:7;6730:23;6726:32;6723:119;;;6761:79;;:::i;:::-;6723:119;6909:1;6898:9;6894:17;6881:31;6939:18;6931:6;6928:30;6925:117;;;6961:79;;:::i;:::-;6925:117;7066:63;7121:7;7112:6;7101:9;7097:22;7066:63;:::i;:::-;7056:73;;6852:287;6637:509;;;;:::o;7152:329::-;7211:6;7260:2;7248:9;7239:7;7235:23;7231:32;7228:119;;;7266:79;;:::i;:::-;7228:119;7386:1;7411:53;7456:7;7447:6;7436:9;7432:22;7411:53;:::i;:::-;7401:63;;7357:117;7152:329;;;;:::o;7487:179::-;7556:10;7577:46;7619:3;7611:6;7577:46;:::i;:::-;7655:4;7650:3;7646:14;7632:28;;7487:179;;;;:::o;7672:118::-;7759:24;7777:5;7759:24;:::i;:::-;7754:3;7747:37;7672:118;;:::o;7826:732::-;7945:3;7974:54;8022:5;7974:54;:::i;:::-;8044:86;8123:6;8118:3;8044:86;:::i;:::-;8037:93;;8154:56;8204:5;8154:56;:::i;:::-;8233:7;8264:1;8249:284;8274:6;8271:1;8268:13;8249:284;;;8350:6;8344:13;8377:63;8436:3;8421:13;8377:63;:::i;:::-;8370:70;;8463:60;8516:6;8463:60;:::i;:::-;8453:70;;8309:224;8296:1;8293;8289:9;8284:14;;8249:284;;;8253:14;8549:3;8542:10;;7950:608;;;7826:732;;;;:::o;8564:109::-;8645:21;8660:5;8645:21;:::i;:::-;8640:3;8633:34;8564:109;;:::o;8679:360::-;8765:3;8793:38;8825:5;8793:38;:::i;:::-;8847:70;8910:6;8905:3;8847:70;:::i;:::-;8840:77;;8926:52;8971:6;8966:3;8959:4;8952:5;8948:16;8926:52;:::i;:::-;9003:29;9025:6;9003:29;:::i;:::-;8998:3;8994:39;8987:46;;8769:270;8679:360;;;;:::o;9045:364::-;9133:3;9161:39;9194:5;9161:39;:::i;:::-;9216:71;9280:6;9275:3;9216:71;:::i;:::-;9209:78;;9296:52;9341:6;9336:3;9329:4;9322:5;9318:16;9296:52;:::i;:::-;9373:29;9395:6;9373:29;:::i;:::-;9368:3;9364:39;9357:46;;9137:272;9045:364;;;;:::o;9415:377::-;9521:3;9549:39;9582:5;9549:39;:::i;:::-;9604:89;9686:6;9681:3;9604:89;:::i;:::-;9597:96;;9702:52;9747:6;9742:3;9735:4;9728:5;9724:16;9702:52;:::i;:::-;9779:6;9774:3;9770:16;9763:23;;9525:267;9415:377;;;;:::o;9822:845::-;9925:3;9962:5;9956:12;9991:36;10017:9;9991:36;:::i;:::-;10043:89;10125:6;10120:3;10043:89;:::i;:::-;10036:96;;10163:1;10152:9;10148:17;10179:1;10174:137;;;;10325:1;10320:341;;;;10141:520;;10174:137;10258:4;10254:9;10243;10239:25;10234:3;10227:38;10294:6;10289:3;10285:16;10278:23;;10174:137;;10320:341;10387:38;10419:5;10387:38;:::i;:::-;10447:1;10461:154;10475:6;10472:1;10469:13;10461:154;;;10549:7;10543:14;10539:1;10534:3;10530:11;10523:35;10599:1;10590:7;10586:15;10575:26;;10497:4;10494:1;10490:12;10485:17;;10461:154;;;10644:6;10639:3;10635:16;10628:23;;10327:334;;10141:520;;9929:738;;9822:845;;;;:::o;10673:366::-;10815:3;10836:67;10900:2;10895:3;10836:67;:::i;:::-;10829:74;;10912:93;11001:3;10912:93;:::i;:::-;11030:2;11025:3;11021:12;11014:19;;10673:366;;;:::o;11045:::-;11187:3;11208:67;11272:2;11267:3;11208:67;:::i;:::-;11201:74;;11284:93;11373:3;11284:93;:::i;:::-;11402:2;11397:3;11393:12;11386:19;;11045:366;;;:::o;11417:::-;11559:3;11580:67;11644:2;11639:3;11580:67;:::i;:::-;11573:74;;11656:93;11745:3;11656:93;:::i;:::-;11774:2;11769:3;11765:12;11758:19;;11417:366;;;:::o;11789:::-;11931:3;11952:67;12016:2;12011:3;11952:67;:::i;:::-;11945:74;;12028:93;12117:3;12028:93;:::i;:::-;12146:2;12141:3;12137:12;12130:19;;11789:366;;;:::o;12161:::-;12303:3;12324:67;12388:2;12383:3;12324:67;:::i;:::-;12317:74;;12400:93;12489:3;12400:93;:::i;:::-;12518:2;12513:3;12509:12;12502:19;;12161:366;;;:::o;12533:::-;12675:3;12696:67;12760:2;12755:3;12696:67;:::i;:::-;12689:74;;12772:93;12861:3;12772:93;:::i;:::-;12890:2;12885:3;12881:12;12874:19;;12533:366;;;:::o;12905:::-;13047:3;13068:67;13132:2;13127:3;13068:67;:::i;:::-;13061:74;;13144:93;13233:3;13144:93;:::i;:::-;13262:2;13257:3;13253:12;13246:19;;12905:366;;;:::o;13277:::-;13419:3;13440:67;13504:2;13499:3;13440:67;:::i;:::-;13433:74;;13516:93;13605:3;13516:93;:::i;:::-;13634:2;13629:3;13625:12;13618:19;;13277:366;;;:::o;13649:::-;13791:3;13812:67;13876:2;13871:3;13812:67;:::i;:::-;13805:74;;13888:93;13977:3;13888:93;:::i;:::-;14006:2;14001:3;13997:12;13990:19;;13649:366;;;:::o;14021:::-;14163:3;14184:67;14248:2;14243:3;14184:67;:::i;:::-;14177:74;;14260:93;14349:3;14260:93;:::i;:::-;14378:2;14373:3;14369:12;14362:19;;14021:366;;;:::o;14393:::-;14535:3;14556:67;14620:2;14615:3;14556:67;:::i;:::-;14549:74;;14632:93;14721:3;14632:93;:::i;:::-;14750:2;14745:3;14741:12;14734:19;;14393:366;;;:::o;14765:::-;14907:3;14928:67;14992:2;14987:3;14928:67;:::i;:::-;14921:74;;15004:93;15093:3;15004:93;:::i;:::-;15122:2;15117:3;15113:12;15106:19;;14765:366;;;:::o;15137:::-;15279:3;15300:67;15364:2;15359:3;15300:67;:::i;:::-;15293:74;;15376:93;15465:3;15376:93;:::i;:::-;15494:2;15489:3;15485:12;15478:19;;15137:366;;;:::o;15509:::-;15651:3;15672:67;15736:2;15731:3;15672:67;:::i;:::-;15665:74;;15748:93;15837:3;15748:93;:::i;:::-;15866:2;15861:3;15857:12;15850:19;;15509:366;;;:::o;15881:::-;16023:3;16044:67;16108:2;16103:3;16044:67;:::i;:::-;16037:74;;16120:93;16209:3;16120:93;:::i;:::-;16238:2;16233:3;16229:12;16222:19;;15881:366;;;:::o;16253:::-;16395:3;16416:67;16480:2;16475:3;16416:67;:::i;:::-;16409:74;;16492:93;16581:3;16492:93;:::i;:::-;16610:2;16605:3;16601:12;16594:19;;16253:366;;;:::o;16625:::-;16767:3;16788:67;16852:2;16847:3;16788:67;:::i;:::-;16781:74;;16864:93;16953:3;16864:93;:::i;:::-;16982:2;16977:3;16973:12;16966:19;;16625:366;;;:::o;16997:::-;17139:3;17160:67;17224:2;17219:3;17160:67;:::i;:::-;17153:74;;17236:93;17325:3;17236:93;:::i;:::-;17354:2;17349:3;17345:12;17338:19;;16997:366;;;:::o;17369:398::-;17528:3;17549:83;17630:1;17625:3;17549:83;:::i;:::-;17542:90;;17641:93;17730:3;17641:93;:::i;:::-;17759:1;17754:3;17750:11;17743:18;;17369:398;;;:::o;17773:366::-;17915:3;17936:67;18000:2;17995:3;17936:67;:::i;:::-;17929:74;;18012:93;18101:3;18012:93;:::i;:::-;18130:2;18125:3;18121:12;18114:19;;17773:366;;;:::o;18145:365::-;18287:3;18308:66;18372:1;18367:3;18308:66;:::i;:::-;18301:73;;18383:93;18472:3;18383:93;:::i;:::-;18501:2;18496:3;18492:12;18485:19;;18145:365;;;:::o;18516:366::-;18658:3;18679:67;18743:2;18738:3;18679:67;:::i;:::-;18672:74;;18755:93;18844:3;18755:93;:::i;:::-;18873:2;18868:3;18864:12;18857:19;;18516:366;;;:::o;18888:108::-;18965:24;18983:5;18965:24;:::i;:::-;18960:3;18953:37;18888:108;;:::o;19002:118::-;19089:24;19107:5;19089:24;:::i;:::-;19084:3;19077:37;19002:118;;:::o;19126:589::-;19351:3;19373:95;19464:3;19455:6;19373:95;:::i;:::-;19366:102;;19485:95;19576:3;19567:6;19485:95;:::i;:::-;19478:102;;19597:92;19685:3;19676:6;19597:92;:::i;:::-;19590:99;;19706:3;19699:10;;19126:589;;;;;;:::o;19721:379::-;19905:3;19927:147;20070:3;19927:147;:::i;:::-;19920:154;;20091:3;20084:10;;19721:379;;;:::o;20106:222::-;20199:4;20237:2;20226:9;20222:18;20214:26;;20250:71;20318:1;20307:9;20303:17;20294:6;20250:71;:::i;:::-;20106:222;;;;:::o;20334:640::-;20529:4;20567:3;20556:9;20552:19;20544:27;;20581:71;20649:1;20638:9;20634:17;20625:6;20581:71;:::i;:::-;20662:72;20730:2;20719:9;20715:18;20706:6;20662:72;:::i;:::-;20744;20812:2;20801:9;20797:18;20788:6;20744:72;:::i;:::-;20863:9;20857:4;20853:20;20848:2;20837:9;20833:18;20826:48;20891:76;20962:4;20953:6;20891:76;:::i;:::-;20883:84;;20334:640;;;;;;;:::o;20980:373::-;21123:4;21161:2;21150:9;21146:18;21138:26;;21210:9;21204:4;21200:20;21196:1;21185:9;21181:17;21174:47;21238:108;21341:4;21332:6;21238:108;:::i;:::-;21230:116;;20980:373;;;;:::o;21359:210::-;21446:4;21484:2;21473:9;21469:18;21461:26;;21497:65;21559:1;21548:9;21544:17;21535:6;21497:65;:::i;:::-;21359:210;;;;:::o;21575:313::-;21688:4;21726:2;21715:9;21711:18;21703:26;;21775:9;21769:4;21765:20;21761:1;21750:9;21746:17;21739:47;21803:78;21876:4;21867:6;21803:78;:::i;:::-;21795:86;;21575:313;;;;:::o;21894:419::-;22060:4;22098:2;22087:9;22083:18;22075:26;;22147:9;22141:4;22137:20;22133:1;22122:9;22118:17;22111:47;22175:131;22301:4;22175:131;:::i;:::-;22167:139;;21894:419;;;:::o;22319:::-;22485:4;22523:2;22512:9;22508:18;22500:26;;22572:9;22566:4;22562:20;22558:1;22547:9;22543:17;22536:47;22600:131;22726:4;22600:131;:::i;:::-;22592:139;;22319:419;;;:::o;22744:::-;22910:4;22948:2;22937:9;22933:18;22925:26;;22997:9;22991:4;22987:20;22983:1;22972:9;22968:17;22961:47;23025:131;23151:4;23025:131;:::i;:::-;23017:139;;22744:419;;;:::o;23169:::-;23335:4;23373:2;23362:9;23358:18;23350:26;;23422:9;23416:4;23412:20;23408:1;23397:9;23393:17;23386:47;23450:131;23576:4;23450:131;:::i;:::-;23442:139;;23169:419;;;:::o;23594:::-;23760:4;23798:2;23787:9;23783:18;23775:26;;23847:9;23841:4;23837:20;23833:1;23822:9;23818:17;23811:47;23875:131;24001:4;23875:131;:::i;:::-;23867:139;;23594:419;;;:::o;24019:::-;24185:4;24223:2;24212:9;24208:18;24200:26;;24272:9;24266:4;24262:20;24258:1;24247:9;24243:17;24236:47;24300:131;24426:4;24300:131;:::i;:::-;24292:139;;24019:419;;;:::o;24444:::-;24610:4;24648:2;24637:9;24633:18;24625:26;;24697:9;24691:4;24687:20;24683:1;24672:9;24668:17;24661:47;24725:131;24851:4;24725:131;:::i;:::-;24717:139;;24444:419;;;:::o;24869:::-;25035:4;25073:2;25062:9;25058:18;25050:26;;25122:9;25116:4;25112:20;25108:1;25097:9;25093:17;25086:47;25150:131;25276:4;25150:131;:::i;:::-;25142:139;;24869:419;;;:::o;25294:::-;25460:4;25498:2;25487:9;25483:18;25475:26;;25547:9;25541:4;25537:20;25533:1;25522:9;25518:17;25511:47;25575:131;25701:4;25575:131;:::i;:::-;25567:139;;25294:419;;;:::o;25719:::-;25885:4;25923:2;25912:9;25908:18;25900:26;;25972:9;25966:4;25962:20;25958:1;25947:9;25943:17;25936:47;26000:131;26126:4;26000:131;:::i;:::-;25992:139;;25719:419;;;:::o;26144:::-;26310:4;26348:2;26337:9;26333:18;26325:26;;26397:9;26391:4;26387:20;26383:1;26372:9;26368:17;26361:47;26425:131;26551:4;26425:131;:::i;:::-;26417:139;;26144:419;;;:::o;26569:::-;26735:4;26773:2;26762:9;26758:18;26750:26;;26822:9;26816:4;26812:20;26808:1;26797:9;26793:17;26786:47;26850:131;26976:4;26850:131;:::i;:::-;26842:139;;26569:419;;;:::o;26994:::-;27160:4;27198:2;27187:9;27183:18;27175:26;;27247:9;27241:4;27237:20;27233:1;27222:9;27218:17;27211:47;27275:131;27401:4;27275:131;:::i;:::-;27267:139;;26994:419;;;:::o;27419:::-;27585:4;27623:2;27612:9;27608:18;27600:26;;27672:9;27666:4;27662:20;27658:1;27647:9;27643:17;27636:47;27700:131;27826:4;27700:131;:::i;:::-;27692:139;;27419:419;;;:::o;27844:::-;28010:4;28048:2;28037:9;28033:18;28025:26;;28097:9;28091:4;28087:20;28083:1;28072:9;28068:17;28061:47;28125:131;28251:4;28125:131;:::i;:::-;28117:139;;27844:419;;;:::o;28269:::-;28435:4;28473:2;28462:9;28458:18;28450:26;;28522:9;28516:4;28512:20;28508:1;28497:9;28493:17;28486:47;28550:131;28676:4;28550:131;:::i;:::-;28542:139;;28269:419;;;:::o;28694:::-;28860:4;28898:2;28887:9;28883:18;28875:26;;28947:9;28941:4;28937:20;28933:1;28922:9;28918:17;28911:47;28975:131;29101:4;28975:131;:::i;:::-;28967:139;;28694:419;;;:::o;29119:::-;29285:4;29323:2;29312:9;29308:18;29300:26;;29372:9;29366:4;29362:20;29358:1;29347:9;29343:17;29336:47;29400:131;29526:4;29400:131;:::i;:::-;29392:139;;29119:419;;;:::o;29544:::-;29710:4;29748:2;29737:9;29733:18;29725:26;;29797:9;29791:4;29787:20;29783:1;29772:9;29768:17;29761:47;29825:131;29951:4;29825:131;:::i;:::-;29817:139;;29544:419;;;:::o;29969:::-;30135:4;30173:2;30162:9;30158:18;30150:26;;30222:9;30216:4;30212:20;30208:1;30197:9;30193:17;30186:47;30250:131;30376:4;30250:131;:::i;:::-;30242:139;;29969:419;;;:::o;30394:::-;30560:4;30598:2;30587:9;30583:18;30575:26;;30647:9;30641:4;30637:20;30633:1;30622:9;30618:17;30611:47;30675:131;30801:4;30675:131;:::i;:::-;30667:139;;30394:419;;;:::o;30819:222::-;30912:4;30950:2;30939:9;30935:18;30927:26;;30963:71;31031:1;31020:9;31016:17;31007:6;30963:71;:::i;:::-;30819:222;;;;:::o;31047:129::-;31081:6;31108:20;;:::i;:::-;31098:30;;31137:33;31165:4;31157:6;31137:33;:::i;:::-;31047:129;;;:::o;31182:75::-;31215:6;31248:2;31242:9;31232:19;;31182:75;:::o;31263:307::-;31324:4;31414:18;31406:6;31403:30;31400:56;;;31436:18;;:::i;:::-;31400:56;31474:29;31496:6;31474:29;:::i;:::-;31466:37;;31558:4;31552;31548:15;31540:23;;31263:307;;;:::o;31576:308::-;31638:4;31728:18;31720:6;31717:30;31714:56;;;31750:18;;:::i;:::-;31714:56;31788:29;31810:6;31788:29;:::i;:::-;31780:37;;31872:4;31866;31862:15;31854:23;;31576:308;;;:::o;31890:132::-;31957:4;31980:3;31972:11;;32010:4;32005:3;32001:14;31993:22;;31890:132;;;:::o;32028:141::-;32077:4;32100:3;32092:11;;32123:3;32120:1;32113:14;32157:4;32154:1;32144:18;32136:26;;32028:141;;;:::o;32175:114::-;32242:6;32276:5;32270:12;32260:22;;32175:114;;;:::o;32295:98::-;32346:6;32380:5;32374:12;32364:22;;32295:98;;;:::o;32399:99::-;32451:6;32485:5;32479:12;32469:22;;32399:99;;;:::o;32504:113::-;32574:4;32606;32601:3;32597:14;32589:22;;32504:113;;;:::o;32623:184::-;32722:11;32756:6;32751:3;32744:19;32796:4;32791:3;32787:14;32772:29;;32623:184;;;;:::o;32813:168::-;32896:11;32930:6;32925:3;32918:19;32970:4;32965:3;32961:14;32946:29;;32813:168;;;;:::o;32987:147::-;33088:11;33125:3;33110:18;;32987:147;;;;:::o;33140:169::-;33224:11;33258:6;33253:3;33246:19;33298:4;33293:3;33289:14;33274:29;;33140:169;;;;:::o;33315:148::-;33417:11;33454:3;33439:18;;33315:148;;;;:::o;33469:305::-;33509:3;33528:20;33546:1;33528:20;:::i;:::-;33523:25;;33562:20;33580:1;33562:20;:::i;:::-;33557:25;;33716:1;33648:66;33644:74;33641:1;33638:81;33635:107;;;33722:18;;:::i;:::-;33635:107;33766:1;33763;33759:9;33752:16;;33469:305;;;;:::o;33780:185::-;33820:1;33837:20;33855:1;33837:20;:::i;:::-;33832:25;;33871:20;33889:1;33871:20;:::i;:::-;33866:25;;33910:1;33900:35;;33915:18;;:::i;:::-;33900:35;33957:1;33954;33950:9;33945:14;;33780:185;;;;:::o;33971:348::-;34011:7;34034:20;34052:1;34034:20;:::i;:::-;34029:25;;34068:20;34086:1;34068:20;:::i;:::-;34063:25;;34256:1;34188:66;34184:74;34181:1;34178:81;34173:1;34166:9;34159:17;34155:105;34152:131;;;34263:18;;:::i;:::-;34152:131;34311:1;34308;34304:9;34293:20;;33971:348;;;;:::o;34325:191::-;34365:4;34385:20;34403:1;34385:20;:::i;:::-;34380:25;;34419:20;34437:1;34419:20;:::i;:::-;34414:25;;34458:1;34455;34452:8;34449:34;;;34463:18;;:::i;:::-;34449:34;34508:1;34505;34501:9;34493:17;;34325:191;;;;:::o;34522:96::-;34559:7;34588:24;34606:5;34588:24;:::i;:::-;34577:35;;34522:96;;;:::o;34624:90::-;34658:7;34701:5;34694:13;34687:21;34676:32;;34624:90;;;:::o;34720:149::-;34756:7;34796:66;34789:5;34785:78;34774:89;;34720:149;;;:::o;34875:126::-;34912:7;34952:42;34945:5;34941:54;34930:65;;34875:126;;;:::o;35007:77::-;35044:7;35073:5;35062:16;;35007:77;;;:::o;35090:154::-;35174:6;35169:3;35164;35151:30;35236:1;35227:6;35222:3;35218:16;35211:27;35090:154;;;:::o;35250:307::-;35318:1;35328:113;35342:6;35339:1;35336:13;35328:113;;;35427:1;35422:3;35418:11;35412:18;35408:1;35403:3;35399:11;35392:39;35364:2;35361:1;35357:10;35352:15;;35328:113;;;35459:6;35456:1;35453:13;35450:101;;;35539:1;35530:6;35525:3;35521:16;35514:27;35450:101;35299:258;35250:307;;;:::o;35563:320::-;35607:6;35644:1;35638:4;35634:12;35624:22;;35691:1;35685:4;35681:12;35712:18;35702:81;;35768:4;35760:6;35756:17;35746:27;;35702:81;35830:2;35822:6;35819:14;35799:18;35796:38;35793:84;;;35849:18;;:::i;:::-;35793:84;35614:269;35563:320;;;:::o;35889:281::-;35972:27;35994:4;35972:27;:::i;:::-;35964:6;35960:40;36102:6;36090:10;36087:22;36066:18;36054:10;36051:34;36048:62;36045:88;;;36113:18;;:::i;:::-;36045:88;36153:10;36149:2;36142:22;35932:238;35889:281;;:::o;36176:233::-;36215:3;36238:24;36256:5;36238:24;:::i;:::-;36229:33;;36284:66;36277:5;36274:77;36271:103;;;36354:18;;:::i;:::-;36271:103;36401:1;36394:5;36390:13;36383:20;;36176:233;;;:::o;36415:176::-;36447:1;36464:20;36482:1;36464:20;:::i;:::-;36459:25;;36498:20;36516:1;36498:20;:::i;:::-;36493:25;;36537:1;36527:35;;36542:18;;:::i;:::-;36527:35;36583:1;36580;36576:9;36571:14;;36415:176;;;;:::o;36597:180::-;36645:77;36642:1;36635:88;36742:4;36739:1;36732:15;36766:4;36763:1;36756:15;36783:180;36831:77;36828:1;36821:88;36928:4;36925:1;36918:15;36952:4;36949:1;36942:15;36969:180;37017:77;37014:1;37007:88;37114:4;37111:1;37104:15;37138:4;37135:1;37128:15;37155:180;37203:77;37200:1;37193:88;37300:4;37297:1;37290:15;37324:4;37321:1;37314:15;37341:180;37389:77;37386:1;37379:88;37486:4;37483:1;37476:15;37510:4;37507:1;37500:15;37527:180;37575:77;37572:1;37565:88;37672:4;37669:1;37662:15;37696:4;37693:1;37686:15;37713:117;37822:1;37819;37812:12;37836:117;37945:1;37942;37935:12;37959:117;38068:1;38065;38058:12;38082:117;38191:1;38188;38181:12;38205:102;38246:6;38297:2;38293:7;38288:2;38281:5;38277:14;38273:28;38263:38;;38205:102;;;:::o;38313:230::-;38453:34;38449:1;38441:6;38437:14;38430:58;38522:13;38517:2;38509:6;38505:15;38498:38;38313:230;:::o;38549:165::-;38689:17;38685:1;38677:6;38673:14;38666:41;38549:165;:::o;38720:161::-;38860:13;38856:1;38848:6;38844:14;38837:37;38720:161;:::o;38887:237::-;39027:34;39023:1;39015:6;39011:14;39004:58;39096:20;39091:2;39083:6;39079:15;39072:45;38887:237;:::o;39130:225::-;39270:34;39266:1;39258:6;39254:14;39247:58;39339:8;39334:2;39326:6;39322:15;39315:33;39130:225;:::o;39361:178::-;39501:30;39497:1;39489:6;39485:14;39478:54;39361:178;:::o;39545:223::-;39685:34;39681:1;39673:6;39669:14;39662:58;39754:6;39749:2;39741:6;39737:15;39730:31;39545:223;:::o;39774:175::-;39914:27;39910:1;39902:6;39898:14;39891:51;39774:175;:::o;39955:231::-;40095:34;40091:1;40083:6;40079:14;40072:58;40164:14;40159:2;40151:6;40147:15;40140:39;39955:231;:::o;40192:243::-;40332:34;40328:1;40320:6;40316:14;40309:58;40401:26;40396:2;40388:6;40384:15;40377:51;40192:243;:::o;40441:229::-;40581:34;40577:1;40569:6;40565:14;40558:58;40650:12;40645:2;40637:6;40633:15;40626:37;40441:229;:::o;40676:228::-;40816:34;40812:1;40804:6;40800:14;40793:58;40885:11;40880:2;40872:6;40868:15;40861:36;40676:228;:::o;40910:182::-;41050:34;41046:1;41038:6;41034:14;41027:58;40910:182;:::o;41098:231::-;41238:34;41234:1;41226:6;41222:14;41215:58;41307:14;41302:2;41294:6;41290:15;41283:39;41098:231;:::o;41335:182::-;41475:34;41471:1;41463:6;41459:14;41452:58;41335:182;:::o;41523:228::-;41663:34;41659:1;41651:6;41647:14;41640:58;41732:11;41727:2;41719:6;41715:15;41708:36;41523:228;:::o;41757:234::-;41897:34;41893:1;41885:6;41881:14;41874:58;41966:17;41961:2;41953:6;41949:15;41942:42;41757:234;:::o;41997:220::-;42137:34;42133:1;42125:6;42121:14;42114:58;42206:3;42201:2;42193:6;42189:15;42182:28;41997:220;:::o;42223:114::-;;:::o;42343:236::-;42483:34;42479:1;42471:6;42467:14;42460:58;42552:19;42547:2;42539:6;42535:15;42528:44;42343:236;:::o;42585:159::-;42725:11;42721:1;42713:6;42709:14;42702:35;42585:159;:::o;42750:231::-;42890:34;42886:1;42878:6;42874:14;42867:58;42959:14;42954:2;42946:6;42942:15;42935:39;42750:231;:::o;42987:122::-;43060:24;43078:5;43060:24;:::i;:::-;43053:5;43050:35;43040:63;;43099:1;43096;43089:12;43040:63;42987:122;:::o;43115:116::-;43185:21;43200:5;43185:21;:::i;:::-;43178:5;43175:32;43165:60;;43221:1;43218;43211:12;43165:60;43115:116;:::o;43237:120::-;43309:23;43326:5;43309:23;:::i;:::-;43302:5;43299:34;43289:62;;43347:1;43344;43337:12;43289:62;43237:120;:::o;43363:122::-;43436:24;43454:5;43436:24;:::i;:::-;43429:5;43426:35;43416:63;;43475:1;43472;43465:12;43416:63;43363:122;:::o

Swarm Source

ipfs://a1acb4f3c3ab75af7a6826d3fa471cc072e6644d173e96e27c49997164da84da
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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