MATIC Price: $0.683685 (-3.84%)
Gas: 31 GWei
 

Overview

Max Total Supply

2,893 MST

Holders

1,124

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 MST
0xBDe71e8Fe0f7497FE19e38737Cfe958CB2212c1f
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
MintWorldFaucet

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at polygonscan.com on 2022-09-02
*/

// 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(int256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(int256)", p0));
	}

	function logUint(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256)", 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(uint256 p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256)", p0, p1));
	}

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

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

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

	function log(string memory p0, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,uint256)", 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, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256)", 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, uint256 p1) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256)", p0, p1, p2));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256)", 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, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256)", p0, p1, p2));
	}

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

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

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

	function log(bool p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256)", 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, uint256 p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256)", p0, p1, p2));
	}

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

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

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

	function log(address p0, string memory p1, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256)", 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, uint256 p2) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256)", 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(uint256 p0, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(uint256,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(string memory p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(string memory p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(string,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(bool p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(bool p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(bool,address,address,uint256)", 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, uint256 p1, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,uint256,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

	function log(address p0, string memory p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,string,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, bool p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,bool,address,uint256)", 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, uint256 p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,uint256,uint256)", p0, p1, p2, p3));
	}

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

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

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

	function log(address p0, address p1, string memory p2, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,string,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,bool,uint256)", 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, uint256 p3) internal view {
		_sendLogPayload(abi.encodeWithSignature("log(address,address,address,uint256)", 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 (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// 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 (last updated v4.7.0) (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 Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 (last updated v4.7.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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
                /// @solidity memory-safe-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 (last updated v4.6.0) (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 `IERC721Receiver.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 (last updated v4.7.0) (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`.
     *
     * 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;

    /**
     * @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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


// OpenZeppelin Contracts (last updated v4.5.0) (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);

    /**
     * @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 (last updated v4.7.0) (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: address zero is not a valid owner");
        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: invalid token ID");
        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) {
        _requireMinted(tokenId);

        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 overridden 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 token owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        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: caller is not token 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: caller is not token 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) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == 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);

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

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {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 an {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 Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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 {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        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: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

    // Optional mapping for token URIs
    mapping(uint256 => string) private _tokenURIs;

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = _baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }

        return super.tokenURI(tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally checks to see if a
     * token-specific URI was set for the token, and if so, it deletes the token URI from
     * the storage mapping.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);

        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }
    }
}

// File: MintWorldFaucet.sol

//SPDX-License-Identifier: Unlicense



pragma solidity ^0.8.15;







//Import the Hardhat console to log messages in the terminal for debugging.




interface MintWorldToken {

    function transferFrom(address from, address to, uint256 amount) external returns (bool);

    function decimals() external view returns (uint8);

}





contract MintWorldFaucet is ERC721, ERC721Enumerable, ERC721URIStorage, Ownable {

    //Public mint state

    bool public mintActive = false;

    //Amount of game tokens recived for burning NFTs

    uint256 public BURNING_REWARD = 1;

    //Token ID

    uint256 tokenID;





    //Last transfer mapping

    mapping(address => uint) lastTransfers;

    //Mapping to check if tokenId can be burn (json) to get token coin game (MWG)

    mapping(string => bool) checkBurnable;

 



    MintWorldToken tokenContract;



    constructor(address _addressContract) ERC721("MintMonster", "MST") {

        console.log("Hello Mintworld!");

        tokenContract = MintWorldToken(_addressContract);

    }



    //----SET VARIABLES----//



    //Sets public mint state

    function setMintState(bool val) external onlyOwner {

        mintActive = val;

    }



    //Sets amount of coin tokens to transfer when 10 NFTs are burn

    function setBurningReward(uint256 amount) external onlyOwner {

        BURNING_REWARD = amount;

    }



    //----END----//



    //----GENERATE JSON----//



    //Generate random number (0-999)

    function numRandom() private view returns(uint256){

        return uint256( keccak256( abi.encode(block.timestamp, msg.sender,tokenID))) % 1000;

    }



    //Assign json

    function checkNum(uint256 _num) private pure returns(string memory) {

        if(_num <= 247) {

            return "https://ipfs.moralis.io:2053/ipfs/QmabYRQNWPDYv8arf6DYXtsewWy8Exo3DJJnTNuVscNdKy/Stoney_637962478831665065.json";

        }

            

        else if(_num <= 496){

            return "https://ipfs.moralis.io:2053/ipfs/QmQ2YB83TfrEYpMCWES75RJRbLBjZJVPFA2mUthWZy49Qr/Firefy_637962481697783261.json";

        }



        else if(_num <= 745){

            return "https://ipfs.moralis.io:2053/ipfs/QmRe2Q4XDHTr7pbCuH6o696T5XMm2PsPwHgSLAK4bu8A6N/Watery_637962482900416213.json";

        }



        else if(_num <= 995){

            return "https://ipfs.moralis.io:2053/ipfs/QmewNL1WUJij9xqi8jo1YAeefVy7wzRjQWtiEvFftXXdvQ/Windry_637962484104104770.json";

        }

        

        else if(_num == 996){

            return "https://ipfs.moralis.io:2053/ipfs/QmUZCQW2nQu1LPMytzGrc6ugPRoGu4YBbgfe7mSzBkKzjh/Stoneman_637962479844393253.json";

        }



        else if(_num == 997){

            return "https://ipfs.moralis.io:2053/ipfs/QmfBagmaHHc93CEuKAqcQHemVrvxNwhCuZRkBZLDZ9h6D5/Lavagron_637962480480789209.json";

        }



        else if(_num == 998){

            return "https://ipfs.moralis.io:2053/ipfs/QmRFKDT9WsXP5UDsdJfB8XDxrFQbpy92TpneDvqb9DVVzB/Octopus_637962482220138079.json";

        }

        

        else{

            return "https://ipfs.moralis.io:2053/ipfs/QmYQ5bfqPP4m3EnLGxD32BbbZhvMJfW62LdySqmssy5zYN/Wingron_637962483552551184.json";

        }

    }



    //----END----//



    //----MINT NFT----//



    function mintNFT() public returns(uint256)  {

        //set last transfer to check if eligible for claiming

        uint lastTransfer = lastTransfers[msg.sender];



        require(

            lastTransfer + 24 hours <= block.timestamp,

            "You can only claim every 24 hours"

        );



        require(

            mintActive,

            "Minting paused"

        );



        //Generate random number

        uint256 _numRandom = numRandom();



        //Mapping for last trasnfer

        lastTransfers[msg.sender] = block.timestamp;



        //Mint the NFT to the sender using msg.sender.

        _safeMint(msg.sender, tokenID);



        //Set the NFTs data.

        _setTokenURI(tokenID, checkNum(_numRandom));



        //Increment token ID

        tokenID++;



        //Returns token ID

        return tokenID-1;



    }



    function getLastTransfer() public view returns(uint){

        return lastTransfers[msg.sender];

    }



    //----END----//



    //----BURN TOKENS----//



    //Add json that can be burn to get MWG. True can be burn.

    function addjson(string memory _json, bool burnable)public onlyOwner {

        checkBurnable[_json] = burnable;

    }



    //Check if the json can be burn to get MWG

    function CheckBurnable(string memory _json) public view returns(bool) {

        return checkBurnable[_json];

    }



    //Burn 10 NFT to get MWG

    function burnNFTs(uint256[] calldata tokens) external {

        require(tokens.length == 10,"You need to burn 10 NFTs to get a coin token");



        for(uint256 i=0; i < tokens.length; i++){

            require(_isApprovedOrOwner(_msgSender(), tokens[i]), "Caller is not token owner nor approved");



            require(checkBurnable[tokenURI(tokens[i])], "Check the items, you cannot burn a shining NFT");



            _burn(tokens[i]);

        }



        transferToken();

    }



    //----END----//



    //---COIN TOKEN CONTRACT---//



    function transferToken() private {

        tokenContract.transferFrom(address(tokenContract), msg.sender, mul(BURNING_REWARD, uint256(10)**tokenContract.decimals()));

    }



    //----END----//



    //----AUX FUNCTIONS----//



    function mul(uint256 a, uint256 b) internal pure returns (uint256) {

        if (a == 0) {

            return 0;

        }

        uint256 c = a * b;

        require(c / a == b);

        return c;

    }



    //----END----//



    //----OVERRIDE FUNCTIONS----//



    function supportsInterface(bytes4 interfaceId)

        public

        view

        override(ERC721, ERC721Enumerable)

        returns (bool)

    {

        return super.supportsInterface(interfaceId);

    }



    function _beforeTokenTransfer(address from, address to, uint256 tokenId)

        internal

        override(ERC721, ERC721Enumerable)

    {

        super._beforeTokenTransfer(from, to, tokenId);

    }



    function tokenURI(uint256 tokenId) public view override (ERC721, ERC721URIStorage) returns (string memory) {

        return super.tokenURI(tokenId);

    }



    function _burn(uint256 tokenId) internal override(ERC721, ERC721URIStorage) {

        super._burn(tokenId);

    }



    //----END----//



}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_addressContract","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"BURNING_REWARD","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_json","type":"string"}],"name":"CheckBurnable","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_json","type":"string"},{"internalType":"bool","name":"burnable","type":"bool"}],"name":"addjson","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokens","type":"uint256[]"}],"name":"burnNFTs","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getLastTransfer","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"mintActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"setBurningReward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"setMintState","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"}]

60806040526000600b60146101000a81548160ff0219169083151502179055506001600c553480156200003157600080fd5b5060405162005355380380620053558339818101604052810190620000579190620003a0565b6040518060400160405280600b81526020017f4d696e744d6f6e737465720000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d535400000000000000000000000000000000000000000000000000000000008152508160009081620000d491906200064c565b508060019081620000e691906200064c565b50505062000109620000fd6200019c60201b60201c565b620001a460201b60201c565b620001546040518060400160405280601081526020017f48656c6c6f204d696e74776f726c6421000000000000000000000000000000008152506200026a60201b620011241760201c565b80601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620007e6565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200030a81604051602401620002819190620007c2565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff83818316178352505050506200030d60201b60201c565b50565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000368826200033b565b9050919050565b6200037a816200035b565b81146200038657600080fd5b50565b6000815190506200039a816200036f565b92915050565b600060208284031215620003b957620003b862000336565b5b6000620003c98482850162000389565b91505092915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045457607f821691505b6020821081036200046a57620004696200040c565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004d47fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000495565b620004e0868362000495565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b60006200052d620005276200052184620004f8565b62000502565b620004f8565b9050919050565b6000819050919050565b62000549836200050c565b62000561620005588262000534565b848454620004a2565b825550505050565b600090565b6200057862000569565b620005858184846200053e565b505050565b5b81811015620005ad57620005a16000826200056e565b6001810190506200058b565b5050565b601f821115620005fc57620005c68162000470565b620005d18462000485565b81016020851015620005e1578190505b620005f9620005f08562000485565b8301826200058a565b50505b505050565b600082821c905092915050565b6000620006216000198460080262000601565b1980831691505092915050565b60006200063c83836200060e565b9150826002028217905092915050565b6200065782620003d2565b67ffffffffffffffff811115620006735762000672620003dd565b5b6200067f82546200043b565b6200068c828285620005b1565b600060209050601f831160018114620006c45760008415620006af578287015190505b620006bb85826200062e565b8655506200072b565b601f198416620006d48662000470565b60005b82811015620006fe57848901518255600182019150602085019450602081019050620006d7565b868310156200071e57848901516200071a601f8916826200060e565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b60005b838110156200076457808201518184015260208101905062000747565b60008484015250505050565b6000601f19601f8301169050919050565b60006200078e82620003d2565b6200079a818562000733565b9350620007ac81856020860162000744565b620007b78162000770565b840191505092915050565b60006020820190508181036000830152620007de818462000781565b905092915050565b614b5f80620007f66000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063a22cb46511610097578063c87b56dd11610071578063c87b56dd146104f1578063d7fe8ab014610521578063e985e9c51461053f578063f2fde38b1461056f576101c4565b8063a22cb4651461049d578063b88d4fde146104b9578063b9225e84146104d5576101c4565b80638da5cb5b116100d35780638da5cb5b1461041557806395d89b4114610433578063966697c6146104515780639cda22de1461046d576101c4565b80636352211e146103ab57806370a08231146103db578063715018a61461040b576101c4565b806325cd0540116101665780632f745c59116101405780632f745c591461031157806342842e0e146103415780634b82b3831461035d5780634f6ccce71461037b576101c4565b806325cd0540146102bb57806325fd90f3146102d757806326412aca146102f5576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806314f710fe1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612c33565b61058b565b6040516101f09190612c7b565b60405180910390f35b61020161059d565b60405161020e9190612d26565b60405180910390f35b610231600480360381019061022c9190612d7e565b61062f565b60405161023e9190612dec565b60405180910390f35b610261600480360381019061025c9190612e33565b610675565b005b61026b61078c565b6040516102789190612e82565b60405180910390f35b61028961090f565b6040516102969190612e82565b60405180910390f35b6102b960048036038101906102b49190612e9d565b61091c565b005b6102d560048036038101906102d09190612d7e565b61097c565b005b6102df61098e565b6040516102ec9190612c7b565b60405180910390f35b61030f600480360381019061030a9190612f1c565b6109a1565b005b61032b60048036038101906103269190612e33565b6109c6565b6040516103389190612e82565b60405180910390f35b61035b60048036038101906103569190612e9d565b610a6b565b005b610365610a8b565b6040516103729190612e82565b60405180910390f35b61039560048036038101906103909190612d7e565b610a91565b6040516103a29190612e82565b60405180910390f35b6103c560048036038101906103c09190612d7e565b610b02565b6040516103d29190612dec565b60405180910390f35b6103f560048036038101906103f09190612f49565b610bb3565b6040516104029190612e82565b60405180910390f35b610413610c6a565b005b61041d610c7e565b60405161042a9190612dec565b60405180910390f35b61043b610ca8565b6040516104489190612d26565b60405180910390f35b61046b600480360381019061046691906130ab565b610d3a565b005b61048760048036038101906104829190613107565b610d7c565b6040516104949190612c7b565b60405180910390f35b6104b760048036038101906104b29190613150565b610db1565b005b6104d360048036038101906104ce9190613231565b610dc7565b005b6104ef60048036038101906104ea9190613314565b610e29565b005b61050b60048036038101906105069190612d7e565b610fb4565b6040516105189190612d26565b60405180910390f35b610529610fc6565b6040516105369190612e82565b60405180910390f35b61055960048036038101906105549190613361565b61100d565b6040516105669190612c7b565b60405180910390f35b61058960048036038101906105849190612f49565b6110a1565b005b6000610596826111bd565b9050919050565b6060600080546105ac906133d0565b80601f01602080910402602001604051908101604052809291908181526020018280546105d8906133d0565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a82611237565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068082610b02565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790613473565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661070f611282565b73ffffffffffffffffffffffffffffffffffffffff16148061073e575061073d81610738611282565b61100d565b5b61077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490613505565b60405180910390fd5b610787838361128a565b505050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504262015180826107e19190613554565b1115610822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610819906135fa565b60405180910390fd5b600b60149054906101000a900460ff16610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890613666565b60405180910390fd5b600061087b611343565b905042600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506108cd33600d54611387565b6108e1600d546108dc836113a5565b6114e6565b600d60008154809291906108f490613686565b91905055506001600d5461090891906136ce565b9250505090565b6000600880549050905090565b61092d610927611282565b82611553565b61096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096390613774565b60405180910390fd5b6109778383836115e8565b505050565b61098461184e565b80600c8190555050565b600b60149054906101000a900460ff1681565b6109a961184e565b80600b60146101000a81548160ff02191690831515021790555050565b60006109d183610bb3565b8210610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990613806565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a8683838360405180602001604052806000815250610dc7565b505050565b600c5481565b6000610a9b61090f565b8210610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613898565b60405180910390fd5b60088281548110610af057610aef6138b8565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190613933565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906139c5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c7261184e565b610c7c60006118cc565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cb7906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce3906133d0565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b5050505050905090565b610d4261184e565b80600f83604051610d539190613a21565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6000600f82604051610d8e9190613a21565b908152602001604051809103902060009054906101000a900460ff169050919050565b610dc3610dbc611282565b8383611992565b5050565b610dd8610dd2611282565b83611553565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613774565b60405180910390fd5b610e2384848484611afe565b50505050565b600a8282905014610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613aaa565b60405180910390fd5b60005b82829050811015610fa757610ea7610e88611282565b848484818110610e9b57610e9a6138b8565b5b90506020020135611553565b610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613b3c565b60405180910390fd5b600f610f0a848484818110610efe57610efd6138b8565b5b90506020020135610fb4565b604051610f179190613a21565b908152602001604051809103902060009054906101000a900460ff16610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990613bce565b60405180910390fd5b610f94838383818110610f8857610f876138b8565b5b90506020020135611b5a565b8080610f9f90613686565b915050610e72565b50610fb0611b66565b5050565b6060610fbf82611cd4565b9050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110a961184e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613c60565b60405180910390fd5b611121816118cc565b50565b6111ba816040516024016111389190612d26565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611de6565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611230575061122f82611e0f565b5b9050919050565b61124081611ef1565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690613933565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112fd83610b02565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006103e84233600d5460405160200161135f93929190613c80565b6040516020818303038152906040528051906020012060001c6113829190613ce6565b905090565b6113a1828260405180602001604052806000815250611f5d565b5050565b606060f782116113cf576040518060a00160405280606f8152602001614abb606f913990506114e1565b6101f082116113f8576040518060a00160405280606f815260200161488c606f913990506114e1565b6102e98211611421576040518060a00160405280606f81526020016149db606f913990506114e1565b6103e3821161144a576040518060a00160405280606f81526020016147ac606f913990506114e1565b6103e48203611473576040518060a0016040528060718152602001614a4a6071913990506114e1565b6103e5820361149c576040518060a001604052806071815260200161481b6071913990506114e1565b6103e682036114c5576040518060a00160405280607081526020016148fb6070913990506114e1565b6040518060a001604052806070815260200161496b6070913990505b919050565b6114ef82611ef1565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613d89565b60405180910390fd5b80600a6000848152602001908152602001600020908161154e9190613f55565b505050565b60008061155f83610b02565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115a157506115a0818561100d565b5b806115df57508373ffffffffffffffffffffffffffffffffffffffff166115c78461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661160882610b02565b73ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c49061412b565b60405180910390fd5b6116d8838383611fb8565b6116e360008261128a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173391906136ce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178a9190613554565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611849838383611fc8565b505050565b611856611282565b73ffffffffffffffffffffffffffffffffffffffff16611874610c7e565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614197565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614203565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af19190612c7b565b60405180910390a3505050565b611b098484846115e8565b611b1584848484611fcd565b611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b90614295565b60405180910390fd5b50505050565b611b6381612154565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633611c70600c54601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5f91906142ee565b600a611c6b919061444e565b6121a7565b6040518463ffffffff1660e01b8152600401611c8e93929190614499565b6020604051808303816000875af1158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906144e5565b50565b6060611cdf82611237565b6000600a60008481526020019081526020016000208054611cff906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2b906133d0565b8015611d785780601f10611d4d57610100808354040283529160200191611d78565b820191906000526020600020905b815481529060010190602001808311611d5b57829003601f168201915b505050505090506000611d896121eb565b90506000815103611d9e578192505050611de1565b600082511115611dd3578082604051602001611dbb929190614512565b60405160208183030381529060405292505050611de1565b611ddc84612202565b925050505b919050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611eda57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611eea5750611ee98261226a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611f6783836122d4565b611f746000848484611fcd565b611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90614295565b60405180910390fd5b505050565b611fc38383836124ad565b505050565b505050565b6000611fee8473ffffffffffffffffffffffffffffffffffffffff166125bf565b15612147578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612017611282565b8786866040518563ffffffff1660e01b8152600401612039949392919061458b565b6020604051808303816000875af192505050801561207557506040513d601f19601f8201168201806040525081019061207291906145ec565b60015b6120f7573d80600081146120a5576040519150601f19603f3d011682016040523d82523d6000602084013e6120aa565b606091505b5060008151036120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614295565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061214c565b600190505b949350505050565b61215d816125e2565b6000600a6000838152602001908152602001600020805461217d906133d0565b9050146121a457600a600082815260200190815260200160002060006121a39190612b6a565b5b50565b60008083036121b957600090506121e5565b600082846121c79190614619565b90508284826121d69190614673565b146121e057600080fd5b809150505b92915050565b606060405180602001604052806000815250905090565b606061220d82611237565b60006122176121eb565b905060008151116122375760405180602001604052806000815250612262565b80612241846126ff565b604051602001612252929190614512565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a906146f0565b60405180910390fd5b61234c81611ef1565b1561238c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123839061475c565b60405180910390fd5b61239860008383611fb8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e89190613554565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a960008383611fc8565b5050565b6124b883838361285f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124fa576124f581612864565b612539565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125385761253783826128ad565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361257b5761257681612a1a565b6125ba565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b9576125b88282612aeb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006125ed82610b02565b90506125fb81600084611fb8565b61260660008361128a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265691906136ce565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126fb81600084611fc8565b5050565b606060008203612746576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285a565b600082905060005b6000821461277857808061276190613686565b915050600a826127719190614673565b915061274e565b60008167ffffffffffffffff81111561279457612793612f80565b5b6040519080825280601f01601f1916602001820160405280156127c65781602001600182028036833780820191505090505b5090505b60008514612853576001826127df91906136ce565b9150600a856127ee9190613ce6565b60306127fa9190613554565b60f81b8183815181106128105761280f6138b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284c9190614673565b94506127ca565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128ba84610bb3565b6128c491906136ce565b90506000600760008481526020019081526020016000205490508181146129a9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a2e91906136ce565b9050600060096000848152602001908152602001600020549050600060088381548110612a5e57612a5d6138b8565b5b906000526020600020015490508060088381548110612a8057612a7f6138b8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612acf57612ace61477c565b5b6001900381819060005260206000200160009055905550505050565b6000612af683610bb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054612b76906133d0565b6000825580601f10612b885750612ba7565b601f016020900490600052602060002090810190612ba69190612baa565b5b50565b5b80821115612bc3576000816000905550600101612bab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c1081612bdb565b8114612c1b57600080fd5b50565b600081359050612c2d81612c07565b92915050565b600060208284031215612c4957612c48612bd1565b5b6000612c5784828501612c1e565b91505092915050565b60008115159050919050565b612c7581612c60565b82525050565b6000602082019050612c906000830184612c6c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cd0578082015181840152602081019050612cb5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cf882612c96565b612d028185612ca1565b9350612d12818560208601612cb2565b612d1b81612cdc565b840191505092915050565b60006020820190508181036000830152612d408184612ced565b905092915050565b6000819050919050565b612d5b81612d48565b8114612d6657600080fd5b50565b600081359050612d7881612d52565b92915050565b600060208284031215612d9457612d93612bd1565b5b6000612da284828501612d69565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd682612dab565b9050919050565b612de681612dcb565b82525050565b6000602082019050612e016000830184612ddd565b92915050565b612e1081612dcb565b8114612e1b57600080fd5b50565b600081359050612e2d81612e07565b92915050565b60008060408385031215612e4a57612e49612bd1565b5b6000612e5885828601612e1e565b9250506020612e6985828601612d69565b9150509250929050565b612e7c81612d48565b82525050565b6000602082019050612e976000830184612e73565b92915050565b600080600060608486031215612eb657612eb5612bd1565b5b6000612ec486828701612e1e565b9350506020612ed586828701612e1e565b9250506040612ee686828701612d69565b9150509250925092565b612ef981612c60565b8114612f0457600080fd5b50565b600081359050612f1681612ef0565b92915050565b600060208284031215612f3257612f31612bd1565b5b6000612f4084828501612f07565b91505092915050565b600060208284031215612f5f57612f5e612bd1565b5b6000612f6d84828501612e1e565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fb882612cdc565b810181811067ffffffffffffffff82111715612fd757612fd6612f80565b5b80604052505050565b6000612fea612bc7565b9050612ff68282612faf565b919050565b600067ffffffffffffffff82111561301657613015612f80565b5b61301f82612cdc565b9050602081019050919050565b82818337600083830152505050565b600061304e61304984612ffb565b612fe0565b90508281526020810184848401111561306a57613069612f7b565b5b61307584828561302c565b509392505050565b600082601f83011261309257613091612f76565b5b81356130a284826020860161303b565b91505092915050565b600080604083850312156130c2576130c1612bd1565b5b600083013567ffffffffffffffff8111156130e0576130df612bd6565b5b6130ec8582860161307d565b92505060206130fd85828601612f07565b9150509250929050565b60006020828403121561311d5761311c612bd1565b5b600082013567ffffffffffffffff81111561313b5761313a612bd6565b5b6131478482850161307d565b91505092915050565b6000806040838503121561316757613166612bd1565b5b600061317585828601612e1e565b925050602061318685828601612f07565b9150509250929050565b600067ffffffffffffffff8211156131ab576131aa612f80565b5b6131b482612cdc565b9050602081019050919050565b60006131d46131cf84613190565b612fe0565b9050828152602081018484840111156131f0576131ef612f7b565b5b6131fb84828561302c565b509392505050565b600082601f83011261321857613217612f76565b5b81356132288482602086016131c1565b91505092915050565b6000806000806080858703121561324b5761324a612bd1565b5b600061325987828801612e1e565b945050602061326a87828801612e1e565b935050604061327b87828801612d69565b925050606085013567ffffffffffffffff81111561329c5761329b612bd6565b5b6132a887828801613203565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126132d4576132d3612f76565b5b8235905067ffffffffffffffff8111156132f1576132f06132b4565b5b60208301915083602082028301111561330d5761330c6132b9565b5b9250929050565b6000806020838503121561332b5761332a612bd1565b5b600083013567ffffffffffffffff81111561334957613348612bd6565b5b613355858286016132be565b92509250509250929050565b6000806040838503121561337857613377612bd1565b5b600061338685828601612e1e565b925050602061339785828601612e1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133e857607f821691505b6020821081036133fb576133fa6133a1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061345d602183612ca1565b915061346882613401565b604082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006134ef603e83612ca1565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061355f82612d48565b915061356a83612d48565b925082820190508082111561358257613581613525565b5b92915050565b7f596f752063616e206f6e6c7920636c61696d20657665727920323420686f757260008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e4602183612ca1565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b6000613650600e83612ca1565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b600061369182612d48565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136c3576136c2613525565b5b600182019050919050565b60006136d982612d48565b91506136e483612d48565b92508282039050818111156136fc576136fb613525565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061375e602e83612ca1565b915061376982613702565b604082019050919050565b6000602082019050818103600083015261378d81613751565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006137f0602b83612ca1565b91506137fb82613794565b604082019050919050565b6000602082019050818103600083015261381f816137e3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613882602c83612ca1565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061391d601883612ca1565b9150613928826138e7565b602082019050919050565b6000602082019050818103600083015261394c81613910565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006139af602983612ca1565b91506139ba82613953565b604082019050919050565b600060208201905081810360008301526139de816139a2565b9050919050565b600081905092915050565b60006139fb82612c96565b613a0581856139e5565b9350613a15818560208601612cb2565b80840191505092915050565b6000613a2d82846139f0565b915081905092915050565b7f596f75206e65656420746f206275726e203130204e46547320746f206765742060008201527f6120636f696e20746f6b656e0000000000000000000000000000000000000000602082015250565b6000613a94602c83612ca1565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f43616c6c6572206973206e6f7420746f6b656e206f776e6572206e6f7220617060008201527f70726f7665640000000000000000000000000000000000000000000000000000602082015250565b6000613b26602683612ca1565b9150613b3182613aca565b604082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b7f436865636b20746865206974656d732c20796f752063616e6e6f74206275726e60008201527f2061207368696e696e67204e4654000000000000000000000000000000000000602082015250565b6000613bb8602e83612ca1565b9150613bc382613b5c565b604082019050919050565b60006020820190508181036000830152613be781613bab565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c4a602683612ca1565b9150613c5582613bee565b604082019050919050565b60006020820190508181036000830152613c7981613c3d565b9050919050565b6000606082019050613c956000830186612e73565b613ca26020830185612ddd565b613caf6040830184612e73565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cf182612d48565b9150613cfc83612d48565b925082613d0c57613d0b613cb7565b5b828206905092915050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613d73602e83612ca1565b9150613d7e82613d17565b604082019050919050565b60006020820190508181036000830152613da281613d66565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dce565b613e158683613dce565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e52613e4d613e4884612d48565b613e2d565b612d48565b9050919050565b6000819050919050565b613e6c83613e37565b613e80613e7882613e59565b848454613ddb565b825550505050565b600090565b613e95613e88565b613ea0818484613e63565b505050565b5b81811015613ec457613eb9600082613e8d565b600181019050613ea6565b5050565b601f821115613f0957613eda81613da9565b613ee384613dbe565b81016020851015613ef2578190505b613f06613efe85613dbe565b830182613ea5565b50505b505050565b600082821c905092915050565b6000613f2c60001984600802613f0e565b1980831691505092915050565b6000613f458383613f1b565b9150826002028217905092915050565b613f5e82612c96565b67ffffffffffffffff811115613f7757613f76612f80565b5b613f8182546133d0565b613f8c828285613ec8565b600060209050601f831160018114613fbf5760008415613fad578287015190505b613fb78582613f39565b86555061401f565b601f198416613fcd86613da9565b60005b82811015613ff557848901518255600182019150602085019450602081019050613fd0565b86831015614012578489015161400e601f891682613f1b565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614083602583612ca1565b915061408e82614027565b604082019050919050565b600060208201905081810360008301526140b281614076565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614115602483612ca1565b9150614120826140b9565b604082019050919050565b6000602082019050818103600083015261414481614108565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614181602083612ca1565b915061418c8261414b565b602082019050919050565b600060208201905081810360008301526141b081614174565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006141ed601983612ca1565b91506141f8826141b7565b602082019050919050565b6000602082019050818103600083015261421c816141e0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061427f603283612ca1565b915061428a82614223565b604082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b600060ff82169050919050565b6142cb816142b5565b81146142d657600080fd5b50565b6000815190506142e8816142c2565b92915050565b60006020828403121561430457614303612bd1565b5b6000614312848285016142d9565b91505092915050565b60008160011c9050919050565b6000808291508390505b60018511156143725780860481111561434e5761434d613525565b5b600185161561435d5780820291505b808102905061436b8561431b565b9450614332565b94509492505050565b60008261438b5760019050614447565b816143995760009050614447565b81600181146143af57600281146143b9576143e8565b6001915050614447565b60ff8411156143cb576143ca613525565b5b8360020a9150848211156143e2576143e1613525565b5b50614447565b5060208310610133831016604e8410600b841016171561441d5782820a90508381111561441857614417613525565b5b614447565b61442a8484846001614328565b9250905081840481111561444157614440613525565b5b81810290505b9392505050565b600061445982612d48565b9150614464836142b5565b92506144917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461437b565b905092915050565b60006060820190506144ae6000830186612ddd565b6144bb6020830185612ddd565b6144c86040830184612e73565b949350505050565b6000815190506144df81612ef0565b92915050565b6000602082840312156144fb576144fa612bd1565b5b6000614509848285016144d0565b91505092915050565b600061451e82856139f0565b915061452a82846139f0565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061455d82614536565b6145678185614541565b9350614577818560208601612cb2565b61458081612cdc565b840191505092915050565b60006080820190506145a06000830187612ddd565b6145ad6020830186612ddd565b6145ba6040830185612e73565b81810360608301526145cc8184614552565b905095945050505050565b6000815190506145e681612c07565b92915050565b60006020828403121561460257614601612bd1565b5b6000614610848285016145d7565b91505092915050565b600061462482612d48565b915061462f83612d48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561466857614667613525565b5b828202905092915050565b600061467e82612d48565b915061468983612d48565b92508261469957614698613cb7565b5b828204905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146da602083612ca1565b91506146e5826146a4565b602082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614746601c83612ca1565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d65774e4c3157554a696a39787169386a6f315941656566567937777a526a51577469457646667458586476512f57696e6472795f3633373936323438343130343130343737302e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d664261676d6148486339334345754b4171635148656d567276784e776843755a526b425a4c445a39683644352f4c61766167726f6e5f3633373936323438303438303738393230392e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d5132594238335466724559704d435745533735524a52624c426a5a4a56504641326d557468575a79343951722f4669726566795f3633373936323438313639373738333236312e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d52464b4454395773585035554473644a664238584478724651627079393254706e6544767162394456567a422f4f63746f7075735f3633373936323438323232303133383037392e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d5951356266715050346d33456e4c47784433324262625a68764d4a665736324c647953716d737379357a594e2f57696e67726f6e5f3633373936323438333535323535313138342e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d52653251345844485472377062437548366f3639365435584d6d32507350774867534c414b3462753841364e2f5761746572795f3633373936323438323930303431363231332e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d555a435157326e5175314c504d79747a47726336756750526f477534594262676665376d537a426b4b7a6a682f53746f6e656d616e5f3633373936323437393834343339333235332e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d61625952514e575044597638617266364459587473657757793845786f33444a4a6e544e755673634e644b792f53746f6e65795f3633373936323437383833313636353036352e6a736f6ea2646970667358221220d35b8d019929766dd4477b324f5b03d3372009f2b9d00de4acf9df4a5518e7ab64736f6c634300081000330000000000000000000000006612e6b288c30f47c99e299163203fdc698ab219

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063a22cb46511610097578063c87b56dd11610071578063c87b56dd146104f1578063d7fe8ab014610521578063e985e9c51461053f578063f2fde38b1461056f576101c4565b8063a22cb4651461049d578063b88d4fde146104b9578063b9225e84146104d5576101c4565b80638da5cb5b116100d35780638da5cb5b1461041557806395d89b4114610433578063966697c6146104515780639cda22de1461046d576101c4565b80636352211e146103ab57806370a08231146103db578063715018a61461040b576101c4565b806325cd0540116101665780632f745c59116101405780632f745c591461031157806342842e0e146103415780634b82b3831461035d5780634f6ccce71461037b576101c4565b806325cd0540146102bb57806325fd90f3146102d757806326412aca146102f5576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806314f710fe1461026357806318160ddd1461028157806323b872dd1461029f576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de9190612c33565b61058b565b6040516101f09190612c7b565b60405180910390f35b61020161059d565b60405161020e9190612d26565b60405180910390f35b610231600480360381019061022c9190612d7e565b61062f565b60405161023e9190612dec565b60405180910390f35b610261600480360381019061025c9190612e33565b610675565b005b61026b61078c565b6040516102789190612e82565b60405180910390f35b61028961090f565b6040516102969190612e82565b60405180910390f35b6102b960048036038101906102b49190612e9d565b61091c565b005b6102d560048036038101906102d09190612d7e565b61097c565b005b6102df61098e565b6040516102ec9190612c7b565b60405180910390f35b61030f600480360381019061030a9190612f1c565b6109a1565b005b61032b60048036038101906103269190612e33565b6109c6565b6040516103389190612e82565b60405180910390f35b61035b60048036038101906103569190612e9d565b610a6b565b005b610365610a8b565b6040516103729190612e82565b60405180910390f35b61039560048036038101906103909190612d7e565b610a91565b6040516103a29190612e82565b60405180910390f35b6103c560048036038101906103c09190612d7e565b610b02565b6040516103d29190612dec565b60405180910390f35b6103f560048036038101906103f09190612f49565b610bb3565b6040516104029190612e82565b60405180910390f35b610413610c6a565b005b61041d610c7e565b60405161042a9190612dec565b60405180910390f35b61043b610ca8565b6040516104489190612d26565b60405180910390f35b61046b600480360381019061046691906130ab565b610d3a565b005b61048760048036038101906104829190613107565b610d7c565b6040516104949190612c7b565b60405180910390f35b6104b760048036038101906104b29190613150565b610db1565b005b6104d360048036038101906104ce9190613231565b610dc7565b005b6104ef60048036038101906104ea9190613314565b610e29565b005b61050b60048036038101906105069190612d7e565b610fb4565b6040516105189190612d26565b60405180910390f35b610529610fc6565b6040516105369190612e82565b60405180910390f35b61055960048036038101906105549190613361565b61100d565b6040516105669190612c7b565b60405180910390f35b61058960048036038101906105849190612f49565b6110a1565b005b6000610596826111bd565b9050919050565b6060600080546105ac906133d0565b80601f01602080910402602001604051908101604052809291908181526020018280546105d8906133d0565b80156106255780601f106105fa57610100808354040283529160200191610625565b820191906000526020600020905b81548152906001019060200180831161060857829003601f168201915b5050505050905090565b600061063a82611237565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061068082610b02565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036106f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e790613473565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661070f611282565b73ffffffffffffffffffffffffffffffffffffffff16148061073e575061073d81610738611282565b61100d565b5b61077d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077490613505565b60405180910390fd5b610787838361128a565b505050565b600080600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490504262015180826107e19190613554565b1115610822576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610819906135fa565b60405180910390fd5b600b60149054906101000a900460ff16610871576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086890613666565b60405180910390fd5b600061087b611343565b905042600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506108cd33600d54611387565b6108e1600d546108dc836113a5565b6114e6565b600d60008154809291906108f490613686565b91905055506001600d5461090891906136ce565b9250505090565b6000600880549050905090565b61092d610927611282565b82611553565b61096c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096390613774565b60405180910390fd5b6109778383836115e8565b505050565b61098461184e565b80600c8190555050565b600b60149054906101000a900460ff1681565b6109a961184e565b80600b60146101000a81548160ff02191690831515021790555050565b60006109d183610bb3565b8210610a12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0990613806565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a8683838360405180602001604052806000815250610dc7565b505050565b600c5481565b6000610a9b61090f565b8210610adc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad390613898565b60405180910390fd5b60088281548110610af057610aef6138b8565b5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610baa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba190613933565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1a906139c5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610c7261184e565b610c7c60006118cc565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054610cb7906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce3906133d0565b8015610d305780601f10610d0557610100808354040283529160200191610d30565b820191906000526020600020905b815481529060010190602001808311610d1357829003601f168201915b5050505050905090565b610d4261184e565b80600f83604051610d539190613a21565b908152602001604051809103902060006101000a81548160ff0219169083151502179055505050565b6000600f82604051610d8e9190613a21565b908152602001604051809103902060009054906101000a900460ff169050919050565b610dc3610dbc611282565b8383611992565b5050565b610dd8610dd2611282565b83611553565b610e17576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e0e90613774565b60405180910390fd5b610e2384848484611afe565b50505050565b600a8282905014610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613aaa565b60405180910390fd5b60005b82829050811015610fa757610ea7610e88611282565b848484818110610e9b57610e9a6138b8565b5b90506020020135611553565b610ee6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610edd90613b3c565b60405180910390fd5b600f610f0a848484818110610efe57610efd6138b8565b5b90506020020135610fb4565b604051610f179190613a21565b908152602001604051809103902060009054906101000a900460ff16610f72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6990613bce565b60405180910390fd5b610f94838383818110610f8857610f876138b8565b5b90506020020135611b5a565b8080610f9f90613686565b915050610e72565b50610fb0611b66565b5050565b6060610fbf82611cd4565b9050919050565b6000600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6110a961184e565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611118576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110f90613c60565b60405180910390fd5b611121816118cc565b50565b6111ba816040516024016111389190612d26565b6040516020818303038152906040527f41304fac000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19166020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff8381831617835250505050611de6565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611230575061122f82611e0f565b5b9050919050565b61124081611ef1565b61127f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127690613933565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166112fd83610b02565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006103e84233600d5460405160200161135f93929190613c80565b6040516020818303038152906040528051906020012060001c6113829190613ce6565b905090565b6113a1828260405180602001604052806000815250611f5d565b5050565b606060f782116113cf576040518060a00160405280606f8152602001614abb606f913990506114e1565b6101f082116113f8576040518060a00160405280606f815260200161488c606f913990506114e1565b6102e98211611421576040518060a00160405280606f81526020016149db606f913990506114e1565b6103e3821161144a576040518060a00160405280606f81526020016147ac606f913990506114e1565b6103e48203611473576040518060a0016040528060718152602001614a4a6071913990506114e1565b6103e5820361149c576040518060a001604052806071815260200161481b6071913990506114e1565b6103e682036114c5576040518060a00160405280607081526020016148fb6070913990506114e1565b6040518060a001604052806070815260200161496b6070913990505b919050565b6114ef82611ef1565b61152e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161152590613d89565b60405180910390fd5b80600a6000848152602001908152602001600020908161154e9190613f55565b505050565b60008061155f83610b02565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806115a157506115a0818561100d565b5b806115df57508373ffffffffffffffffffffffffffffffffffffffff166115c78461062f565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661160882610b02565b73ffffffffffffffffffffffffffffffffffffffff161461165e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161165590614099565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c49061412b565b60405180910390fd5b6116d8838383611fb8565b6116e360008261128a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461173391906136ce565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461178a9190613554565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611849838383611fc8565b505050565b611856611282565b73ffffffffffffffffffffffffffffffffffffffff16611874610c7e565b73ffffffffffffffffffffffffffffffffffffffff16146118ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118c190614197565b60405180910390fd5b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611a00576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f790614203565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611af19190612c7b565b60405180910390a3505050565b611b098484846115e8565b611b1584848484611fcd565b611b54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b4b90614295565b60405180910390fd5b50505050565b611b6381612154565b50565b601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166323b872dd601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1633611c70600c54601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa158015611c3b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c5f91906142ee565b600a611c6b919061444e565b6121a7565b6040518463ffffffff1660e01b8152600401611c8e93929190614499565b6020604051808303816000875af1158015611cad573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611cd191906144e5565b50565b6060611cdf82611237565b6000600a60008481526020019081526020016000208054611cff906133d0565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2b906133d0565b8015611d785780601f10611d4d57610100808354040283529160200191611d78565b820191906000526020600020905b815481529060010190602001808311611d5b57829003601f168201915b505050505090506000611d896121eb565b90506000815103611d9e578192505050611de1565b600082511115611dd3578082604051602001611dbb929190614512565b60405160208183030381529060405292505050611de1565b611ddc84612202565b925050505b919050565b60008151905060006a636f6e736f6c652e6c6f679050602083016000808483855afa5050505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611eda57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611eea5750611ee98261226a565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b611f6783836122d4565b611f746000848484611fcd565b611fb3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611faa90614295565b60405180910390fd5b505050565b611fc38383836124ad565b505050565b505050565b6000611fee8473ffffffffffffffffffffffffffffffffffffffff166125bf565b15612147578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612017611282565b8786866040518563ffffffff1660e01b8152600401612039949392919061458b565b6020604051808303816000875af192505050801561207557506040513d601f19601f8201168201806040525081019061207291906145ec565b60015b6120f7573d80600081146120a5576040519150601f19603f3d011682016040523d82523d6000602084013e6120aa565b606091505b5060008151036120ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e690614295565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061214c565b600190505b949350505050565b61215d816125e2565b6000600a6000838152602001908152602001600020805461217d906133d0565b9050146121a457600a600082815260200190815260200160002060006121a39190612b6a565b5b50565b60008083036121b957600090506121e5565b600082846121c79190614619565b90508284826121d69190614673565b146121e057600080fd5b809150505b92915050565b606060405180602001604052806000815250905090565b606061220d82611237565b60006122176121eb565b905060008151116122375760405180602001604052806000815250612262565b80612241846126ff565b604051602001612252929190614512565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161233a906146f0565b60405180910390fd5b61234c81611ef1565b1561238c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123839061475c565b60405180910390fd5b61239860008383611fb8565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123e89190613554565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46124a960008383611fc8565b5050565b6124b883838361285f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16036124fa576124f581612864565b612539565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146125385761253783826128ad565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361257b5761257681612a1a565b6125ba565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146125b9576125b88282612aeb565b5b5b505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60006125ed82610b02565b90506125fb81600084611fb8565b61260660008361128a565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461265691906136ce565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46126fb81600084611fc8565b5050565b606060008203612746576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061285a565b600082905060005b6000821461277857808061276190613686565b915050600a826127719190614673565b915061274e565b60008167ffffffffffffffff81111561279457612793612f80565b5b6040519080825280601f01601f1916602001820160405280156127c65781602001600182028036833780820191505090505b5090505b60008514612853576001826127df91906136ce565b9150600a856127ee9190613ce6565b60306127fa9190613554565b60f81b8183815181106128105761280f6138b8565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561284c9190614673565b94506127ca565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016128ba84610bb3565b6128c491906136ce565b90506000600760008481526020019081526020016000205490508181146129a9576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612a2e91906136ce565b9050600060096000848152602001908152602001600020549050600060088381548110612a5e57612a5d6138b8565b5b906000526020600020015490508060088381548110612a8057612a7f6138b8565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612acf57612ace61477c565b5b6001900381819060005260206000200160009055905550505050565b6000612af683610bb3565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b508054612b76906133d0565b6000825580601f10612b885750612ba7565b601f016020900490600052602060002090810190612ba69190612baa565b5b50565b5b80821115612bc3576000816000905550600101612bab565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612c1081612bdb565b8114612c1b57600080fd5b50565b600081359050612c2d81612c07565b92915050565b600060208284031215612c4957612c48612bd1565b5b6000612c5784828501612c1e565b91505092915050565b60008115159050919050565b612c7581612c60565b82525050565b6000602082019050612c906000830184612c6c565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612cd0578082015181840152602081019050612cb5565b60008484015250505050565b6000601f19601f8301169050919050565b6000612cf882612c96565b612d028185612ca1565b9350612d12818560208601612cb2565b612d1b81612cdc565b840191505092915050565b60006020820190508181036000830152612d408184612ced565b905092915050565b6000819050919050565b612d5b81612d48565b8114612d6657600080fd5b50565b600081359050612d7881612d52565b92915050565b600060208284031215612d9457612d93612bd1565b5b6000612da284828501612d69565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612dd682612dab565b9050919050565b612de681612dcb565b82525050565b6000602082019050612e016000830184612ddd565b92915050565b612e1081612dcb565b8114612e1b57600080fd5b50565b600081359050612e2d81612e07565b92915050565b60008060408385031215612e4a57612e49612bd1565b5b6000612e5885828601612e1e565b9250506020612e6985828601612d69565b9150509250929050565b612e7c81612d48565b82525050565b6000602082019050612e976000830184612e73565b92915050565b600080600060608486031215612eb657612eb5612bd1565b5b6000612ec486828701612e1e565b9350506020612ed586828701612e1e565b9250506040612ee686828701612d69565b9150509250925092565b612ef981612c60565b8114612f0457600080fd5b50565b600081359050612f1681612ef0565b92915050565b600060208284031215612f3257612f31612bd1565b5b6000612f4084828501612f07565b91505092915050565b600060208284031215612f5f57612f5e612bd1565b5b6000612f6d84828501612e1e565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612fb882612cdc565b810181811067ffffffffffffffff82111715612fd757612fd6612f80565b5b80604052505050565b6000612fea612bc7565b9050612ff68282612faf565b919050565b600067ffffffffffffffff82111561301657613015612f80565b5b61301f82612cdc565b9050602081019050919050565b82818337600083830152505050565b600061304e61304984612ffb565b612fe0565b90508281526020810184848401111561306a57613069612f7b565b5b61307584828561302c565b509392505050565b600082601f83011261309257613091612f76565b5b81356130a284826020860161303b565b91505092915050565b600080604083850312156130c2576130c1612bd1565b5b600083013567ffffffffffffffff8111156130e0576130df612bd6565b5b6130ec8582860161307d565b92505060206130fd85828601612f07565b9150509250929050565b60006020828403121561311d5761311c612bd1565b5b600082013567ffffffffffffffff81111561313b5761313a612bd6565b5b6131478482850161307d565b91505092915050565b6000806040838503121561316757613166612bd1565b5b600061317585828601612e1e565b925050602061318685828601612f07565b9150509250929050565b600067ffffffffffffffff8211156131ab576131aa612f80565b5b6131b482612cdc565b9050602081019050919050565b60006131d46131cf84613190565b612fe0565b9050828152602081018484840111156131f0576131ef612f7b565b5b6131fb84828561302c565b509392505050565b600082601f83011261321857613217612f76565b5b81356132288482602086016131c1565b91505092915050565b6000806000806080858703121561324b5761324a612bd1565b5b600061325987828801612e1e565b945050602061326a87828801612e1e565b935050604061327b87828801612d69565b925050606085013567ffffffffffffffff81111561329c5761329b612bd6565b5b6132a887828801613203565b91505092959194509250565b600080fd5b600080fd5b60008083601f8401126132d4576132d3612f76565b5b8235905067ffffffffffffffff8111156132f1576132f06132b4565b5b60208301915083602082028301111561330d5761330c6132b9565b5b9250929050565b6000806020838503121561332b5761332a612bd1565b5b600083013567ffffffffffffffff81111561334957613348612bd6565b5b613355858286016132be565b92509250509250929050565b6000806040838503121561337857613377612bd1565b5b600061338685828601612e1e565b925050602061339785828601612e1e565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806133e857607f821691505b6020821081036133fb576133fa6133a1565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b600061345d602183612ca1565b915061346882613401565b604082019050919050565b6000602082019050818103600083015261348c81613450565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000602082015250565b60006134ef603e83612ca1565b91506134fa82613493565b604082019050919050565b6000602082019050818103600083015261351e816134e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061355f82612d48565b915061356a83612d48565b925082820190508082111561358257613581613525565b5b92915050565b7f596f752063616e206f6e6c7920636c61696d20657665727920323420686f757260008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006135e4602183612ca1565b91506135ef82613588565b604082019050919050565b60006020820190508181036000830152613613816135d7565b9050919050565b7f4d696e74696e6720706175736564000000000000000000000000000000000000600082015250565b6000613650600e83612ca1565b915061365b8261361a565b602082019050919050565b6000602082019050818103600083015261367f81613643565b9050919050565b600061369182612d48565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036136c3576136c2613525565b5b600182019050919050565b60006136d982612d48565b91506136e483612d48565b92508282039050818111156136fc576136fb613525565b5b92915050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206e6f7220617070726f766564000000000000000000000000000000000000602082015250565b600061375e602e83612ca1565b915061376982613702565b604082019050919050565b6000602082019050818103600083015261378d81613751565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006137f0602b83612ca1565b91506137fb82613794565b604082019050919050565b6000602082019050818103600083015261381f816137e3565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613882602c83612ca1565b915061388d82613826565b604082019050919050565b600060208201905081810360008301526138b181613875565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061391d601883612ca1565b9150613928826138e7565b602082019050919050565b6000602082019050818103600083015261394c81613910565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006139af602983612ca1565b91506139ba82613953565b604082019050919050565b600060208201905081810360008301526139de816139a2565b9050919050565b600081905092915050565b60006139fb82612c96565b613a0581856139e5565b9350613a15818560208601612cb2565b80840191505092915050565b6000613a2d82846139f0565b915081905092915050565b7f596f75206e65656420746f206275726e203130204e46547320746f206765742060008201527f6120636f696e20746f6b656e0000000000000000000000000000000000000000602082015250565b6000613a94602c83612ca1565b9150613a9f82613a38565b604082019050919050565b60006020820190508181036000830152613ac381613a87565b9050919050565b7f43616c6c6572206973206e6f7420746f6b656e206f776e6572206e6f7220617060008201527f70726f7665640000000000000000000000000000000000000000000000000000602082015250565b6000613b26602683612ca1565b9150613b3182613aca565b604082019050919050565b60006020820190508181036000830152613b5581613b19565b9050919050565b7f436865636b20746865206974656d732c20796f752063616e6e6f74206275726e60008201527f2061207368696e696e67204e4654000000000000000000000000000000000000602082015250565b6000613bb8602e83612ca1565b9150613bc382613b5c565b604082019050919050565b60006020820190508181036000830152613be781613bab565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613c4a602683612ca1565b9150613c5582613bee565b604082019050919050565b60006020820190508181036000830152613c7981613c3d565b9050919050565b6000606082019050613c956000830186612e73565b613ca26020830185612ddd565b613caf6040830184612e73565b949350505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613cf182612d48565b9150613cfc83612d48565b925082613d0c57613d0b613cb7565b5b828206905092915050565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b6000613d73602e83612ca1565b9150613d7e82613d17565b604082019050919050565b60006020820190508181036000830152613da281613d66565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613e0b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613dce565b613e158683613dce565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613e52613e4d613e4884612d48565b613e2d565b612d48565b9050919050565b6000819050919050565b613e6c83613e37565b613e80613e7882613e59565b848454613ddb565b825550505050565b600090565b613e95613e88565b613ea0818484613e63565b505050565b5b81811015613ec457613eb9600082613e8d565b600181019050613ea6565b5050565b601f821115613f0957613eda81613da9565b613ee384613dbe565b81016020851015613ef2578190505b613f06613efe85613dbe565b830182613ea5565b50505b505050565b600082821c905092915050565b6000613f2c60001984600802613f0e565b1980831691505092915050565b6000613f458383613f1b565b9150826002028217905092915050565b613f5e82612c96565b67ffffffffffffffff811115613f7757613f76612f80565b5b613f8182546133d0565b613f8c828285613ec8565b600060209050601f831160018114613fbf5760008415613fad578287015190505b613fb78582613f39565b86555061401f565b601f198416613fcd86613da9565b60005b82811015613ff557848901518255600182019150602085019450602081019050613fd0565b86831015614012578489015161400e601f891682613f1b565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b6000614083602583612ca1565b915061408e82614027565b604082019050919050565b600060208201905081810360008301526140b281614076565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614115602483612ca1565b9150614120826140b9565b604082019050919050565b6000602082019050818103600083015261414481614108565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614181602083612ca1565b915061418c8261414b565b602082019050919050565b600060208201905081810360008301526141b081614174565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006141ed601983612ca1565b91506141f8826141b7565b602082019050919050565b6000602082019050818103600083015261421c816141e0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061427f603283612ca1565b915061428a82614223565b604082019050919050565b600060208201905081810360008301526142ae81614272565b9050919050565b600060ff82169050919050565b6142cb816142b5565b81146142d657600080fd5b50565b6000815190506142e8816142c2565b92915050565b60006020828403121561430457614303612bd1565b5b6000614312848285016142d9565b91505092915050565b60008160011c9050919050565b6000808291508390505b60018511156143725780860481111561434e5761434d613525565b5b600185161561435d5780820291505b808102905061436b8561431b565b9450614332565b94509492505050565b60008261438b5760019050614447565b816143995760009050614447565b81600181146143af57600281146143b9576143e8565b6001915050614447565b60ff8411156143cb576143ca613525565b5b8360020a9150848211156143e2576143e1613525565b5b50614447565b5060208310610133831016604e8410600b841016171561441d5782820a90508381111561441857614417613525565b5b614447565b61442a8484846001614328565b9250905081840481111561444157614440613525565b5b81810290505b9392505050565b600061445982612d48565b9150614464836142b5565b92506144917fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848461437b565b905092915050565b60006060820190506144ae6000830186612ddd565b6144bb6020830185612ddd565b6144c86040830184612e73565b949350505050565b6000815190506144df81612ef0565b92915050565b6000602082840312156144fb576144fa612bd1565b5b6000614509848285016144d0565b91505092915050565b600061451e82856139f0565b915061452a82846139f0565b91508190509392505050565b600081519050919050565b600082825260208201905092915050565b600061455d82614536565b6145678185614541565b9350614577818560208601612cb2565b61458081612cdc565b840191505092915050565b60006080820190506145a06000830187612ddd565b6145ad6020830186612ddd565b6145ba6040830185612e73565b81810360608301526145cc8184614552565b905095945050505050565b6000815190506145e681612c07565b92915050565b60006020828403121561460257614601612bd1565b5b6000614610848285016145d7565b91505092915050565b600061462482612d48565b915061462f83612d48565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561466857614667613525565b5b828202905092915050565b600061467e82612d48565b915061468983612d48565b92508261469957614698613cb7565b5b828204905092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006146da602083612ca1565b91506146e5826146a4565b602082019050919050565b60006020820190508181036000830152614709816146cd565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614746601c83612ca1565b915061475182614710565b602082019050919050565b6000602082019050818103600083015261477581614739565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fdfe68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d65774e4c3157554a696a39787169386a6f315941656566567937777a526a51577469457646667458586476512f57696e6472795f3633373936323438343130343130343737302e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d664261676d6148486339334345754b4171635148656d567276784e776843755a526b425a4c445a39683644352f4c61766167726f6e5f3633373936323438303438303738393230392e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d5132594238335466724559704d435745533735524a52624c426a5a4a56504641326d557468575a79343951722f4669726566795f3633373936323438313639373738333236312e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d52464b4454395773585035554473644a664238584478724651627079393254706e6544767162394456567a422f4f63746f7075735f3633373936323438323232303133383037392e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d5951356266715050346d33456e4c47784433324262625a68764d4a665736324c647953716d737379357a594e2f57696e67726f6e5f3633373936323438333535323535313138342e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d52653251345844485472377062437548366f3639365435584d6d32507350774867534c414b3462753841364e2f5761746572795f3633373936323438323930303431363231332e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d555a435157326e5175314c504d79747a47726336756750526f477534594262676665376d537a426b4b7a6a682f53746f6e656d616e5f3633373936323437393834343339333235332e6a736f6e68747470733a2f2f697066732e6d6f72616c69732e696f3a323035332f697066732f516d61625952514e575044597638617266364459587473657757793845786f33444a4a6e544e755673634e644b792f53746f6e65795f3633373936323437383833313636353036352e6a736f6ea2646970667358221220d35b8d019929766dd4477b324f5b03d3372009f2b9d00de4acf9df4a5518e7ab64736f6c63430008100033

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

0000000000000000000000006612e6b288c30f47c99e299163203fdc698ab219

-----Decoded View---------------
Arg [0] : _addressContract (address): 0x6612e6b288C30f47c99E299163203fdc698Ab219

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000006612e6b288c30f47c99e299163203fdc698ab219


Deployed Bytecode Sourcemap

113990:6544:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;119743:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92217:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93730:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93247:417;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;117054:928;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106123:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94430:336;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114987:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114106:30;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;114815:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;105791:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94837:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;114201:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;106313:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91928:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;91659:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70746:103;;;:::i;:::-;;70098:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;92386:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;118240:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118425:120;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;93973:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;95093:323;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;118589:516;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;120207:160;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;117994:107;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;94199:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71004:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;119743:226;119890:4;119923:36;119947:11;119923:23;:36::i;:::-;119916:43;;119743:226;;;:::o;92217:100::-;92271:13;92304:5;92297:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92217:100;:::o;93730:171::-;93806:7;93826:23;93841:7;93826:14;:23::i;:::-;93869:15;:24;93885:7;93869:24;;;;;;;;;;;;;;;;;;;;;93862:31;;93730:171;;;:::o;93247:417::-;93328:13;93344:23;93359:7;93344:14;:23::i;:::-;93328:39;;93392:5;93386:11;;:2;:11;;;93378:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;93486:5;93470:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;93495:37;93512:5;93519:12;:10;:12::i;:::-;93495:16;:37::i;:::-;93470:62;93448:174;;;;;;;;;;;;:::i;:::-;;;;;;;;;93635:21;93644:2;93648:7;93635:8;:21::i;:::-;93317:347;93247:417;;:::o;117054:928::-;117088:7;117176:17;117196:13;:25;117210:10;117196:25;;;;;;;;;;;;;;;;117176:45;;117289:15;117277:8;117262:12;:23;;;;:::i;:::-;:42;;117238:131;;;;;;;;;;;;:::i;:::-;;;;;;;;;117410:10;;;;;;;;;;;117386:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;117519:18;117540:11;:9;:11::i;:::-;117519:32;;117635:15;117607:13;:25;117621:10;117607:25;;;;;;;;;;;;;;;:43;;;;117725:30;117735:10;117747:7;;117725:9;:30::i;:::-;117804:43;117817:7;;117826:20;117835:10;117826:8;:20::i;:::-;117804:12;:43::i;:::-;117896:7;;:9;;;;;;;;;:::i;:::-;;;;;;117967:1;117959:7;;:9;;;;:::i;:::-;117952:16;;;;117054:928;:::o;106123:113::-;106184:7;106211:10;:17;;;;106204:24;;106123:113;:::o;94430:336::-;94625:41;94644:12;:10;:12::i;:::-;94658:7;94625:18;:41::i;:::-;94617:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;94730:28;94740:4;94746:2;94750:7;94730:9;:28::i;:::-;94430:336;;;:::o;114987:107::-;69984:13;:11;:13::i;:::-;115078:6:::1;115061:14;:23;;;;114987:107:::0;:::o;114106:30::-;;;;;;;;;;;;;:::o;114815:90::-;69984:13;:11;:13::i;:::-;114892:3:::1;114879:10;;:16;;;;;;;;;;;;;;;;;;114815:90:::0;:::o;105791:256::-;105888:7;105924:23;105941:5;105924:16;:23::i;:::-;105916:5;:31;105908:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;106013:12;:19;106026:5;106013:19;;;;;;;;;;;;;;;:26;106033:5;106013:26;;;;;;;;;;;;106006:33;;105791:256;;;;:::o;94837:185::-;94975:39;94992:4;94998:2;95002:7;94975:39;;;;;;;;;;;;:16;:39::i;:::-;94837:185;;;:::o;114201:33::-;;;;:::o;106313:233::-;106388:7;106424:30;:28;:30::i;:::-;106416:5;:38;106408:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;106521:10;106532:5;106521:17;;;;;;;;:::i;:::-;;;;;;;;;;106514:24;;106313:233;;;:::o;91928:222::-;92000:7;92020:13;92036:7;:16;92044:7;92036:16;;;;;;;;;;;;;;;;;;;;;92020:32;;92088:1;92071:19;;:5;:19;;;92063:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;92137:5;92130:12;;;91928:222;;;:::o;91659:207::-;91731:7;91776:1;91759:19;;:5;:19;;;91751:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;91842:9;:16;91852:5;91842:16;;;;;;;;;;;;;;;;91835:23;;91659:207;;;:::o;70746:103::-;69984:13;:11;:13::i;:::-;70811:30:::1;70838:1;70811:18;:30::i;:::-;70746:103::o:0;70098:87::-;70144:7;70171:6;;;;;;;;;;;70164:13;;70098:87;:::o;92386:104::-;92442:13;92475:7;92468:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;92386:104;:::o;118240:123::-;69984:13;:11;:13::i;:::-;118345:8:::1;118322:13;118336:5;118322:20;;;;;;:::i;:::-;;;;;;;;;;;;;;:31;;;;;;;;;;;;;;;;;;118240:123:::0;;:::o;118425:120::-;118489:4;118515:13;118529:5;118515:20;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;118508:27;;118425:120;;;:::o;93973:155::-;94068:52;94087:12;:10;:12::i;:::-;94101:8;94111;94068:18;:52::i;:::-;93973:155;;:::o;95093:323::-;95267:41;95286:12;:10;:12::i;:::-;95300:7;95267:18;:41::i;:::-;95259:100;;;;;;;;;;;;:::i;:::-;;;;;;;;;95370:38;95384:4;95390:2;95394:7;95403:4;95370:13;:38::i;:::-;95093:323;;;;:::o;118589:516::-;118681:2;118664:6;;:13;;:19;118656:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;118752:9;118748:316;118769:6;;:13;;118765:1;:17;118748:316;;;118813:43;118832:12;:10;:12::i;:::-;118846:6;;118853:1;118846:9;;;;;;;:::i;:::-;;;;;;;;118813:18;:43::i;:::-;118805:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;118928:13;118942:19;118951:6;;118958:1;118951:9;;;;;;;:::i;:::-;;;;;;;;118942:8;:19::i;:::-;118928:34;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;118920:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;119034:16;119040:6;;119047:1;119040:9;;;;;;;:::i;:::-;;;;;;;;119034:5;:16::i;:::-;118784:3;;;;;:::i;:::-;;;;118748:316;;;;119080:15;:13;:15::i;:::-;118589:516;;:::o;120207:160::-;120299:13;120334:23;120349:7;120334:14;:23::i;:::-;120327:30;;120207:160;;;:::o;117994:107::-;118041:4;118066:13;:25;118080:10;118066:25;;;;;;;;;;;;;;;;118059:32;;117994:107;:::o;94199:164::-;94296:4;94320:18;:25;94339:5;94320:25;;;;;;;;;;;;;;;:35;94346:8;94320:35;;;;;;;;;;;;;;;;;;;;;;;;;94313:42;;94199:164;;;;:::o;71004:201::-;69984:13;:11;:13::i;:::-;71113:1:::1;71093:22;;:8;:22;;::::0;71085:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;71169:28;71188:8;71169:18;:28::i;:::-;71004:201:::0;:::o;5248:114::-;5298:59;5353:2;5314:42;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5298:15;:59::i;:::-;5248:114;:::o;105483:224::-;105585:4;105624:35;105609:50;;;:11;:50;;;;:90;;;;105663:36;105687:11;105663:23;:36::i;:::-;105609:90;105602:97;;105483:224;;;:::o;101705:135::-;101787:16;101795:7;101787;:16::i;:::-;101779:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;101705:135;:::o;68649:98::-;68702:7;68729:10;68722:17;;68649:98;:::o;100984:174::-;101086:2;101059:15;:24;101075:7;101059:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;101142:7;101138:2;101104:46;;101113:23;101128:7;101113:14;:23::i;:::-;101104:46;;;;;;;;;;;;100984:174;;:::o;115210:156::-;115252:7;115352:4;115311:15;115328:10;115339:7;;115300:47;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;115289:59;;;;;;115280:69;;:76;;;;:::i;:::-;115273:83;;115210:156;:::o;97823:110::-;97899:26;97909:2;97913:7;97899:26;;;;;;;;;;;;:9;:26::i;:::-;97823:110;;:::o;115399:1584::-;115452:13;115491:3;115483:4;:11;115480:1494;;115513:120;;;;;;;;;;;;;;;;;;;;;115480:1494;115691:3;115683:4;:11;115680:1294;;115712:120;;;;;;;;;;;;;;;;;;;;;115680:1294;115878:3;115870:4;:11;115867:1107;;115899:120;;;;;;;;;;;;;;;;;;;;;115867:1107;116065:3;116057:4;:11;116054:920;;116086:120;;;;;;;;;;;;;;;;;;;;;116054:920;116260:3;116252:4;:11;116249:725;;116281:122;;;;;;;;;;;;;;;;;;;;;116249:725;116449:3;116441:4;:11;116438:536;;116470:122;;;;;;;;;;;;;;;;;;;;;116438:536;116638:3;116630:4;:11;116627:347;;116659:121;;;;;;;;;;;;;;;;;;;;;116627:347;116839:121;;;;;;;;;;;;;;;;;;;115399:1584;;;;:::o;112937:217::-;113037:16;113045:7;113037;:16::i;:::-;113029:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;113137:9;113115:10;:19;113126:7;113115:19;;;;;;;;;;;:31;;;;;;:::i;:::-;;112937:217;;:::o;97217:264::-;97310:4;97327:13;97343:23;97358:7;97343:14;:23::i;:::-;97327:39;;97396:5;97385:16;;:7;:16;;;:52;;;;97405:32;97422:5;97429:7;97405:16;:32::i;:::-;97385:52;:87;;;;97465:7;97441:31;;:20;97453:7;97441:11;:20::i;:::-;:31;;;97385:87;97377:96;;;97217:264;;;;:::o;100240:625::-;100399:4;100372:31;;:23;100387:7;100372:14;:23::i;:::-;:31;;;100364:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;100478:1;100464:16;;:2;:16;;;100456:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;100534:39;100555:4;100561:2;100565:7;100534:20;:39::i;:::-;100638:29;100655:1;100659:7;100638:8;:29::i;:::-;100699:1;100680:9;:15;100690:4;100680:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;100728:1;100711:9;:13;100721:2;100711:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;100759:2;100740:7;:16;100748:7;100740:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;100798:7;100794:2;100779:27;;100788:4;100779:27;;;;;;;;;;;;100819:38;100839:4;100845:2;100849:7;100819:19;:38::i;:::-;100240:625;;;:::o;70263:132::-;70338:12;:10;:12::i;:::-;70327:23;;:7;:5;:7::i;:::-;:23;;;70319:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70263:132::o;71365:191::-;71439:16;71458:6;;;;;;;;;;;71439:25;;71484:8;71475:6;;:17;;;;;;;;;;;;;;;;;;71539:8;71508:40;;71529:8;71508:40;;;;;;;;;;;;71428:128;71365:191;:::o;101301:315::-;101456:8;101447:17;;:5;:17;;;101439:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;101543:8;101505:18;:25;101524:5;101505:25;;;;;;;;;;;;;;;:35;101531:8;101505:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;101589:8;101567:41;;101582:5;101567:41;;;101599:8;101567:41;;;;;;:::i;:::-;;;;;;;;101301:315;;;:::o;96297:313::-;96453:28;96463:4;96469:2;96473:7;96453:9;:28::i;:::-;96500:47;96523:4;96529:2;96533:7;96542:4;96500:22;:47::i;:::-;96492:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;96297:313;;;;:::o;120379:119::-;120468:20;120480:7;120468:11;:20::i;:::-;120379:119;:::o;119185:178::-;119231:13;;;;;;;;;;;:26;;;119266:13;;;;;;;;;;;119282:10;119294:58;119298:14;;119327:13;;;;;;;;;;;:22;;;:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;119322:2;119314:37;;;;:::i;:::-;119294:3;:58::i;:::-;119231:122;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;119185:178::o;112157:624::-;112230:13;112256:23;112271:7;112256:14;:23::i;:::-;112292;112318:10;:19;112329:7;112318:19;;;;;;;;;;;112292:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;112348:18;112369:10;:8;:10::i;:::-;112348:31;;112477:1;112461:4;112455:18;:23;112451:72;;112502:9;112495:16;;;;;;112451:72;112653:1;112633:9;112627:23;:27;112623:108;;;112702:4;112708:9;112685:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;112671:48;;;;;;112623:108;112750:23;112765:7;112750:14;:23::i;:::-;112743:30;;;;112157:624;;;;:::o;183:295::-;248:21;272:7;:14;248:38;;291:22;134:42;291:40;;384:2;375:7;371:16;467:1;464;449:13;435:12;419:14;412:5;401:68;345:129;;;;183:295;:::o;91290:305::-;91392:4;91444:25;91429:40;;;:11;:40;;;;:105;;;;91501:33;91486:48;;;:11;:48;;;;91429:105;:158;;;;91551:36;91575:11;91551:23;:36::i;:::-;91429:158;91409:178;;91290:305;;;:::o;96923:127::-;96988:4;97040:1;97012:30;;:7;:16;97020:7;97012:16;;;;;;;;;;;;;;;;;;;;;:30;;;;97005:37;;96923:127;;;:::o;98160:319::-;98289:18;98295:2;98299:7;98289:5;:18::i;:::-;98340:53;98371:1;98375:2;98379:7;98388:4;98340:22;:53::i;:::-;98318:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;98160:319;;;:::o;119981:214::-;120140:45;120167:4;120173:2;120177:7;120140:26;:45::i;:::-;119981:214;;;:::o;104340:125::-;;;;:::o;102404:853::-;102558:4;102579:15;:2;:13;;;:15::i;:::-;102575:675;;;102631:2;102615:36;;;102652:12;:10;:12::i;:::-;102666:4;102672:7;102681:4;102615:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;102611:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;102873:1;102856:6;:13;:18;102852:328;;102899:60;;;;;;;;;;:::i;:::-;;;;;;;;102852:328;103130:6;103124:13;103115:6;103111:2;103107:15;103100:38;102611:584;102747:41;;;102737:51;;;:6;:51;;;;102730:58;;;;;102575:675;103234:4;103227:11;;102404:853;;;;;;;:::o;113379:206::-;113448:20;113460:7;113448:11;:20::i;:::-;113522:1;113491:10;:19;113502:7;113491:19;;;;;;;;;;;113485:33;;;;;:::i;:::-;;;:38;113481:97;;113547:10;:19;113558:7;113547:19;;;;;;;;;;;;113540:26;;;;:::i;:::-;113481:97;113379:206;:::o;119439:223::-;119497:7;119528:1;119523;:6;119519:51;;119555:1;119548:8;;;;119519:51;119582:9;119598:1;119594;:5;;;;:::i;:::-;119582:17;;119629:1;119624;119620;:5;;;;:::i;:::-;:10;119612:19;;;;;;119651:1;119644:8;;;119439:223;;;;;:::o;93091:94::-;93142:13;93168:9;;;;;;;;;;;;;;93091:94;:::o;92561:281::-;92634:13;92660:23;92675:7;92660:14;:23::i;:::-;92696:21;92720:10;:8;:10::i;:::-;92696:34;;92772:1;92754:7;92748:21;:25;:86;;;;;;;;;;;;;;;;;92800:7;92809:18;:7;:16;:18::i;:::-;92783:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;92748:86;92741:93;;;92561:281;;;:::o;82952:157::-;83037:4;83076:25;83061:40;;;:11;:40;;;;83054:47;;82952:157;;;:::o;98815:439::-;98909:1;98895:16;;:2;:16;;;98887:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;98968:16;98976:7;98968;:16::i;:::-;98967:17;98959:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;99030:45;99059:1;99063:2;99067:7;99030:20;:45::i;:::-;99105:1;99088:9;:13;99098:2;99088:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;99136:2;99117:7;:16;99125:7;99117:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;99181:7;99177:2;99156:33;;99173:1;99156:33;;;;;;;;;;;;99202:44;99230:1;99234:2;99238:7;99202:19;:44::i;:::-;98815:439;;:::o;107159:589::-;107303:45;107330:4;107336:2;107340:7;107303:26;:45::i;:::-;107381:1;107365:18;;:4;:18;;;107361:187;;107400:40;107432:7;107400:31;:40::i;:::-;107361:187;;;107470:2;107462:10;;:4;:10;;;107458:90;;107489:47;107522:4;107528:7;107489:32;:47::i;:::-;107458:90;107361:187;107576:1;107562:16;;:2;:16;;;107558:183;;107595:45;107632:7;107595:36;:45::i;:::-;107558:183;;;107668:4;107662:10;;:2;:10;;;107658:83;;107689:40;107717:2;107721:7;107689:27;:40::i;:::-;107658:83;107558:183;107159:589;;;:::o;72796:326::-;72856:4;73113:1;73091:7;:19;;;:23;73084:30;;72796:326;;;:::o;99483:420::-;99543:13;99559:23;99574:7;99559:14;:23::i;:::-;99543:39;;99595:48;99616:5;99631:1;99635:7;99595:20;:48::i;:::-;99684:29;99701:1;99705:7;99684:8;:29::i;:::-;99746:1;99726:9;:16;99736:5;99726:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;99765:7;:16;99773:7;99765:16;;;;;;;;;;;;99758:23;;;;;;;;;;;99827:7;99823:1;99799:36;;99808:5;99799:36;;;;;;;;;;;;99848:47;99868:5;99883:1;99887:7;99848:19;:47::i;:::-;99532:371;99483:420;:::o;65903:723::-;65959:13;66189:1;66180:5;:10;66176:53;;66207:10;;;;;;;;;;;;;;;;;;;;;66176:53;66239:12;66254:5;66239:20;;66270:14;66295:78;66310:1;66302:4;:9;66295:78;;66328:8;;;;;:::i;:::-;;;;66359:2;66351:10;;;;;:::i;:::-;;;66295:78;;;66383:19;66415:6;66405:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66383:39;;66433:154;66449:1;66440:5;:10;66433:154;;66477:1;66467:11;;;;;:::i;:::-;;;66544:2;66536:5;:10;;;;:::i;:::-;66523:2;:24;;;;:::i;:::-;66510:39;;66493:6;66500;66493:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;66573:2;66564:11;;;;;:::i;:::-;;;66433:154;;;66611:6;66597:21;;;;;65903:723;;;;:::o;103829:126::-;;;;:::o;108471:164::-;108575:10;:17;;;;108548:15;:24;108564:7;108548:24;;;;;;;;;;;:44;;;;108603:10;108619:7;108603:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;108471:164;:::o;109262:988::-;109528:22;109578:1;109553:22;109570:4;109553:16;:22::i;:::-;:26;;;;:::i;:::-;109528:51;;109590:18;109611:17;:26;109629:7;109611:26;;;;;;;;;;;;109590:47;;109758:14;109744:10;:28;109740:328;;109789:19;109811:12;:18;109824:4;109811:18;;;;;;;;;;;;;;;:34;109830:14;109811:34;;;;;;;;;;;;109789:56;;109895:11;109862:12;:18;109875:4;109862:18;;;;;;;;;;;;;;;:30;109881:10;109862:30;;;;;;;;;;;:44;;;;110012:10;109979:17;:30;109997:11;109979:30;;;;;;;;;;;:43;;;;109774:294;109740:328;110164:17;:26;110182:7;110164:26;;;;;;;;;;;110157:33;;;110208:12;:18;110221:4;110208:18;;;;;;;;;;;;;;;:34;110227:14;110208:34;;;;;;;;;;;110201:41;;;109343:907;;109262:988;;:::o;110545:1079::-;110798:22;110843:1;110823:10;:17;;;;:21;;;;:::i;:::-;110798:46;;110855:18;110876:15;:24;110892:7;110876:24;;;;;;;;;;;;110855:45;;111227:19;111249:10;111260:14;111249:26;;;;;;;;:::i;:::-;;;;;;;;;;111227:48;;111313:11;111288:10;111299;111288:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;111424:10;111393:15;:28;111409:11;111393:28;;;;;;;;;;;:41;;;;111565:15;:24;111581:7;111565:24;;;;;;;;;;;111558:31;;;111600:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;110616:1008;;;110545:1079;:::o;108049:221::-;108134:14;108151:20;108168:2;108151:16;:20::i;:::-;108134:37;;108209:7;108182:12;:16;108195:2;108182:16;;;;;;;;;;;;;;;:24;108199:6;108182:24;;;;;;;;;;;:34;;;;108256:6;108227:17;:26;108245:7;108227:26;;;;;;;;;;;:35;;;;108123:147;108049:221;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:116::-;5937:21;5952:5;5937:21;:::i;:::-;5930:5;5927:32;5917:60;;5973:1;5970;5963:12;5917:60;5867:116;:::o;5989:133::-;6032:5;6070:6;6057:20;6048:29;;6086:30;6110:5;6086:30;:::i;:::-;5989:133;;;;:::o;6128:323::-;6184:6;6233:2;6221:9;6212:7;6208:23;6204:32;6201:119;;;6239:79;;:::i;:::-;6201:119;6359:1;6384:50;6426:7;6417:6;6406:9;6402:22;6384:50;:::i;:::-;6374:60;;6330:114;6128:323;;;;:::o;6457:329::-;6516:6;6565:2;6553:9;6544:7;6540:23;6536:32;6533:119;;;6571:79;;:::i;:::-;6533:119;6691:1;6716:53;6761:7;6752:6;6741:9;6737:22;6716:53;:::i;:::-;6706:63;;6662:117;6457:329;;;;:::o;6792:117::-;6901:1;6898;6891:12;6915:117;7024:1;7021;7014:12;7038:180;7086:77;7083:1;7076:88;7183:4;7180:1;7173:15;7207:4;7204:1;7197:15;7224:281;7307:27;7329:4;7307:27;:::i;:::-;7299:6;7295:40;7437:6;7425:10;7422:22;7401:18;7389:10;7386:34;7383:62;7380:88;;;7448:18;;:::i;:::-;7380:88;7488:10;7484:2;7477:22;7267:238;7224:281;;:::o;7511:129::-;7545:6;7572:20;;:::i;:::-;7562:30;;7601:33;7629:4;7621:6;7601:33;:::i;:::-;7511:129;;;:::o;7646:308::-;7708:4;7798:18;7790:6;7787:30;7784:56;;;7820:18;;:::i;:::-;7784:56;7858:29;7880:6;7858:29;:::i;:::-;7850:37;;7942:4;7936;7932:15;7924:23;;7646:308;;;:::o;7960:146::-;8057:6;8052:3;8047;8034:30;8098:1;8089:6;8084:3;8080:16;8073:27;7960:146;;;:::o;8112:425::-;8190:5;8215:66;8231:49;8273:6;8231:49;:::i;:::-;8215:66;:::i;:::-;8206:75;;8304:6;8297:5;8290:21;8342:4;8335:5;8331:16;8380:3;8371:6;8366:3;8362:16;8359:25;8356:112;;;8387:79;;:::i;:::-;8356:112;8477:54;8524:6;8519:3;8514;8477:54;:::i;:::-;8196:341;8112:425;;;;;:::o;8557:340::-;8613:5;8662:3;8655:4;8647:6;8643:17;8639:27;8629:122;;8670:79;;:::i;:::-;8629:122;8787:6;8774:20;8812:79;8887:3;8879:6;8872:4;8864:6;8860:17;8812:79;:::i;:::-;8803:88;;8619:278;8557:340;;;;:::o;8903:648::-;8978:6;8986;9035:2;9023:9;9014:7;9010:23;9006:32;9003:119;;;9041:79;;:::i;:::-;9003:119;9189:1;9178:9;9174:17;9161:31;9219:18;9211:6;9208:30;9205:117;;;9241:79;;:::i;:::-;9205:117;9346:63;9401:7;9392:6;9381:9;9377:22;9346:63;:::i;:::-;9336:73;;9132:287;9458:2;9484:50;9526:7;9517:6;9506:9;9502:22;9484:50;:::i;:::-;9474:60;;9429:115;8903:648;;;;;:::o;9557:509::-;9626:6;9675:2;9663:9;9654:7;9650:23;9646:32;9643:119;;;9681:79;;:::i;:::-;9643:119;9829:1;9818:9;9814:17;9801:31;9859:18;9851:6;9848:30;9845:117;;;9881:79;;:::i;:::-;9845:117;9986:63;10041:7;10032:6;10021:9;10017:22;9986:63;:::i;:::-;9976:73;;9772:287;9557:509;;;;:::o;10072:468::-;10137:6;10145;10194:2;10182:9;10173:7;10169:23;10165:32;10162:119;;;10200:79;;:::i;:::-;10162:119;10320:1;10345:53;10390:7;10381:6;10370:9;10366:22;10345:53;:::i;:::-;10335:63;;10291:117;10447:2;10473:50;10515:7;10506:6;10495:9;10491:22;10473:50;:::i;:::-;10463:60;;10418:115;10072:468;;;;;:::o;10546:307::-;10607:4;10697:18;10689:6;10686:30;10683:56;;;10719:18;;:::i;:::-;10683:56;10757:29;10779:6;10757:29;:::i;:::-;10749:37;;10841:4;10835;10831:15;10823:23;;10546:307;;;:::o;10859:423::-;10936:5;10961:65;10977:48;11018:6;10977:48;:::i;:::-;10961:65;:::i;:::-;10952:74;;11049:6;11042:5;11035:21;11087:4;11080:5;11076:16;11125:3;11116:6;11111:3;11107:16;11104:25;11101:112;;;11132:79;;:::i;:::-;11101:112;11222:54;11269:6;11264:3;11259;11222:54;:::i;:::-;10942:340;10859:423;;;;;:::o;11301:338::-;11356:5;11405:3;11398:4;11390:6;11386:17;11382:27;11372:122;;11413:79;;:::i;:::-;11372:122;11530:6;11517:20;11555:78;11629:3;11621:6;11614:4;11606:6;11602:17;11555:78;:::i;:::-;11546:87;;11362:277;11301:338;;;;:::o;11645:943::-;11740:6;11748;11756;11764;11813:3;11801:9;11792:7;11788:23;11784:33;11781:120;;;11820:79;;:::i;:::-;11781:120;11940:1;11965:53;12010:7;12001:6;11990:9;11986:22;11965:53;:::i;:::-;11955:63;;11911:117;12067:2;12093:53;12138:7;12129:6;12118:9;12114:22;12093:53;:::i;:::-;12083:63;;12038:118;12195:2;12221:53;12266:7;12257:6;12246:9;12242:22;12221:53;:::i;:::-;12211:63;;12166:118;12351:2;12340:9;12336:18;12323:32;12382:18;12374:6;12371:30;12368:117;;;12404:79;;:::i;:::-;12368:117;12509:62;12563:7;12554:6;12543:9;12539:22;12509:62;:::i;:::-;12499:72;;12294:287;11645:943;;;;;;;:::o;12594:117::-;12703:1;12700;12693:12;12717:117;12826:1;12823;12816:12;12857:568;12930:8;12940:6;12990:3;12983:4;12975:6;12971:17;12967:27;12957:122;;12998:79;;:::i;:::-;12957:122;13111:6;13098:20;13088:30;;13141:18;13133:6;13130:30;13127:117;;;13163:79;;:::i;:::-;13127:117;13277:4;13269:6;13265:17;13253:29;;13331:3;13323:4;13315:6;13311:17;13301:8;13297:32;13294:41;13291:128;;;13338:79;;:::i;:::-;13291:128;12857:568;;;;;:::o;13431:559::-;13517:6;13525;13574:2;13562:9;13553:7;13549:23;13545:32;13542:119;;;13580:79;;:::i;:::-;13542:119;13728:1;13717:9;13713:17;13700:31;13758:18;13750:6;13747:30;13744:117;;;13780:79;;:::i;:::-;13744:117;13893:80;13965:7;13956:6;13945:9;13941:22;13893:80;:::i;:::-;13875:98;;;;13671:312;13431:559;;;;;:::o;13996:474::-;14064:6;14072;14121:2;14109:9;14100:7;14096:23;14092:32;14089:119;;;14127:79;;:::i;:::-;14089:119;14247:1;14272:53;14317:7;14308:6;14297:9;14293:22;14272:53;:::i;:::-;14262:63;;14218:117;14374:2;14400:53;14445:7;14436:6;14425:9;14421:22;14400:53;:::i;:::-;14390:63;;14345:118;13996:474;;;;;:::o;14476:180::-;14524:77;14521:1;14514:88;14621:4;14618:1;14611:15;14645:4;14642:1;14635:15;14662:320;14706:6;14743:1;14737:4;14733:12;14723:22;;14790:1;14784:4;14780:12;14811:18;14801:81;;14867:4;14859:6;14855:17;14845:27;;14801:81;14929:2;14921:6;14918:14;14898:18;14895:38;14892:84;;14948:18;;:::i;:::-;14892:84;14713:269;14662:320;;;:::o;14988:220::-;15128:34;15124:1;15116:6;15112:14;15105:58;15197:3;15192:2;15184:6;15180:15;15173:28;14988:220;:::o;15214:366::-;15356:3;15377:67;15441:2;15436:3;15377:67;:::i;:::-;15370:74;;15453:93;15542:3;15453:93;:::i;:::-;15571:2;15566:3;15562:12;15555:19;;15214:366;;;:::o;15586:419::-;15752:4;15790:2;15779:9;15775:18;15767:26;;15839:9;15833:4;15829:20;15825:1;15814:9;15810:17;15803:47;15867:131;15993:4;15867:131;:::i;:::-;15859:139;;15586:419;;;:::o;16011:249::-;16151:34;16147:1;16139:6;16135:14;16128:58;16220:32;16215:2;16207:6;16203:15;16196:57;16011:249;:::o;16266:366::-;16408:3;16429:67;16493:2;16488:3;16429:67;:::i;:::-;16422:74;;16505:93;16594:3;16505:93;:::i;:::-;16623:2;16618:3;16614:12;16607:19;;16266:366;;;:::o;16638:419::-;16804:4;16842:2;16831:9;16827:18;16819:26;;16891:9;16885:4;16881:20;16877:1;16866:9;16862:17;16855:47;16919:131;17045:4;16919:131;:::i;:::-;16911:139;;16638:419;;;:::o;17063:180::-;17111:77;17108:1;17101:88;17208:4;17205:1;17198:15;17232:4;17229:1;17222:15;17249:191;17289:3;17308:20;17326:1;17308:20;:::i;:::-;17303:25;;17342:20;17360:1;17342:20;:::i;:::-;17337:25;;17385:1;17382;17378:9;17371:16;;17406:3;17403:1;17400:10;17397:36;;;17413:18;;:::i;:::-;17397:36;17249:191;;;;:::o;17446:220::-;17586:34;17582:1;17574:6;17570:14;17563:58;17655:3;17650:2;17642:6;17638:15;17631:28;17446:220;:::o;17672:366::-;17814:3;17835:67;17899:2;17894:3;17835:67;:::i;:::-;17828:74;;17911:93;18000:3;17911:93;:::i;:::-;18029:2;18024:3;18020:12;18013:19;;17672:366;;;:::o;18044:419::-;18210:4;18248:2;18237:9;18233:18;18225:26;;18297:9;18291:4;18287:20;18283:1;18272:9;18268:17;18261:47;18325:131;18451:4;18325:131;:::i;:::-;18317:139;;18044:419;;;:::o;18469:164::-;18609:16;18605:1;18597:6;18593:14;18586:40;18469:164;:::o;18639:366::-;18781:3;18802:67;18866:2;18861:3;18802:67;:::i;:::-;18795:74;;18878:93;18967:3;18878:93;:::i;:::-;18996:2;18991:3;18987:12;18980:19;;18639:366;;;:::o;19011:419::-;19177:4;19215:2;19204:9;19200:18;19192:26;;19264:9;19258:4;19254:20;19250:1;19239:9;19235:17;19228:47;19292:131;19418:4;19292:131;:::i;:::-;19284:139;;19011:419;;;:::o;19436:233::-;19475:3;19498:24;19516:5;19498:24;:::i;:::-;19489:33;;19544:66;19537:5;19534:77;19531:103;;19614:18;;:::i;:::-;19531:103;19661:1;19654:5;19650:13;19643:20;;19436:233;;;:::o;19675:194::-;19715:4;19735:20;19753:1;19735:20;:::i;:::-;19730:25;;19769:20;19787:1;19769:20;:::i;:::-;19764:25;;19813:1;19810;19806:9;19798:17;;19837:1;19831:4;19828:11;19825:37;;;19842:18;;:::i;:::-;19825:37;19675:194;;;;:::o;19875:233::-;20015:34;20011:1;20003:6;19999:14;19992:58;20084:16;20079:2;20071:6;20067:15;20060:41;19875:233;:::o;20114:366::-;20256:3;20277:67;20341:2;20336:3;20277:67;:::i;:::-;20270:74;;20353:93;20442:3;20353:93;:::i;:::-;20471:2;20466:3;20462:12;20455:19;;20114:366;;;:::o;20486:419::-;20652:4;20690:2;20679:9;20675:18;20667:26;;20739:9;20733:4;20729:20;20725:1;20714:9;20710:17;20703:47;20767:131;20893:4;20767:131;:::i;:::-;20759:139;;20486:419;;;:::o;20911:230::-;21051:34;21047:1;21039:6;21035:14;21028:58;21120:13;21115:2;21107:6;21103:15;21096:38;20911:230;:::o;21147:366::-;21289:3;21310:67;21374:2;21369:3;21310:67;:::i;:::-;21303:74;;21386:93;21475:3;21386:93;:::i;:::-;21504:2;21499:3;21495:12;21488:19;;21147:366;;;:::o;21519:419::-;21685:4;21723:2;21712:9;21708:18;21700:26;;21772:9;21766:4;21762:20;21758:1;21747:9;21743:17;21736:47;21800:131;21926:4;21800:131;:::i;:::-;21792:139;;21519:419;;;:::o;21944:231::-;22084:34;22080:1;22072:6;22068:14;22061:58;22153:14;22148:2;22140:6;22136:15;22129:39;21944:231;:::o;22181:366::-;22323:3;22344:67;22408:2;22403:3;22344:67;:::i;:::-;22337:74;;22420:93;22509:3;22420:93;:::i;:::-;22538:2;22533:3;22529:12;22522:19;;22181:366;;;:::o;22553:419::-;22719:4;22757:2;22746:9;22742:18;22734:26;;22806:9;22800:4;22796:20;22792:1;22781:9;22777:17;22770:47;22834:131;22960:4;22834:131;:::i;:::-;22826:139;;22553:419;;;:::o;22978:180::-;23026:77;23023:1;23016:88;23123:4;23120:1;23113:15;23147:4;23144:1;23137:15;23164:174;23304:26;23300:1;23292:6;23288:14;23281:50;23164:174;:::o;23344:366::-;23486:3;23507:67;23571:2;23566:3;23507:67;:::i;:::-;23500:74;;23583:93;23672:3;23583:93;:::i;:::-;23701:2;23696:3;23692:12;23685:19;;23344:366;;;:::o;23716:419::-;23882:4;23920:2;23909:9;23905:18;23897:26;;23969:9;23963:4;23959:20;23955:1;23944:9;23940:17;23933:47;23997:131;24123:4;23997:131;:::i;:::-;23989:139;;23716:419;;;:::o;24141:228::-;24281:34;24277:1;24269:6;24265:14;24258:58;24350:11;24345:2;24337:6;24333:15;24326:36;24141:228;:::o;24375:366::-;24517:3;24538:67;24602:2;24597:3;24538:67;:::i;:::-;24531:74;;24614:93;24703:3;24614:93;:::i;:::-;24732:2;24727:3;24723:12;24716:19;;24375:366;;;:::o;24747:419::-;24913:4;24951:2;24940:9;24936:18;24928:26;;25000:9;24994:4;24990:20;24986:1;24975:9;24971:17;24964:47;25028:131;25154:4;25028:131;:::i;:::-;25020:139;;24747:419;;;:::o;25172:148::-;25274:11;25311:3;25296:18;;25172:148;;;;:::o;25326:390::-;25432:3;25460:39;25493:5;25460:39;:::i;:::-;25515:89;25597:6;25592:3;25515:89;:::i;:::-;25508:96;;25613:65;25671:6;25666:3;25659:4;25652:5;25648:16;25613:65;:::i;:::-;25703:6;25698:3;25694:16;25687:23;;25436:280;25326:390;;;;:::o;25722:275::-;25854:3;25876:95;25967:3;25958:6;25876:95;:::i;:::-;25869:102;;25988:3;25981:10;;25722:275;;;;:::o;26003:231::-;26143:34;26139:1;26131:6;26127:14;26120:58;26212:14;26207:2;26199:6;26195:15;26188:39;26003:231;:::o;26240:366::-;26382:3;26403:67;26467:2;26462:3;26403:67;:::i;:::-;26396:74;;26479:93;26568:3;26479:93;:::i;:::-;26597:2;26592:3;26588:12;26581:19;;26240:366;;;:::o;26612:419::-;26778:4;26816:2;26805:9;26801:18;26793:26;;26865:9;26859:4;26855:20;26851:1;26840:9;26836:17;26829:47;26893:131;27019:4;26893:131;:::i;:::-;26885:139;;26612:419;;;:::o;27037:225::-;27177:34;27173:1;27165:6;27161:14;27154:58;27246:8;27241:2;27233:6;27229:15;27222:33;27037:225;:::o;27268:366::-;27410:3;27431:67;27495:2;27490:3;27431:67;:::i;:::-;27424:74;;27507:93;27596:3;27507:93;:::i;:::-;27625:2;27620:3;27616:12;27609:19;;27268:366;;;:::o;27640:419::-;27806:4;27844:2;27833:9;27829:18;27821:26;;27893:9;27887:4;27883:20;27879:1;27868:9;27864:17;27857:47;27921:131;28047:4;27921:131;:::i;:::-;27913:139;;27640:419;;;:::o;28065:233::-;28205:34;28201:1;28193:6;28189:14;28182:58;28274:16;28269:2;28261:6;28257:15;28250:41;28065:233;:::o;28304:366::-;28446:3;28467:67;28531:2;28526:3;28467:67;:::i;:::-;28460:74;;28543:93;28632:3;28543:93;:::i;:::-;28661:2;28656:3;28652:12;28645:19;;28304:366;;;:::o;28676:419::-;28842:4;28880:2;28869:9;28865:18;28857:26;;28929:9;28923:4;28919:20;28915:1;28904:9;28900:17;28893:47;28957:131;29083:4;28957:131;:::i;:::-;28949:139;;28676:419;;;:::o;29101:225::-;29241:34;29237:1;29229:6;29225:14;29218:58;29310:8;29305:2;29297:6;29293:15;29286:33;29101:225;:::o;29332:366::-;29474:3;29495:67;29559:2;29554:3;29495:67;:::i;:::-;29488:74;;29571:93;29660:3;29571:93;:::i;:::-;29689:2;29684:3;29680:12;29673:19;;29332:366;;;:::o;29704:419::-;29870:4;29908:2;29897:9;29893:18;29885:26;;29957:9;29951:4;29947:20;29943:1;29932:9;29928:17;29921:47;29985:131;30111:4;29985:131;:::i;:::-;29977:139;;29704:419;;;:::o;30129:442::-;30278:4;30316:2;30305:9;30301:18;30293:26;;30329:71;30397:1;30386:9;30382:17;30373:6;30329:71;:::i;:::-;30410:72;30478:2;30467:9;30463:18;30454:6;30410:72;:::i;:::-;30492;30560:2;30549:9;30545:18;30536:6;30492:72;:::i;:::-;30129:442;;;;;;:::o;30577:180::-;30625:77;30622:1;30615:88;30722:4;30719:1;30712:15;30746:4;30743:1;30736:15;30763:176;30795:1;30812:20;30830:1;30812:20;:::i;:::-;30807:25;;30846:20;30864:1;30846:20;:::i;:::-;30841:25;;30885:1;30875:35;;30890:18;;:::i;:::-;30875:35;30931:1;30928;30924:9;30919:14;;30763:176;;;;:::o;30945:233::-;31085:34;31081:1;31073:6;31069:14;31062:58;31154:16;31149:2;31141:6;31137:15;31130:41;30945:233;:::o;31184:366::-;31326:3;31347:67;31411:2;31406:3;31347:67;:::i;:::-;31340:74;;31423:93;31512:3;31423:93;:::i;:::-;31541:2;31536:3;31532:12;31525:19;;31184:366;;;:::o;31556:419::-;31722:4;31760:2;31749:9;31745:18;31737:26;;31809:9;31803:4;31799:20;31795:1;31784:9;31780:17;31773:47;31837:131;31963:4;31837:131;:::i;:::-;31829:139;;31556:419;;;:::o;31981:141::-;32030:4;32053:3;32045:11;;32076:3;32073:1;32066:14;32110:4;32107:1;32097:18;32089:26;;31981:141;;;:::o;32128:93::-;32165:6;32212:2;32207;32200:5;32196:14;32192:23;32182:33;;32128:93;;;:::o;32227:107::-;32271:8;32321:5;32315:4;32311:16;32290:37;;32227:107;;;;:::o;32340:393::-;32409:6;32459:1;32447:10;32443:18;32482:97;32512:66;32501:9;32482:97;:::i;:::-;32600:39;32630:8;32619:9;32600:39;:::i;:::-;32588:51;;32672:4;32668:9;32661:5;32657:21;32648:30;;32721:4;32711:8;32707:19;32700:5;32697:30;32687:40;;32416:317;;32340:393;;;;;:::o;32739:60::-;32767:3;32788:5;32781:12;;32739:60;;;:::o;32805:142::-;32855:9;32888:53;32906:34;32915:24;32933:5;32915:24;:::i;:::-;32906:34;:::i;:::-;32888:53;:::i;:::-;32875:66;;32805:142;;;:::o;32953:75::-;32996:3;33017:5;33010:12;;32953:75;;;:::o;33034:269::-;33144:39;33175:7;33144:39;:::i;:::-;33205:91;33254:41;33278:16;33254:41;:::i;:::-;33246:6;33239:4;33233:11;33205:91;:::i;:::-;33199:4;33192:105;33110:193;33034:269;;;:::o;33309:73::-;33354:3;33309:73;:::o;33388:189::-;33465:32;;:::i;:::-;33506:65;33564:6;33556;33550:4;33506:65;:::i;:::-;33441:136;33388:189;;:::o;33583:186::-;33643:120;33660:3;33653:5;33650:14;33643:120;;;33714:39;33751:1;33744:5;33714:39;:::i;:::-;33687:1;33680:5;33676:13;33667:22;;33643:120;;;33583:186;;:::o;33775:543::-;33876:2;33871:3;33868:11;33865:446;;;33910:38;33942:5;33910:38;:::i;:::-;33994:29;34012:10;33994:29;:::i;:::-;33984:8;33980:44;34177:2;34165:10;34162:18;34159:49;;;34198:8;34183:23;;34159:49;34221:80;34277:22;34295:3;34277:22;:::i;:::-;34267:8;34263:37;34250:11;34221:80;:::i;:::-;33880:431;;33865:446;33775:543;;;:::o;34324:117::-;34378:8;34428:5;34422:4;34418:16;34397:37;;34324:117;;;;:::o;34447:169::-;34491:6;34524:51;34572:1;34568:6;34560:5;34557:1;34553:13;34524:51;:::i;:::-;34520:56;34605:4;34599;34595:15;34585:25;;34498:118;34447:169;;;;:::o;34621:295::-;34697:4;34843:29;34868:3;34862:4;34843:29;:::i;:::-;34835:37;;34905:3;34902:1;34898:11;34892:4;34889:21;34881:29;;34621:295;;;;:::o;34921:1395::-;35038:37;35071:3;35038:37;:::i;:::-;35140:18;35132:6;35129:30;35126:56;;;35162:18;;:::i;:::-;35126:56;35206:38;35238:4;35232:11;35206:38;:::i;:::-;35291:67;35351:6;35343;35337:4;35291:67;:::i;:::-;35385:1;35409:4;35396:17;;35441:2;35433:6;35430:14;35458:1;35453:618;;;;36115:1;36132:6;36129:77;;;36181:9;36176:3;36172:19;36166:26;36157:35;;36129:77;36232:67;36292:6;36285:5;36232:67;:::i;:::-;36226:4;36219:81;36088:222;35423:887;;35453:618;35505:4;35501:9;35493:6;35489:22;35539:37;35571:4;35539:37;:::i;:::-;35598:1;35612:208;35626:7;35623:1;35620:14;35612:208;;;35705:9;35700:3;35696:19;35690:26;35682:6;35675:42;35756:1;35748:6;35744:14;35734:24;;35803:2;35792:9;35788:18;35775:31;;35649:4;35646:1;35642:12;35637:17;;35612:208;;;35848:6;35839:7;35836:19;35833:179;;;35906:9;35901:3;35897:19;35891:26;35949:48;35991:4;35983:6;35979:17;35968:9;35949:48;:::i;:::-;35941:6;35934:64;35856:156;35833:179;36058:1;36054;36046:6;36042:14;36038:22;36032:4;36025:36;35460:611;;;35423:887;;35013:1303;;;34921:1395;;:::o;36322:224::-;36462:34;36458:1;36450:6;36446:14;36439:58;36531:7;36526:2;36518:6;36514:15;36507:32;36322:224;:::o;36552:366::-;36694:3;36715:67;36779:2;36774:3;36715:67;:::i;:::-;36708:74;;36791:93;36880:3;36791:93;:::i;:::-;36909:2;36904:3;36900:12;36893:19;;36552:366;;;:::o;36924:419::-;37090:4;37128:2;37117:9;37113:18;37105:26;;37177:9;37171:4;37167:20;37163:1;37152:9;37148:17;37141:47;37205:131;37331:4;37205:131;:::i;:::-;37197:139;;36924:419;;;:::o;37349:223::-;37489:34;37485:1;37477:6;37473:14;37466:58;37558:6;37553:2;37545:6;37541:15;37534:31;37349:223;:::o;37578:366::-;37720:3;37741:67;37805:2;37800:3;37741:67;:::i;:::-;37734:74;;37817:93;37906:3;37817:93;:::i;:::-;37935:2;37930:3;37926:12;37919:19;;37578:366;;;:::o;37950:419::-;38116:4;38154:2;38143:9;38139:18;38131:26;;38203:9;38197:4;38193:20;38189:1;38178:9;38174:17;38167:47;38231:131;38357:4;38231:131;:::i;:::-;38223:139;;37950:419;;;:::o;38375:182::-;38515:34;38511:1;38503:6;38499:14;38492:58;38375:182;:::o;38563:366::-;38705:3;38726:67;38790:2;38785:3;38726:67;:::i;:::-;38719:74;;38802:93;38891:3;38802:93;:::i;:::-;38920:2;38915:3;38911:12;38904:19;;38563:366;;;:::o;38935:419::-;39101:4;39139:2;39128:9;39124:18;39116:26;;39188:9;39182:4;39178:20;39174:1;39163:9;39159:17;39152:47;39216:131;39342:4;39216:131;:::i;:::-;39208:139;;38935:419;;;:::o;39360:175::-;39500:27;39496:1;39488:6;39484:14;39477:51;39360:175;:::o;39541:366::-;39683:3;39704:67;39768:2;39763:3;39704:67;:::i;:::-;39697:74;;39780:93;39869:3;39780:93;:::i;:::-;39898:2;39893:3;39889:12;39882:19;;39541:366;;;:::o;39913:419::-;40079:4;40117:2;40106:9;40102:18;40094:26;;40166:9;40160:4;40156:20;40152:1;40141:9;40137:17;40130:47;40194:131;40320:4;40194:131;:::i;:::-;40186:139;;39913:419;;;:::o;40338:237::-;40478:34;40474:1;40466:6;40462:14;40455:58;40547:20;40542:2;40534:6;40530:15;40523:45;40338:237;:::o;40581:366::-;40723:3;40744:67;40808:2;40803:3;40744:67;:::i;:::-;40737:74;;40820:93;40909:3;40820:93;:::i;:::-;40938:2;40933:3;40929:12;40922:19;;40581:366;;;:::o;40953:419::-;41119:4;41157:2;41146:9;41142:18;41134:26;;41206:9;41200:4;41196:20;41192:1;41181:9;41177:17;41170:47;41234:131;41360:4;41234:131;:::i;:::-;41226:139;;40953:419;;;:::o;41378:86::-;41413:7;41453:4;41446:5;41442:16;41431:27;;41378:86;;;:::o;41470:118::-;41541:22;41557:5;41541:22;:::i;:::-;41534:5;41531:33;41521:61;;41578:1;41575;41568:12;41521:61;41470:118;:::o;41594:139::-;41649:5;41680:6;41674:13;41665:22;;41696:31;41721:5;41696:31;:::i;:::-;41594:139;;;;:::o;41739:347::-;41807:6;41856:2;41844:9;41835:7;41831:23;41827:32;41824:119;;;41862:79;;:::i;:::-;41824:119;41982:1;42007:62;42061:7;42052:6;42041:9;42037:22;42007:62;:::i;:::-;41997:72;;41953:126;41739:347;;;;:::o;42092:102::-;42134:8;42181:5;42178:1;42174:13;42153:34;;42092:102;;;:::o;42200:848::-;42261:5;42268:4;42292:6;42283:15;;42316:5;42307:14;;42330:712;42351:1;42341:8;42338:15;42330:712;;;42446:4;42441:3;42437:14;42431:4;42428:24;42425:50;;;42455:18;;:::i;:::-;42425:50;42505:1;42495:8;42491:16;42488:451;;;42920:4;42913:5;42909:16;42900:25;;42488:451;42970:4;42964;42960:15;42952:23;;43000:32;43023:8;43000:32;:::i;:::-;42988:44;;42330:712;;;42200:848;;;;;;;:::o;43054:1073::-;43108:5;43299:8;43289:40;;43320:1;43311:10;;43322:5;;43289:40;43348:4;43338:36;;43365:1;43356:10;;43367:5;;43338:36;43434:4;43482:1;43477:27;;;;43518:1;43513:191;;;;43427:277;;43477:27;43495:1;43486:10;;43497:5;;;43513:191;43558:3;43548:8;43545:17;43542:43;;;43565:18;;:::i;:::-;43542:43;43614:8;43611:1;43607:16;43598:25;;43649:3;43642:5;43639:14;43636:40;;;43656:18;;:::i;:::-;43636:40;43689:5;;;43427:277;;43813:2;43803:8;43800:16;43794:3;43788:4;43785:13;43781:36;43763:2;43753:8;43750:16;43745:2;43739:4;43736:12;43732:35;43716:111;43713:246;;;43869:8;43863:4;43859:19;43850:28;;43904:3;43897:5;43894:14;43891:40;;;43911:18;;:::i;:::-;43891:40;43944:5;;43713:246;43984:42;44022:3;44012:8;44006:4;44003:1;43984:42;:::i;:::-;43969:57;;;;44058:4;44053:3;44049:14;44042:5;44039:25;44036:51;;;44067:18;;:::i;:::-;44036:51;44116:4;44109:5;44105:16;44096:25;;43054:1073;;;;;;:::o;44133:281::-;44191:5;44215:23;44233:4;44215:23;:::i;:::-;44207:31;;44259:25;44275:8;44259:25;:::i;:::-;44247:37;;44303:104;44340:66;44330:8;44324:4;44303:104;:::i;:::-;44294:113;;44133:281;;;;:::o;44420:442::-;44569:4;44607:2;44596:9;44592:18;44584:26;;44620:71;44688:1;44677:9;44673:17;44664:6;44620:71;:::i;:::-;44701:72;44769:2;44758:9;44754:18;44745:6;44701:72;:::i;:::-;44783;44851:2;44840:9;44836:18;44827:6;44783:72;:::i;:::-;44420:442;;;;;;:::o;44868:137::-;44922:5;44953:6;44947:13;44938:22;;44969:30;44993:5;44969:30;:::i;:::-;44868:137;;;;:::o;45011:345::-;45078:6;45127:2;45115:9;45106:7;45102:23;45098:32;45095:119;;;45133:79;;:::i;:::-;45095:119;45253:1;45278:61;45331:7;45322:6;45311:9;45307:22;45278:61;:::i;:::-;45268:71;;45224:125;45011:345;;;;:::o;45362:435::-;45542:3;45564:95;45655:3;45646:6;45564:95;:::i;:::-;45557:102;;45676:95;45767:3;45758:6;45676:95;:::i;:::-;45669:102;;45788:3;45781:10;;45362:435;;;;;:::o;45803:98::-;45854:6;45888:5;45882:12;45872:22;;45803:98;;;:::o;45907:168::-;45990:11;46024:6;46019:3;46012:19;46064:4;46059:3;46055:14;46040:29;;45907:168;;;;:::o;46081:373::-;46167:3;46195:38;46227:5;46195:38;:::i;:::-;46249:70;46312:6;46307:3;46249:70;:::i;:::-;46242:77;;46328:65;46386:6;46381:3;46374:4;46367:5;46363:16;46328:65;:::i;:::-;46418:29;46440:6;46418:29;:::i;:::-;46413:3;46409:39;46402:46;;46171:283;46081:373;;;;:::o;46460:640::-;46655:4;46693:3;46682:9;46678:19;46670:27;;46707:71;46775:1;46764:9;46760:17;46751:6;46707:71;:::i;:::-;46788:72;46856:2;46845:9;46841:18;46832:6;46788:72;:::i;:::-;46870;46938:2;46927:9;46923:18;46914:6;46870:72;:::i;:::-;46989:9;46983:4;46979:20;46974:2;46963:9;46959:18;46952:48;47017:76;47088:4;47079:6;47017:76;:::i;:::-;47009:84;;46460:640;;;;;;;:::o;47106:141::-;47162:5;47193:6;47187:13;47178:22;;47209:32;47235:5;47209:32;:::i;:::-;47106:141;;;;:::o;47253:349::-;47322:6;47371:2;47359:9;47350:7;47346:23;47342:32;47339:119;;;47377:79;;:::i;:::-;47339:119;47497:1;47522:63;47577:7;47568:6;47557:9;47553:22;47522:63;:::i;:::-;47512:73;;47468:127;47253:349;;;;:::o;47608:348::-;47648:7;47671:20;47689:1;47671:20;:::i;:::-;47666:25;;47705:20;47723:1;47705:20;:::i;:::-;47700:25;;47893:1;47825:66;47821:74;47818:1;47815:81;47810:1;47803:9;47796:17;47792:105;47789:131;;;47900:18;;:::i;:::-;47789:131;47948:1;47945;47941:9;47930:20;;47608:348;;;;:::o;47962:185::-;48002:1;48019:20;48037:1;48019:20;:::i;:::-;48014:25;;48053:20;48071:1;48053:20;:::i;:::-;48048:25;;48092:1;48082:35;;48097:18;;:::i;:::-;48082:35;48139:1;48136;48132:9;48127:14;;47962:185;;;;:::o;48153:182::-;48293:34;48289:1;48281:6;48277:14;48270:58;48153:182;:::o;48341:366::-;48483:3;48504:67;48568:2;48563:3;48504:67;:::i;:::-;48497:74;;48580:93;48669:3;48580:93;:::i;:::-;48698:2;48693:3;48689:12;48682:19;;48341:366;;;:::o;48713:419::-;48879:4;48917:2;48906:9;48902:18;48894:26;;48966:9;48960:4;48956:20;48952:1;48941:9;48937:17;48930:47;48994:131;49120:4;48994:131;:::i;:::-;48986:139;;48713:419;;;:::o;49138:178::-;49278:30;49274:1;49266:6;49262:14;49255:54;49138:178;:::o;49322:366::-;49464:3;49485:67;49549:2;49544:3;49485:67;:::i;:::-;49478:74;;49561:93;49650:3;49561:93;:::i;:::-;49679:2;49674:3;49670:12;49663:19;;49322:366;;;:::o;49694:419::-;49860:4;49898:2;49887:9;49883:18;49875:26;;49947:9;49941:4;49937:20;49933:1;49922:9;49918:17;49911:47;49975:131;50101:4;49975:131;:::i;:::-;49967:139;;49694:419;;;:::o;50119:180::-;50167:77;50164:1;50157:88;50264:4;50261:1;50254:15;50288:4;50285:1;50278:15

Swarm Source

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

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