POL Price: $0.303003 (-3.94%)
Gas: 30 GWei
 

Overview

Max Total Supply

484 AQUA

Holders

329

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

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

Click here to update the token information / general information
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.

Contract Source Code Verified (Exact Match)

Contract Name:
AquaticWars

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 18 : AquaticWars.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "./Base64.sol";
import "./Fish.sol";
import "./AliveFishWithBubble.sol";
import "./DeadFish.sol";

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

   struct Aqua { 
      string name;
      string fishType;
      string description;
      string fishColor1;
      string fishColor2;
      string fishColor3;
      bool alive;
      uint256 spwanTimestamp;
      uint256 size;
      uint256 bubbleStillOnUntilTimestamp;
      uint256 deathTimestamp;
   }
   
   mapping (uint256 => Aqua) public aquas;
   uint256 public cost = 1 ether;
   uint256 public extendBubbleCost = 1 ether;
   uint256 public takeSteroidsCost = 1 ether;

   event Eaten (uint256 indexed _eaterId, uint256 indexed _eatenId);
   
   constructor() ERC721("AquaticWars", "AQUA") {}

  function mint() public payable {
    uint256 supply = totalSupply();
    
    Aqua memory newAqua = Aqua(
        string(abi.encodePacked('Aquatic Wars #', uint256(supply + 1).toString())), 
        "AquaFish",
        "Aquatic Wars is 100% on-chain, dynamic, NFT game.",        
        randomNum(361, block.difficulty+10, supply).toString(),
        randomNum(361, block.timestamp, supply+20).toString(),
        randomNum(361, block.difficulty+30, block.timestamp).toString(),
        true,
        block.timestamp,
        1,
        block.timestamp + 1 days,
        0
        );
    
    if (msg.sender != owner()) {
      require(msg.value >= cost);
    }
    
    aquas[supply + 1] = newAqua;
    _safeMint(msg.sender, supply + 1);
    cost = (cost * 1001) / 1000;

}

  function randomNum(uint256 _mod, uint256 _seed, uint _salt) public view returns(uint256) {
      uint256 num = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _seed, _salt)));
      num = uint(keccak256(abi.encodePacked(block.timestamp, msg.sender, _seed, _salt, num))) % _mod;
      return num;
  }

  function getAquaByIndex(uint256 _tokenId) public view returns(Aqua memory) {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return aqua;
  }

  function getSize(uint256 _tokenId) public view returns(uint256) {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return aqua.size;
  }

  function hasBubble(uint256 _tokenId) public view returns(bool){
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return ((int(block.timestamp) - int(aqua.bubbleStillOnUntilTimestamp)) < 0);
  }

  function eat(uint256 _eaterId, uint256 _eatenId) public {
    require(_exists(_eaterId),"ERC721Metadata: Query for nonexistent token");
    require(_exists(_eatenId),"ERC721Metadata: Query for nonexistent token");
    require(ownerOf(_eaterId) == msg.sender,"You are not the owner's of the eater Aqua");
    require(isAlive(_eatenId),"Eaten Id has already been eaten");
    require(isAlive(_eaterId),"Eater Id has already been eaten");
    Aqua storage eater = aquas[_eaterId];
    Aqua storage eaten = aquas[_eatenId];
    require(eater.size > eaten.size, "Eater is not big enough to eat this fish");
    require(!hasBubble(_eatenId),"You can't eat fish with a protective bubble");

    if(getSize(_eaterId) > getSize(_eatenId) && !hasBubble(_eatenId)){
        eaten.alive = false;
        eater.size = eater.size + 1;
        eaten.deathTimestamp = block.timestamp;
        emit Eaten(_eatenId, _eaterId);
    }
  }

  function extendBubble(uint256 _tokenId) payable public {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    require(isAlive(_tokenId),"Eaten Id has already been eaten");
    if (msg.sender != owner()) {
        require(msg.value >= takeSteroidsCost, "You need to pay to take steroids");
    }
    Aqua storage aqua = aquas[_tokenId];
    if(hasBubble(_tokenId)){
        aqua.bubbleStillOnUntilTimestamp = aqua.bubbleStillOnUntilTimestamp + 1 days;
    }else{
        aqua.bubbleStillOnUntilTimestamp = block.timestamp + 1 days;
    }
  }

  function takeSteroids(uint256 _tokenId) payable public {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    require(isAlive(_tokenId),"Eaten Id has already been eaten");
    if (msg.sender != owner()) {
        require(msg.value >= takeSteroidsCost, "You need to pay to take steroids");
    }
    Aqua storage aqua = aquas[_tokenId];
    aqua.size = aqua.size + 1;
    console.log("aqua.size: " , aqua.size);
  }

  function timeAlive(uint256 _tokenId) public view returns(uint256) {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return block.timestamp - aqua.spwanTimestamp;
  }

  function calculateDaysAlive(uint256 _tokenId) public view returns(uint256) {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return ((block.timestamp - aqua.spwanTimestamp) / 86400)+1;
  }

  function isAlive(uint256 _tokenId) public view returns(bool) {
    require(_exists(_tokenId),"ERC721Metadata: Query for nonexistent token");
    Aqua memory aqua = aquas[_tokenId];
    return aqua.alive;
  }
  
  function buildImage(uint256 _tokenId) public view returns(string memory) {
    Aqua memory currentAqua = aquas[_tokenId];
    uint256 daysAlive = calculateDaysAlive(_tokenId); 
    uint256 size = getSize(_tokenId);
    uint256 dimensions1 = 4800-size;
    uint256 dimensions2 = 10980-(size*2);
    if(dimensions1 < 0){
        dimensions1 = 0;
        dimensions2 = 1380;
    }
    uint256 backgroundFinsColor1 = randomNum(361, block.difficulty, _tokenId+100);
    if(currentAqua.alive == false){
        bytes memory imagePart1 = DeadFish.Fish2String();
        bytes memory imagePart2 = bytes(
            abi.encodePacked(
                '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>',
                '</svg>'
            )
        );
        string memory svg = Base64.encode(bytes(
          abi.encodePacked(
              imagePart1,
              imagePart2
          )
         ));
        return svg;
    }else{
        bytes memory imagePart1 = AliveFishWithBubble.Fish2StringPart1();
        bytes memory imagePart2 = bytes(
                abi.encodePacked(
                    '<defs>',
                    '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradFish" gradientTransform="rotate(90)">',
                    '<stop offset="0%" stop-color="hsl(',currentAqua.fishColor1,', 90%, 40%)"/>',
                    '<stop offset="50%" stop-color="hsl(',currentAqua.fishColor2,', 90%, 37%)"/>',
                    '<stop offset="100%" stop-color="hsl(',currentAqua.fishColor3,', 90%, 37%)"/>',
                    '</linearGradient>',
                    '</defs>'
                )
            );
        bytes memory imagePart3 = bytes(
                abi.encodePacked(
                    '<defs>',
                    '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradFishFin" gradientTransform="rotate(90)">',
                    '<stop offset="0%" stop-color="hsl(',backgroundFinsColor1.toString(),', 80%, 40%)"/>',
                    '<stop offset="50%" stop-color="hsl(',(backgroundFinsColor1+70).toString(),', 80%, 37%)"/>',
                    '<stop offset="100%" stop-color="hsl(',(backgroundFinsColor1+200).toString(),', 80%, 37%)"/>',
                    '</linearGradient>',
                    '</defs>'
                )
            );
        if(hasBubble(_tokenId)){
            bytes memory imagePart4 = AliveFishWithBubble.Fish2StringPart4();
            bytes memory imagePart5 = bytes(
                    abi.encodePacked(
                        '<svg viewBox="-',dimensions1.toString(),' -',dimensions1.toString(),' ',dimensions2.toString(),' ',dimensions2.toString(),'">'
                    )
                    
                );
            bytes memory imagePart6 = Fish.Fish2String();
            bytes memory imagePart7 = bytes(
                    abi.encodePacked(
                        '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>',
                        '<text x="530" y="80" class="small">Days Alive: ',daysAlive.toString(),'</text>',
                        '<text x="35" y="1330" class="small">Size: ',size.toString(),'</text>',
                        '</svg>'
                    )
                );
            string memory svg = Base64.encode(bytes(
                abi.encodePacked(
                    imagePart1,
                    imagePart2,
                    imagePart3,
                    imagePart4,
                    imagePart5,
                    imagePart6,
                    imagePart7
                )
            ));
            return svg;
        }else{
        bytes memory imagePart4 = bytes(
                abi.encodePacked(
                    '<rect width="1380" height="1380" fill="url(#gradBackground)"/>',
                    '<svg viewBox="-',dimensions1.toString(),' -',dimensions1.toString(),' ',dimensions2.toString(),' ',dimensions2.toString(),'">'
                )
                
            );
        bytes memory imagePart5 = Fish.Fish2String();
        bytes memory imagePart6 = bytes(
                abi.encodePacked(
                    '<text x="35" y="80" class="small"># ',_tokenId.toString(),'</text>',
                    '<text x="465" y="80" class="small">Days Alive: ',daysAlive.toString(),'</text>',
                    '<text x="35" y="1330" class="small">Size: ',size.toString(),'</text>',
                    '</svg>'
                )
            );
        string memory svg = Base64.encode(bytes(
            abi.encodePacked(
                imagePart1,
                imagePart2,
                imagePart3,
                imagePart4,
                imagePart5,
                imagePart6
            )
        ));
        return svg;
        }
    }
  }
  
  function buildMetadata(uint256 _tokenId) public view returns(string memory) {
      Aqua memory currentImage = aquas[_tokenId];
      return string(abi.encodePacked(
              'data:application/json;base64,', Base64.encode(bytes(abi.encodePacked(
                          '{"name":"', 
                          currentImage.name,
                          '", "description":"', 
                          currentImage.description,
                          '", "image": "', 
                          'data:image/svg+xml;base64,', 
                          buildImage(_tokenId),
                          '"}')))));
  }

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

  function setMintCost(uint256 _newCost) public onlyOwner() {
    cost = _newCost;
  }
  
  function setBubbleCost(uint256 _newCost) public onlyOwner() {
    extendBubbleCost = _newCost;
  }
  
  function setSteroidsCost(uint256 _newCost) public onlyOwner() {
    takeSteroidsCost = _newCost;
  }

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

File 2 of 18 : console.sol
// SPDX-License-Identifier: MIT
pragma solidity >= 0.4.22 <0.9.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

}

File 3 of 18 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 4 of 18 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/Context.sol";

/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

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

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

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

File 5 of 18 : Base64.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

library Base64 {
    string internal constant TABLE = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

    function encode(bytes memory data) internal pure returns (string memory) {
        if (data.length == 0) return '';
        
        // load the table into memory
        string memory table = TABLE;

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((data.length + 2) / 3);

        // add some extra buffer at the end required for the writing
        string memory result = new string(encodedLen + 32);

        assembly {
            // set the actual output length
            mstore(result, encodedLen)
            
            // prepare the lookup table
            let tablePtr := add(table, 1)
            
            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))
            
            // result ptr, jump over length
            let resultPtr := add(result, 32)
            
            // run over the input, 3 bytes at a time
            for {} lt(dataPtr, endPtr) {}
            {
               dataPtr := add(dataPtr, 3)
               
               // read 3 bytes
               let input := mload(dataPtr)
               
               // write 4 characters
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(shr( 6, input), 0x3F)))))
               resultPtr := add(resultPtr, 1)
               mstore(resultPtr, shl(248, mload(add(tablePtr, and(        input,  0x3F)))))
               resultPtr := add(resultPtr, 1)
            }
            
            // padding with '='
            switch mod(mload(data), 3)
            case 1 { mstore(sub(resultPtr, 2), shl(240, 0x3d3d)) }
            case 2 { mstore(sub(resultPtr, 1), shl(248, 0x3d)) }
        }
        
        return result;
    }
}

File 6 of 18 : Fish.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

library Fish {
    function Fish2String() public pure returns (bytes memory) {
        return bytes(
          abi.encodePacked(
              '<g transform="translate(0.000000,1380.000000) scale(0.100000,-0.100000)" fill="#000000" stroke="none">',
              '<path fill="url(#gradFish)" d="M5255 10965 c-228 -31 -513 -112 -575 -163 -81 -68 -110 -207 -75 -362 10 -41 22 -96 28 -121 9 -42 8 -51 -21 -112 -38 -83 -151 -199 -330 -342 -407 -324 -678 -633 -837 -960 -113 -230 -149 -378 -150 -610 0 -121 5 -170 24 -255 23 -107 69 -237 114 -327 l26 -50 -22 -81 c-13 -45 -27 -86 -32 -90 -6 -5 -44 -22 -85 -37 -276 -101 -388 -241 -302 -376 34 -51 50 -66 114 -103 122 -69 109 -145 -82 -496 -92 -169 -131 -280 -137 -395 -4 -77 -2 -99 17 -149 29 -75 90 -137 168 -168 50 -20 74 -23 200 -23 l142 0 25 -85 c144 -484 385 -945 704 -1345 120 -150 391 -423 536 -539 418 -334 898 -557 1390 -645 197 -35 335 -44 574 -38 316 8 555 46 789 126 57 20 84 25 87 18 71 -233 143 -362 281 -501 164 -168 357 -253 644 -287 124 -14 331 -7 408 15 161 44 236 128 236 261 0 82 -31 154 -86 200 -42 35 -105 118 -124 164 -8 20 -24 70 -35 111 -24 90 -78 208 -119 260 -17 21 -30 42 -30 46 0 5 21 18 46 28 67 28 161 120 245 243 69 101 130 169 261 288 31 28 66 71 78 95 30 59 32 148 5 205 -80 166 -389 285 -740 285 -175 0 -281 -24 -430 -95 -148 -71 -301 -196 -396 -323 -24 -31 -46 -61 -50 -65 -4 -5 -27 10 -50 34 -24 23 -86 75 -137 116 -51 41 -111 97 -133 126 -219 276 -191 743 61 1045 98 117 268 224 418 263 107 27 108 27 128 -33 104 -316 342 -601 667 -797 226 -136 431 -120 701 57 117 77 211 101 461 117 216 14 332 51 411 130 136 136 86 329 -149 572 -205 212 -533 436 -775 529 l-72 28 93 95 c312 320 512 715 597 1175 61 334 48 718 -35 1047 -239 941 -941 1600 -1889 1773 -207 38 -340 48 -621 45 l-260 -3 -50 30 c-338 204 -770 367 -1155 434 -161 28 -540 36 -695 15z m526 -149 c128 -15 353 -55 345 -63 -2 -2 -66 0 -142 6 -481 35 -814 14 -984 -61 -146 -65 -187 -159 -139 -314 54 -173 -10 -319 -203 -466 -253 -192 -620 -540 -789 -748 -149 -182 -272 -370 -341 -520 -19 -41 -40 -86 -46 -100 l-12 -25 6 25 c16 73 61 196 104 285 96 198 217 361 428 577 129 131 185 181 458 406 174 143 286 279 314 381 14 52 12 141 -5 197 -39 128 -41 232 -6 275 39 48 376 131 616 152 101 9 281 6 396 -7z m1934 -481 c473 -27 966 -216 1320 -505 363 -297 627 -723 744 -1202 52 -211 65 -330 65 -568 0 -272 -21 -415 -101 -679 -126 -416 -406 -805 -745 -1036 -279 -190 -473 -281 -783 -369 -79 -22 -144 -36 -440 -92 -149 -28 -442 -37 -733 -23 -151 8 -276 11 -278 7 -2 -3 22 -16 53 -28 154 -58 339 -91 579 -105 l111 -7 -87 -86 c-98 -98 -132 -146 -190 -260 -134 -268 -144 -621 -26 -877 62 -133 110 -191 267 -317 279 -225 379 -433 280 -586 -62 -96 -167 -172 -322 -232 -132 -50 -402 -105 -578 -116 -87 -6 -107 -4 -214 25 -233 62 -382 119 -597 226 -621 311 -1072 855 -1235 1490 -140 546 -46 1054 251 1348 70 69 176 142 252 173 l55 22 85 -63 c162 -120 306 -186 319 -148 2 7 -4 19 -14 27 -10 8 -54 43 -98 77 -117 92 -290 271 -365 377 -125 177 -179 302 -216 497 -24 126 -25 408 -1 525 19 97 66 262 93 333 16 42 17 49 4 58 -24 15 -85 -62 -140 -176 -56 -116 -76 -174 -105 -305 l-20 -95 -45 5 c-25 3 -153 5 -285 4 -311 -1 -580 -30 -878 -95 -54 -11 -101 -18 -104 -15 -8 8 50 189 107 333 312 781 919 1445 1730 1890 575 316 1310 538 1898 572 133 8 178 8 387 -4z m-2862 -2841 c30 -4 47 -12 47 -20 0 -10 -16 -14 -57 -14 -32 -1 -110 -7 -173 -16 -63 -8 -214 -19 -335 -24 -323 -13 -568 -55 -793 -136 -111 -40 -174 -75 -197 -106 -27 -39 -19 -110 24 -214 71 -168 74 -247 15 -336 -22 -35 -116 -118 -133 -118 -4 0 9 34 30 75 76 157 100 296 65 379 -19 46 -80 112 -131 142 -23 13 -50 33 -60 44 -18 20 -18 21 10 50 124 129 721 272 1275 304 85 5 352 -2 413 -10z m62 -185 c4 -17 5 -32 3 -34 -2 -3 -53 2 -114 10 -155 21 -300 18 -480 -9 -29 -5 -33 -4 -18 3 57 25 325 58 491 60 l111 1 7 -31z m-7 -214 c-3 -3 -77 -22 -164 -41 -329 -74 -588 -170 -813 -302 -25 -14 -42 -21 -38 -15 8 13 252 152 332 188 137 63 313 114 512 150 130 24 181 29 171 20z m330 -439 l23 -18 -75 -43 c-104 -59 -161 -102 -237 -182 -132 -136 -232 -325 -284 -538 -10 -39 -19 -73 -21 -76 -2 -3 -31 8 -65 25 -50 25 -76 31 -149 34 -102 5 -161 -10 -255 -66 -126 -76 -185 -152 -185 -240 0 -91 36 -148 210 -332 146 -155 194 -215 228 -289 22 -48 24 -60 17 -135 -17 -187 -5 -239 69 -304 33 -29 117 -62 156 -62 35 0 120 32 148 55 l29 25 53 -93 c228 -401 540 -716 942 -951 82 -48 205 -109 378 -189 l35 -16 -35 6 c-316 49 -555 125 -855 273 -638 313 -1175 859 -1510 1535 -87 176 -141 306 -192 460 -36 108 -75 246 -71 250 2 1 35 13 73 25 406 132 987 489 1404 863 l84 75 31 -37 c17 -20 41 -44 54 -55z m4914 -1155 c83 -166 11 -226 -302 -251 -313 -25 -411 -52 -573 -162 -121 -82 -237 -115 -345 -98 -56 10 -153 53 -202 90 -20 16 -12 14 40 -7 86 -35 216 -43 291 -19 57 19 92 41 194 121 84 66 194 125 290 155 65 20 82 21 255 15 211 -8 254 -1 294 46 41 48 32 111 -29 214 l-35 60 45 -50 c25 -27 60 -79 77 -114z m-1454 -2274 c10 -34 29 -94 41 -133 27 -91 80 -177 159 -258 57 -60 62 -68 62 -110 0 -37 -5 -48 -31 -70 -54 -46 -127 -61 -289 -60 -153 0 -308 24 -424 64 -49 17 -176 85 -176 95 0 1 33 -10 74 -26 314 -122 688 -126 737 -8 16 40 7 67 -60 169 -78 119 -122 231 -129 334 -6 95 7 96 36 3z" />',
              '<path fill="url(#gradFishFin)" d="M6690 10149 c-605 -157 -1180 -438 -1661 -813 l-63 -49 25 -20 c51 -42 128 -70 180 -65 72 7 117 44 188 153 63 97 126 161 189 191 64 30 116 29 247 -7 107 -29 135 -33 250 -34 171 0 251 23 380 109 125 83 234 217 333 409 61 119 76 157 59 157 -7 -1 -64 -14 -127 -31z"/>',
              '<path fill="url(#gradFishFin)" d="M4479 8812 c-39 -10 -208 -208 -365 -427 l-79 -110 -3 -120 c-3 -119 -3 -120 23 -145 23 -22 35 -25 98 -24 57 0 80 5 110 23 49 30 132 33 175 5 121 -77 126 -79 182 -79 52 0 60 3 120 52 87 69 179 166 224 233 153 232 68 476 -200 571 -62 22 -235 34 -285 21z"/>',
              '<path d="M6823 8845 c-147 -45 -282 -208 -329 -395 -20 -80 -22 -216 -4 -290 30 -125 107 -231 199 -273 35 -16 66 -22 126 -22 108 0 173 30 266 124 111 114 171 267 172 441 1 288 -204 486 -430 415z m180 -262 c39 -41 57 -94 57 -165 -1 -164 -121 -246 -197 -135 -47 69 -51 184 -8 267 33 64 102 80 148 33z"/>',
              '<path d="M9183 8654 c-173 -86 -250 -350 -156 -533 40 -77 95 -114 178 -119 55 -4 73 0 119 22 165 81 248 328 172 510 -55 133 -187 183 -313 120z m46 -220 c52 -66 0 -212 -71 -202 -15 2 -29 16 -41 41 -26 52 -15 111 28 154 40 40 57 41 84 7z"/>',
              '<path d="M8794 8362 c-130 -104 -263 -138 -514 -129 -183 6 -268 19 -503 78 -160 40 -160 41 -186 21 -34 -25 -39 -47 -40 -187 -3 -463 181 -801 488 -895 79 -25 215 -27 292 -4 192 56 372 227 474 447 61 131 102 279 130 464 21 145 20 208 -5 233 -33 33 -70 25 -136 -28z m-775 -598 c142 -47 281 -155 358 -278 25 -38 25 -40 7 -53 -31 -22 -143 -53 -193 -53 -107 0 -218 55 -301 148 -48 54 -121 187 -135 246 l-6 29 93 -5 c64 -4 119 -14 177 -34z"/>',
              '</g>',
              '</svg>'
          ));
    }
}

File 7 of 18 : AliveFishWithBubble.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

library AliveFishWithBubble {
    function Fish2StringPart1() public pure returns (bytes memory) {
    return bytes(
            abi.encodePacked(
                '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1380pt" height="1380pt" viewBox="0 0 1380 1380" preserveAspectRatio="xMidYMid meet">',
                '<style> .small { font:  50px Comic Sans MS ; } </style>',
                '<defs>',
                '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradBackground" gradientTransform="rotate(90)">',
                '<stop offset="0%" stop-color="hsl(204, 80%, 84%)"/>',
                '<stop offset="50%" stop-color="hsl(204, 80%, 75%)"/>',
                '<stop offset="100%" stop-color="hsl(204, 80%, 60%)"/>',
                '</linearGradient>',
                '</defs>'
            ) 
      );
    }

    function Fish2StringPart4() public pure returns (bytes memory) {
    return bytes(
            abi.encodePacked(
                '<defs>',
                '<radialGradient cx="0.15" cy="0.15" r="0.95" id="gradBubble">',
                '<stop offset="0%" stop-color="hsl(200, 77%, 100%)"/>',
                '<stop offset="50%" stop-color="hsl(200, 77%, 80%)"/>',
                '<stop offset="100%" stop-color="hsl(200, 77%, 60%)"/>',
                '</radialGradient>',
                '</defs>',
                '<rect width="1380" height="1380" fill="url(#gradBackground)"/>'
                '<circle cx="690" cy="690" r="570" stroke="black" stroke-width="7" fill="url(#gradBubble)"/>'
            )
        );
    }
}

File 8 of 18 : DeadFish.sol
// SPDX-License-Identifier: MIT

pragma solidity >=0.8.0 <0.9.0;

library DeadFish {
    function Fish2String() public pure returns (bytes memory) {
    return bytes(
            abi.encodePacked(
                '<svg version="1.0" xmlns="http://www.w3.org/2000/svg" width="1380pt" height="1380pt" viewBox="0 0 1380 1380" preserveAspectRatio="xMidYMid meet">',
                '<style> .small { font:  50px Comic Sans MS ; } </style>',
                '<defs>',
                '<linearGradient cx="0.25" cy="0.25" r="0.75" id="gradBackground" gradientTransform="rotate(90)">',
                '<stop offset="0%" stop-color="hsl(204, 80%, 84%)"/>',
                '<stop offset="50%" stop-color="hsl(204, 80%, 75%)"/>',
                '<stop offset="100%" stop-color="hsl(204, 80%, 60%)"/>',
                '</linearGradient>',
                '</defs>',
                '<rect width="1380" height="1380" fill="url(#gradBackground)"/>'
            ) 
      );
    }
}

File 9 of 18 : ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

File 10 of 18 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

File 11 of 18 : IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 18 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 13 of 18 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

File 14 of 18 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 15 of 18 : Context.sol
// SPDX-License-Identifier: MIT
// 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 16 of 18 : Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

File 17 of 18 : ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 18 of 18 : IERC165.sol
// SPDX-License-Identifier: MIT
// 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);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "libraries": {
    "contracts/AliveFishWithBubble.sol": {
      "AliveFishWithBubble": "0x6955b9915db05d6c42ac183c922c2bef72906673"
    },
    "contracts/DeadFish.sol": {
      "DeadFish": "0xa1ab1d42fc84af0ed1ce6587e7defbc03febee98"
    },
    "contracts/Fish.sol": {
      "Fish": "0x0be66de4fe323cbf7ab851a948e63edff94f95f2"
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"_eaterId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"_eatenId","type":"uint256"}],"name":"Eaten","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"aquas","outputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"fishType","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"fishColor1","type":"string"},{"internalType":"string","name":"fishColor2","type":"string"},{"internalType":"string","name":"fishColor3","type":"string"},{"internalType":"bool","name":"alive","type":"bool"},{"internalType":"uint256","name":"spwanTimestamp","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"bubbleStillOnUntilTimestamp","type":"uint256"},{"internalType":"uint256","name":"deathTimestamp","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buildImage","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"buildMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"calculateDaysAlive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_eaterId","type":"uint256"},{"internalType":"uint256","name":"_eatenId","type":"uint256"}],"name":"eat","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"extendBubble","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"extendBubbleCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getAquaByIndex","outputs":[{"components":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"fishType","type":"string"},{"internalType":"string","name":"description","type":"string"},{"internalType":"string","name":"fishColor1","type":"string"},{"internalType":"string","name":"fishColor2","type":"string"},{"internalType":"string","name":"fishColor3","type":"string"},{"internalType":"bool","name":"alive","type":"bool"},{"internalType":"uint256","name":"spwanTimestamp","type":"uint256"},{"internalType":"uint256","name":"size","type":"uint256"},{"internalType":"uint256","name":"bubbleStillOnUntilTimestamp","type":"uint256"},{"internalType":"uint256","name":"deathTimestamp","type":"uint256"}],"internalType":"struct AquaticWars.Aqua","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"getSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hasBubble","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"isAlive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mod","type":"uint256"},{"internalType":"uint256","name":"_seed","type":"uint256"},{"internalType":"uint256","name":"_salt","type":"uint256"}],"name":"randomNum","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setBubbleCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setMintCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCost","type":"uint256"}],"name":"setSteroidsCost","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":"_tokenId","type":"uint256"}],"name":"takeSteroids","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"takeSteroidsCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"timeAlive","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052670de0b6b3a7640000600c55670de0b6b3a7640000600d55670de0b6b3a7640000600e553480156200003557600080fd5b50604080518082018252600b81526a417175617469635761727360a81b6020808301918252835180850190945260048452634151554160e01b908401528151919291620000859160009162000114565b5080516200009b90600190602084019062000114565b505050620000b8620000b2620000be60201b60201c565b620000c2565b620001f7565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200012290620001ba565b90600052602060002090601f01602090048101928262000146576000855562000191565b82601f106200016157805160ff191683800117855562000191565b8280016001018555821562000191579182015b828111156200019157825182559160200191906001019062000174565b506200019f929150620001a3565b5090565b5b808211156200019f5760008155600101620001a4565b600181811c90821680620001cf57607f821691505b60208210811415620001f157634e487b7160e01b600052602260045260246000fd5b50919050565b615eeb80620002076000396000f3fe60806040526004361061023b5760003560e01c8063704416471161012e578063c3a0a278116100ab578063e985e9c51161006f578063e985e9c514610678578063edf87704146106c1578063ee2dc001146106e1578063f2fde38b14610701578063fcd1a0101461072157600080fd5b8063c3a0a278146105d5578063c6ebc8ea14610602578063c87b56dd14610618578063d24bd15614610638578063d84b23611461065857600080fd5b80638da5cb5b116100f25780638da5cb5b1461054257806395d89b4114610560578063a22cb46514610575578063b88d4fde14610595578063c1b52ee2146105b557600080fd5b806370441647146104ba57806370a08231146104cd578063715018a6146104ed57806380eb4981146105025780638545f4ea1461052257600080fd5b806314a55fb4116101bc5780632f745c59116101805780632f745c59146104325780633ccfd60b1461045257806342842e0e1461045a5780634f6ccce71461047a5780636352211e1461049a57600080fd5b806314a55fb41461038657806318160ddd146103bd57806323b872dd146103d257806328294640146103f25780632ba80eba1461041257600080fd5b8063095ea7b311610203578063095ea7b3146103135780630da534e6146103355780631249c58b1461034857806313faede61461035057806314884cbb1461036657600080fd5b806301ffc9a714610240578063023c23db1461027557806306fdde03146102a357806307d426d3146102c5578063081812fc146102db575b600080fd5b34801561024c57600080fd5b5061026061025b366004614ec8565b610741565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004614f6a565b61076c565b60405190815260200161026c565b3480156102af57600080fd5b506102b8610b64565b60405161026c9190615920565b3480156102d157600080fd5b50610295600e5481565b3480156102e757600080fd5b506102fb6102f6366004614f6a565b610bf6565b6040516001600160a01b03909116815260200161026c565b34801561031f57600080fd5b5061033361032e366004614e9f565b610c7e565b005b610333610343366004614f6a565b610d94565b610333610e8a565b34801561035c57600080fd5b50610295600c5481565b34801561037257600080fd5b50610260610381366004614f6a565b611121565b34801561039257600080fd5b506103a66103a1366004614f6a565b611522565b60405161026c9b9a99989796959493929190615933565b3480156103c957600080fd5b50600854610295565b3480156103de57600080fd5b506103336103ed366004614d87565b6118a9565b3480156103fe57600080fd5b5061029561040d366004614fa3565b6118da565b34801561041e57600080fd5b506102b861042d366004614f6a565b61197c565b34801561043e57600080fd5b5061029561044d366004614e9f565b6122b2565b610333612348565b34801561046657600080fd5b50610333610475366004614d87565b6123e6565b34801561048657600080fd5b50610295610495366004614f6a565b612401565b3480156104a657600080fd5b506102fb6104b5366004614f6a565b6124a2565b6103336104c8366004614f6a565b612519565b3480156104d957600080fd5b506102956104e8366004614d3b565b612617565b3480156104f957600080fd5b5061033361269e565b34801561050e57600080fd5b5061033361051d366004614f6a565b6126d4565b34801561052e57600080fd5b5061033361053d366004614f6a565b612703565b34801561054e57600080fd5b50600a546001600160a01b03166102fb565b34801561056c57600080fd5b506102b8612732565b34801561058157600080fd5b50610333610590366004614e65565b612741565b3480156105a157600080fd5b506103336105b0366004614dc2565b61274c565b3480156105c157600080fd5b506103336105d0366004614f82565b612784565b3480156105e157600080fd5b506105f56105f0366004614f6a565b612a24565b60405161026c9190615b59565b34801561060e57600080fd5b50610295600d5481565b34801561062457600080fd5b506102b8610633366004614f6a565b612e6b565b34801561064457600080fd5b50610295610653366004614f6a565b612ee3565b34801561066457600080fd5b50610260610673366004614f6a565b6132df565b34801561068457600080fd5b50610260610693366004614d55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cd57600080fd5b506102b86106dc366004614f6a565b6136cd565b3480156106ed57600080fd5b506102956106fc366004614f6a565b613ae7565b34801561070d57600080fd5b5061033361071c366004614d3b565b613ef6565b34801561072d57600080fd5b5061033361073c366004614f6a565b613f8e565b60006001600160e01b0319821663780e9d6360e01b1480610766575061076682613fbd565b92915050565b60006107778261400d565b61079c5760405162461bcd60e51b815260040161079390615a36565b60405180910390fd5b6000828152600b6020526040808220815161016081019092528054829082906107c490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090615d82565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050815260200160018201805461085690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461088290615d82565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b505050505081526020016002820180546108e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461091490615d82565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050815260200160038201805461097a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690615d82565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b50505050508152602001600482018054610a0c90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3890615d82565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b50505050508152602001600582018054610a9e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610aca90615d82565b8015610b175780601f10610aec57610100808354040283529160200191610b17565b820191906000526020600020905b815481529060010190602001808311610afa57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261010001519392505050565b606060008054610b7390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f90615d82565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b5050505050905090565b6000610c018261400d565b610c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b506000908152600460205260409020546001600160a01b031690565b6000610c89826124a2565b9050806001600160a01b0316836001600160a01b03161415610cf75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610793565b336001600160a01b0382161480610d135750610d138133610693565b610d855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610793565b610d8f838361402a565b505050565b610d9d8161400d565b610db95760405162461bcd60e51b815260040161079390615a36565b610dc2816132df565b610dde5760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b03163314610e4257600e54341015610e425760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b60205260409020610e5982611121565b15610e79576009810154610e709062015180615cb5565b60098201555050565b610e704262015180615cb5565b5050565b6000610e9560085490565b90506000604051806101600160405280610eba846001610eb59190615cb5565b614098565b604051602001610eca919061558d565b604051602081830303815290604052815260200160405180604001604052806008815260200167082e2eac28cd2e6d60c31b8152508152602001604051806060016040528060318152602001615e85603191398152602001610f3c610eb5610169610f3644600a615cb5565b876118da565b8152602001610f56610eb56101694261040d886014615cb5565b8152602001610f75610eb5610169610f6f44601e615cb5565b426118da565b8152602001600115158152602001428152602001600181526020014262015180610f9f9190615cb5565b815260200160008152509050610fbd600a546001600160a01b031690565b6001600160a01b0316336001600160a01b031614610fe457600c54341015610fe457600080fd5b80600b6000610ff4856001615cb5565b815260208082019290925260400160002082518051919261101a92849290910190614c86565b5060208281015180516110339260018501920190614c86565b506040820151805161104f916002840191602090910190614c86565b506060820151805161106b916003840191602090910190614c86565b5060808201518051611087916004840191602090910190614c86565b5060a082015180516110a3916005840191602090910190614c86565b5060c082015160068201805460ff191691151591909117905560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101556110fd336110f8846001615cb5565b6141ba565b6103e8600c546103e96111109190615ce1565b61111a9190615ccd565b600c555050565b600061112c8261400d565b6111485760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061117090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615d82565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050815260200160018201805461120290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461122e90615d82565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200160028201805461129490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546112c090615d82565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b5050505050815260200160038201805461132690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461135290615d82565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081526020016004820180546113b890615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546113e490615d82565b80156114315780601f1061140657610100808354040283529160200191611431565b820191906000526020600020905b81548152906001019060200180831161141457829003601f168201915b5050505050815260200160058201805461144a90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461147690615d82565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261012081015190915060009061151a9042615d00565b129392505050565b600b6020526000908152604090208054819061153d90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461156990615d82565b80156115b65780601f1061158b576101008083540402835291602001916115b6565b820191906000526020600020905b81548152906001019060200180831161159957829003601f168201915b5050505050908060010180546115cb90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790615d82565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b50505050509080600201805461165990615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461168590615d82565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050908060030180546116e790615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461171390615d82565b80156117605780601f1061173557610100808354040283529160200191611760565b820191906000526020600020905b81548152906001019060200180831161174357829003601f168201915b50505050509080600401805461177590615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546117a190615d82565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509080600501805461180390615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90615d82565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b5050506006840154600785015460088601546009870154600a90970154959660ff9093169591945092508b565b6118b333826141d4565b6118cf5760405162461bcd60e51b815260040161079390615b08565b610d8f8383836142ba565b604080514260208083018290523360601b6bffffffffffffffffffffffff19168385018190526054840187905260748085018790528551808603909101815260948501865280519083012060b485019390935260d484015260e883018690526101088301859052610128808401839052845180850390910181526101489093019093528151919092012060009190611973908690615dd8565b95945050505050565b60606000600b6000848152602001908152602001600020604051806101600160405290816000820180546119af90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546119db90615d82565b8015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b50505050508152602001600182018054611a4190615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d90615d82565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b50505050508152602001600282018054611ad390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611aff90615d82565b8015611b4c5780601f10611b2157610100808354040283529160200191611b4c565b820191906000526020600020905b815481529060010190602001808311611b2f57829003601f168201915b50505050508152602001600382018054611b6590615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9190615d82565b8015611bde5780601f10611bb357610100808354040283529160200191611bde565b820191906000526020600020905b815481529060010190602001808311611bc157829003601f168201915b50505050508152602001600482018054611bf790615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390615d82565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050508152602001600582018054611c8990615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590615d82565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015290506000611d5084613ae7565b90506000611d5d8561076c565b90506000611d6d826112c0615d3f565b90506000611d7c836002615ce1565b611d8890612ae4615d3f565b90506000611d9e6101694461040d8b6064615cb5565b60c0870151909150611e9557600073a1ab1d42fc84af0ed1ce6587e7defbc03febee9863807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b158015611df057600080fd5b505af4158015611e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2c9190810190614f00565b90506000611e398a614098565b604051602001611e499190615455565b60405160208183030381529060405290506000611e868383604051602001611e729291906150cf565b604051602081830303815290604052614465565b9b9a5050505050505050505050565b6000736955b9915db05d6c42ac183c922c2bef7290667363e695d1506040518163ffffffff1660e01b815260040160006040518083038186803b158015611edb57600080fd5b505af4158015611eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f179190810190614f00565b90506000876060015188608001518960a00151604051602001611f3c93929190615608565b60405160208183030381529060405290506000611f5884614098565b611f66610eb5866046615cb5565b611f74610eb58760c8615cb5565b604051602001611f869392919061574f565b6040516020818303038152906040529050611fa08b611121565b15612171576000736955b9915db05d6c42ac183c922c2bef729066736389788cfa6040518163ffffffff1660e01b815260040160006040518083038186803b158015611feb57600080fd5b505af4158015611fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120279190810190614f00565b9050600061203488614098565b61203d89614098565b61204689614098565b61204f8a614098565b6040516020016120629493929190615844565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120f59190810190614f00565b905060006121028f614098565b61210b8d614098565b6121148d614098565b604051602001612126939291906152d6565b6040516020818303038152906040529050600061215988888888888888604051602001611e72979695949392919061517d565b9050809e505050505050505050505050505050919050565b600061217c87614098565b61218588614098565b61218e88614098565b61219789614098565b6040516020016121aa9493929190615499565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b15801561220157600080fd5b505af4158015612215573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223d9190810190614f00565b9050600061224a8e614098565b6122538c614098565b61225c8c614098565b60405160200161226e939291906153d6565b6040516020818303038152906040529050600061229f878787878787604051602001611e72969594939291906150fe565b9f9e505050505050505050505050505050565b60006122bd83612617565b821061231f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610793565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146123725760405162461bcd60e51b815260040161079390615ad3565b6000612386600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b50509050806123e357600080fd5b50565b610d8f8383836040518060200160405280600081525061274c565b600061240c60085490565b821061246f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610793565b6008828154811061249057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610793565b6125228161400d565b61253e5760405162461bcd60e51b815260040161079390615a36565b612547816132df565b6125635760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b031633146125c757600e543410156125c75760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b6020526040902060088101546125e5906001615cb5565b6008820181905560408051808201909152600b81526a030b8bab09739b4bd329d160ad1b6020820152610e86916145db565b60006001600160a01b0382166126825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610793565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146126c85760405162461bcd60e51b815260040161079390615ad3565b6126d26000614620565b565b600a546001600160a01b031633146126fe5760405162461bcd60e51b815260040161079390615ad3565b600e55565b600a546001600160a01b0316331461272d5760405162461bcd60e51b815260040161079390615ad3565b600c55565b606060018054610b7390615d82565b610e86338383614672565b61275633836141d4565b6127725760405162461bcd60e51b815260040161079390615b08565b61277e84848484614741565b50505050565b61278d8261400d565b6127a95760405162461bcd60e51b815260040161079390615a36565b6127b28161400d565b6127ce5760405162461bcd60e51b815260040161079390615a36565b336127d8836124a2565b6001600160a01b0316146128405760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e65722773206f6620746865206560448201526861746572204171756160b81b6064820152608401610793565b612849816132df565b6128655760405162461bcd60e51b8152600401610793906159ff565b61286e826132df565b6128ba5760405162461bcd60e51b815260206004820152601f60248201527f45617465722049642068617320616c7265616479206265656e20656174656e006044820152606401610793565b6000828152600b6020526040808220838352912060088082015490830154116129365760405162461bcd60e51b815260206004820152602860248201527f4561746572206973206e6f742062696720656e6f75676820746f2065617420746044820152670d0d2e640ccd2e6d60c31b6064820152608401610793565b61293f83611121565b156129a05760405162461bcd60e51b815260206004820152602b60248201527f596f752063616e2774206561742066697368207769746820612070726f74656360448201526a7469766520627562626c6560a81b6064820152608401610793565b6129a98361076c565b6129b28561076c565b1180156129c557506129c383611121565b155b1561277e5760068101805460ff1916905560088201546129e6906001615cb5565b600883015542600a820155604051849084907f8d200ab8996878eb7c4e6051f07ecaf41372be7348232c623b3c58e80d2e83e490600090a350505050565b612a83604051806101600160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081525090565b612a8c8261400d565b612aa85760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612ad090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612afc90615d82565b8015612b495780601f10612b1e57610100808354040283529160200191612b49565b820191906000526020600020905b815481529060010190602001808311612b2c57829003601f168201915b50505050508152602001600182018054612b6290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8e90615d82565b8015612bdb5780601f10612bb057610100808354040283529160200191612bdb565b820191906000526020600020905b815481529060010190602001808311612bbe57829003601f168201915b50505050508152602001600282018054612bf490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2090615d82565b8015612c6d5780601f10612c4257610100808354040283529160200191612c6d565b820191906000526020600020905b815481529060010190602001808311612c5057829003601f168201915b50505050508152602001600382018054612c8690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb290615d82565b8015612cff5780601f10612cd457610100808354040283529160200191612cff565b820191906000526020600020905b815481529060010190602001808311612ce257829003601f168201915b50505050508152602001600482018054612d1890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4490615d82565b8015612d915780601f10612d6657610100808354040283529160200191612d91565b820191906000526020600020905b815481529060010190602001808311612d7457829003601f168201915b50505050508152602001600582018054612daa90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd690615d82565b8015612e235780601f10612df857610100808354040283529160200191612e23565b820191906000526020600020905b815481529060010190602001808311612e0657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a0909101529392505050565b6060612e768261400d565b612eda5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610793565b610766826136cd565b6000612eee8261400d565b612f0a5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612f3290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5e90615d82565b8015612fab5780601f10612f8057610100808354040283529160200191612fab565b820191906000526020600020905b815481529060010190602001808311612f8e57829003601f168201915b50505050508152602001600182018054612fc490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615d82565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050815260200160028201805461305690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461308290615d82565b80156130cf5780601f106130a4576101008083540402835291602001916130cf565b820191906000526020600020905b8154815290600101906020018083116130b257829003601f168201915b505050505081526020016003820180546130e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461311490615d82565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050815260200160048201805461317a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546131a690615d82565b80156131f35780601f106131c8576101008083540402835291602001916131f3565b820191906000526020600020905b8154815290600101906020018083116131d657829003601f168201915b5050505050815260200160058201805461320c90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461323890615d82565b80156132855780601f1061325a57610100808354040283529160200191613285565b820191906000526020600020905b81548152906001019060200180831161326857829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506132d89042615d3f565b9392505050565b60006132ea8261400d565b6133065760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061332e90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461335a90615d82565b80156133a75780601f1061337c576101008083540402835291602001916133a7565b820191906000526020600020905b81548152906001019060200180831161338a57829003601f168201915b505050505081526020016001820180546133c090615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546133ec90615d82565b80156134395780601f1061340e57610100808354040283529160200191613439565b820191906000526020600020905b81548152906001019060200180831161341c57829003601f168201915b5050505050815260200160028201805461345290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461347e90615d82565b80156134cb5780601f106134a0576101008083540402835291602001916134cb565b820191906000526020600020905b8154815290600101906020018083116134ae57829003601f168201915b505050505081526020016003820180546134e490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461351090615d82565b801561355d5780601f106135325761010080835404028352916020019161355d565b820191906000526020600020905b81548152906001019060200180831161354057829003601f168201915b5050505050815260200160048201805461357690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546135a290615d82565b80156135ef5780601f106135c4576101008083540402835291602001916135ef565b820191906000526020600020905b8154815290600101906020018083116135d257829003601f168201915b5050505050815260200160058201805461360890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461363490615d82565b80156136815780601f1061365657610100808354040283529160200191613681565b820191906000526020600020905b81548152906001019060200180831161366457829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260c001519392505050565b60606000600b60008481526020019081526020016000206040518061016001604052908160008201805461370090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461372c90615d82565b80156137795780601f1061374e57610100808354040283529160200191613779565b820191906000526020600020905b81548152906001019060200180831161375c57829003601f168201915b5050505050815260200160018201805461379290615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546137be90615d82565b801561380b5780601f106137e05761010080835404028352916020019161380b565b820191906000526020600020905b8154815290600101906020018083116137ee57829003601f168201915b5050505050815260200160028201805461382490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461385090615d82565b801561389d5780601f106138725761010080835404028352916020019161389d565b820191906000526020600020905b81548152906001019060200180831161388057829003601f168201915b505050505081526020016003820180546138b690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546138e290615d82565b801561392f5780601f106139045761010080835404028352916020019161392f565b820191906000526020600020905b81548152906001019060200180831161391257829003601f168201915b5050505050815260200160048201805461394890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461397490615d82565b80156139c15780601f10613996576101008083540402835291602001916139c1565b820191906000526020600020905b8154815290600101906020018083116139a457829003601f168201915b505050505081526020016005820180546139da90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0690615d82565b8015613a535780601f10613a2857610100808354040283529160200191613a53565b820191906000526020600020905b815481529060010190602001808311613a3657829003601f168201915b5050509183525050600682015460ff161515602082015260078201546040808301919091526008830154606083015260098301546080830152600a9092015460a090910152815190820151919250613ac091613aae8661197c565b604051602001611e729392919061520f565b604051602001613ad091906155c3565b604051602081830303815290604052915050919050565b6000613af28261400d565b613b0e5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290613b3690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613b6290615d82565b8015613baf5780601f10613b8457610100808354040283529160200191613baf565b820191906000526020600020905b815481529060010190602001808311613b9257829003601f168201915b50505050508152602001600182018054613bc890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613bf490615d82565b8015613c415780601f10613c1657610100808354040283529160200191613c41565b820191906000526020600020905b815481529060010190602001808311613c2457829003601f168201915b50505050508152602001600282018054613c5a90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8690615d82565b8015613cd35780601f10613ca857610100808354040283529160200191613cd3565b820191906000526020600020905b815481529060010190602001808311613cb657829003601f168201915b50505050508152602001600382018054613cec90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613d1890615d82565b8015613d655780601f10613d3a57610100808354040283529160200191613d65565b820191906000526020600020905b815481529060010190602001808311613d4857829003601f168201915b50505050508152602001600482018054613d7e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613daa90615d82565b8015613df75780601f10613dcc57610100808354040283529160200191613df7565b820191906000526020600020905b815481529060010190602001808311613dda57829003601f168201915b50505050508152602001600582018054613e1090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613e3c90615d82565b8015613e895780601f10613e5e57610100808354040283529160200191613e89565b820191906000526020600020905b815481529060010190602001808311613e6c57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506201518090613ee19042615d3f565b613eeb9190615ccd565b6132d8906001615cb5565b600a546001600160a01b03163314613f205760405162461bcd60e51b815260040161079390615ad3565b6001600160a01b038116613f855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b6123e381614620565b600a546001600160a01b03163314613fb85760405162461bcd60e51b815260040161079390615ad3565b600d55565b60006001600160e01b031982166380ac58cd60e01b1480613fee57506001600160e01b03198216635b5e139f60e01b145b8061076657506301ffc9a760e01b6001600160e01b0319831614610766565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061405f826124a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816140bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e657806140d081615dbd565b91506140df9050600a83615ccd565b91506140c0565b60008167ffffffffffffffff81111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156141b25761414e600183615d3f565b915061415b600a86615dd8565b614166906030615cb5565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615ccd565b945061413d565b949350505050565b610e86828260405180602001604052806000815250614774565b60006141df8261400d565b6142405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b600061424b836124a2565b9050806001600160a01b0316846001600160a01b031614806142865750836001600160a01b031661427b84610bf6565b6001600160a01b0316145b806141b257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166141b2565b826001600160a01b03166142cd826124a2565b6001600160a01b0316146143355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610793565b6001600160a01b0382166143975760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6143a28383836147a7565b6143ad60008261402a565b6001600160a01b03831660009081526003602052604081208054600192906143d6908490615d3f565b90915550506001600160a01b0382166000908152600360205260408120805460019290614404908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081516000141561448557505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e4560409139905060006003845160026144b49190615cb5565b6144be9190615ccd565b6144c9906004615ce1565b905060006144d8826020615cb5565b67ffffffffffffffff8111156144fe57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614528576020820181803683370190505b509050818152600183018586518101602084015b818310156145965760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161453c565b6003895106600181146145b057600281146145c1576145cd565b613d3d60f01b6001198301526145cd565b603d60f81b6000198301525b509398975050505050505050565b610e8682826040516024016145f19291906159dd565b60408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905261485f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156146d45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610793565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61474c8484846142ba565b61475884848484614880565b61277e5760405162461bcd60e51b815260040161079390615a81565b61477e838361498d565b61478b6000848484614880565b610d8f5760405162461bcd60e51b815260040161079390615a81565b6001600160a01b038316614802576147fd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614825565b816001600160a01b0316836001600160a01b031614614825576148258382614acc565b6001600160a01b03821661483c57610d8f81614b69565b826001600160a01b0316826001600160a01b031614610d8f57610d8f8282614c42565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60006001600160a01b0384163b1561498257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906148c49033908990889088906004016158ed565b602060405180830381600087803b1580156148de57600080fd5b505af192505050801561490e575060408051601f3d908101601f1916820190925261490b91810190614ee4565b60015b614968573d80801561493c576040519150601f19603f3d011682016040523d82523d6000602084013e614941565b606091505b5080516149605760405162461bcd60e51b815260040161079390615a81565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506141b2565b506001949350505050565b6001600160a01b0382166149e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610793565b6149ec8161400d565b15614a395760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610793565b614a45600083836147a7565b6001600160a01b0382166000908152600360205260408120805460019290614a6e908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614ad984612617565b614ae39190615d3f565b600083815260076020526040902054909150808214614b36576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b7b90600190615d3f565b60008381526009602052604081205460088054939450909284908110614bb157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110614be057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614c2657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614c4d83612617565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054614c9290615d82565b90600052602060002090601f016020900481019282614cb45760008555614cfa565b82601f10614ccd57805160ff1916838001178555614cfa565b82800160010185558215614cfa579182015b82811115614cfa578251825591602001919060010190614cdf565b50614d06929150614d0a565b5090565b5b80821115614d065760008155600101614d0b565b80356001600160a01b0381168114614d3657600080fd5b919050565b600060208284031215614d4c578081fd5b6132d882614d1f565b60008060408385031215614d67578081fd5b614d7083614d1f565b9150614d7e60208401614d1f565b90509250929050565b600080600060608486031215614d9b578081fd5b614da484614d1f565b9250614db260208501614d1f565b9150604084013590509250925092565b60008060008060808587031215614dd7578081fd5b614de085614d1f565b9350614dee60208601614d1f565b925060408501359150606085013567ffffffffffffffff811115614e10578182fd5b8501601f81018713614e20578182fd5b8035614e33614e2e82615c8d565b615c5c565b818152886020838501011115614e47578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614e77578182fd5b614e8083614d1f565b915060208301358015158114614e94578182fd5b809150509250929050565b60008060408385031215614eb1578182fd5b614eba83614d1f565b946020939093013593505050565b600060208284031215614ed9578081fd5b81356132d881615e2e565b600060208284031215614ef5578081fd5b81516132d881615e2e565b600060208284031215614f11578081fd5b815167ffffffffffffffff811115614f27578182fd5b8201601f81018413614f37578182fd5b8051614f45614e2e82615c8d565b818152856020838501011115614f59578384fd5b611973826020830160208601615d56565b600060208284031215614f7b578081fd5b5035919050565b60008060408385031215614f94578182fd5b50508035926020909101359150565b600080600060608486031215614fb7578283fd5b505081359360208301359350604090920135919050565b60008151808452614fe6816020860160208601615d56565b601f01601f19169290920160200192915050565b7f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22688152620e6d8560eb1b602082015260230190565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152630d0e6d8560e31b602082015260240190565b7f3c7465787420783d2233352220793d2238302220636c6173733d22736d616c6c8152630111f11960e51b602082015260240190565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2268738152610d8560f31b602082015260220190565b600083516150e1818460208801615d56565b8351908301906150f5818360208801615d56565b01949350505050565b6000875160206151118285838d01615d56565b8851918401916151248184848d01615d56565b88519201916151368184848c01615d56565b87519201916151488184848b01615d56565b865192019161515a8184848a01615d56565b855192019161516c8184848901615d56565b919091019998505050505050505050565b6000885160206151908285838e01615d56565b8951918401916151a38184848e01615d56565b89519201916151b58184848d01615d56565b88519201916151c78184848c01615d56565b87519201916151d98184848b01615d56565b86519201916151eb8184848a01615d56565b85519201916151fd8184848901615d56565b919091019a9950505050505050505050565b683d913730b6b2911d1160b91b81528351600090615234816009850160208901615d56565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161526681601b840160208901615d56565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516152ba816042840160208801615d56565b61227d60f01b6042929091019182015260440195945050505050565b60006152e182615065565b85516152f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223533302220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b603692019182018190526153a2603d83017f3c7465787420783d2233352220793d22313333302220636c6173733d22736d6181526903636111f29b4bd329d160b51b6020820152602a0190565b915084516153b4818460208901615d56565b91909101908152651e17b9bb339f60d11b6007820152600d0195945050505050565b60006153e182615065565b85516153f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223436352220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b600061546082615065565b8351615470818360208801615d56565b661e17ba32bc3a1f60c91b9101908152651e17b9bb339f60d11b6007820152600d019392505050565b7f3c726563742077696474683d223133383022206865696768743d22313338302281527f2066696c6c3d2275726c2823677261644261636b67726f756e6429222f3e000060208201526e3c7376672076696577426f783d222d60881b603e8201526000855161550f81604d850160208a01615d56565b61202d60f01b604d91840191820152855161553181604f840160208a01615d56565b808201915050600160fd1b80604f8301528551615555816050850160208a01615d56565b60509201918201528351615570816051840160208801615d56565b61111f60f11b605192909101918201526053019695505050505050565b6d417175617469632057617273202360901b8152600082516155b681600e850160208701615d56565b91909101600e0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516155fb81601d850160208701615d56565b91909101601d0192915050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d2267726164466973682220677261646960268201527f656e745472616e73666f726d3d22726f7461746528393029223e000000000000604682015260006156946060830161509b565b85516156a4818360208a01615d56565b6d16101c981296101a18129491179f60911b91019081526156c7600e8201614ffa565b905084516156d9818360208901615d56565b6d16101c98129610199b929491179f60911b9101818152906156fd600e830161502f565b9150845161570f818460208901615d56565b91909101908152701e17b634b732b0b923b930b234b2b73a1f60791b600e820152661e17b232b3399f60c91b601f820152602681015b9695505050505050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d22677261644669736846696e2220677260268201527f616469656e745472616e73666f726d3d22726f7461746528393029223e000000604682015260006157db6063830161509b565b85516157eb818360208a01615d56565b6d16101c181296101a18129491179f60911b910190815261580e600e8201614ffa565b90508451615820818360208901615d56565b6d16101c18129610199b929491179f60911b9101818152906156fd600e830161502f565b6e3c7376672076696577426f783d222d60881b8152845160009061586f81600f850160208a01615d56565b61202d60f01b600f918401918201528551615891816011840160208a01615d56565b808201915050600160fd1b80601183015285516158b5816012850160208a01615d56565b601292019182015283516158d0816013840160208801615d56565b61111f60f11b601392909101918201526015019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061574590830184614fce565b6020815260006132d86020830184614fce565b60006101608083526159478184018f614fce565b9050828103602084015261595b818e614fce565b9050828103604084015261596f818d614fce565b90508281036060840152615983818c614fce565b90508281036080840152615997818b614fce565b905082810360a08401526159ab818a614fce565b97151560c0840152505060e0810194909452610100840192909252610120830152610140909101529695505050505050565b6040815260006159f06040830185614fce565b90508260208301529392505050565b6020808252601f908201527f456174656e2049642068617320616c7265616479206265656e20656174656e00604082015260600190565b6020808252602b908201527f4552433732314d657461646174613a20517565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251610160806020850152615b78610180850183614fce565b91506020850151601f1980868503016040870152615b968483614fce565b93506040870151915080868503016060870152615bb38483614fce565b93506060870151915080868503016080870152615bd08483614fce565b935060808701519150808685030160a0870152615bed8483614fce565b935060a08701519150808685030160c087015250615c0b8382614fce565b92505060c0850151615c2160e086018215159052565b5060e0850151610100858101919091528501516101208086019190915285015161014080860191909152909401519390920192909252919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615c8557615c85615e18565b604052919050565b600067ffffffffffffffff821115615ca757615ca7615e18565b50601f01601f191660200190565b60008219821115615cc857615cc8615dec565b500190565b600082615cdc57615cdc615e02565b500490565b6000816000190483118215151615615cfb57615cfb615dec565b500290565b60008083128015600160ff1b850184121615615d1e57615d1e615dec565b6001600160ff1b0384018313811615615d3957615d39615dec565b50500390565b600082821015615d5157615d51615dec565b500390565b60005b83811015615d71578181015183820152602001615d59565b8381111561277e5750506000910152565b600181811c90821680615d9657607f821691505b60208210811415615db757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615dd157615dd1615dec565b5060010190565b600082615de757615de7615e02565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146123e357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4171756174696320576172732069732031303025206f6e2d636861696e2c2064796e616d69632c204e46542067616d652ea264697066735822122096d3491e38ada46f7241314df1a374e18f87786388209de074fd0c30d85ca35364736f6c63430008040033

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063704416471161012e578063c3a0a278116100ab578063e985e9c51161006f578063e985e9c514610678578063edf87704146106c1578063ee2dc001146106e1578063f2fde38b14610701578063fcd1a0101461072157600080fd5b8063c3a0a278146105d5578063c6ebc8ea14610602578063c87b56dd14610618578063d24bd15614610638578063d84b23611461065857600080fd5b80638da5cb5b116100f25780638da5cb5b1461054257806395d89b4114610560578063a22cb46514610575578063b88d4fde14610595578063c1b52ee2146105b557600080fd5b806370441647146104ba57806370a08231146104cd578063715018a6146104ed57806380eb4981146105025780638545f4ea1461052257600080fd5b806314a55fb4116101bc5780632f745c59116101805780632f745c59146104325780633ccfd60b1461045257806342842e0e1461045a5780634f6ccce71461047a5780636352211e1461049a57600080fd5b806314a55fb41461038657806318160ddd146103bd57806323b872dd146103d257806328294640146103f25780632ba80eba1461041257600080fd5b8063095ea7b311610203578063095ea7b3146103135780630da534e6146103355780631249c58b1461034857806313faede61461035057806314884cbb1461036657600080fd5b806301ffc9a714610240578063023c23db1461027557806306fdde03146102a357806307d426d3146102c5578063081812fc146102db575b600080fd5b34801561024c57600080fd5b5061026061025b366004614ec8565b610741565b60405190151581526020015b60405180910390f35b34801561028157600080fd5b50610295610290366004614f6a565b61076c565b60405190815260200161026c565b3480156102af57600080fd5b506102b8610b64565b60405161026c9190615920565b3480156102d157600080fd5b50610295600e5481565b3480156102e757600080fd5b506102fb6102f6366004614f6a565b610bf6565b6040516001600160a01b03909116815260200161026c565b34801561031f57600080fd5b5061033361032e366004614e9f565b610c7e565b005b610333610343366004614f6a565b610d94565b610333610e8a565b34801561035c57600080fd5b50610295600c5481565b34801561037257600080fd5b50610260610381366004614f6a565b611121565b34801561039257600080fd5b506103a66103a1366004614f6a565b611522565b60405161026c9b9a99989796959493929190615933565b3480156103c957600080fd5b50600854610295565b3480156103de57600080fd5b506103336103ed366004614d87565b6118a9565b3480156103fe57600080fd5b5061029561040d366004614fa3565b6118da565b34801561041e57600080fd5b506102b861042d366004614f6a565b61197c565b34801561043e57600080fd5b5061029561044d366004614e9f565b6122b2565b610333612348565b34801561046657600080fd5b50610333610475366004614d87565b6123e6565b34801561048657600080fd5b50610295610495366004614f6a565b612401565b3480156104a657600080fd5b506102fb6104b5366004614f6a565b6124a2565b6103336104c8366004614f6a565b612519565b3480156104d957600080fd5b506102956104e8366004614d3b565b612617565b3480156104f957600080fd5b5061033361269e565b34801561050e57600080fd5b5061033361051d366004614f6a565b6126d4565b34801561052e57600080fd5b5061033361053d366004614f6a565b612703565b34801561054e57600080fd5b50600a546001600160a01b03166102fb565b34801561056c57600080fd5b506102b8612732565b34801561058157600080fd5b50610333610590366004614e65565b612741565b3480156105a157600080fd5b506103336105b0366004614dc2565b61274c565b3480156105c157600080fd5b506103336105d0366004614f82565b612784565b3480156105e157600080fd5b506105f56105f0366004614f6a565b612a24565b60405161026c9190615b59565b34801561060e57600080fd5b50610295600d5481565b34801561062457600080fd5b506102b8610633366004614f6a565b612e6b565b34801561064457600080fd5b50610295610653366004614f6a565b612ee3565b34801561066457600080fd5b50610260610673366004614f6a565b6132df565b34801561068457600080fd5b50610260610693366004614d55565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156106cd57600080fd5b506102b86106dc366004614f6a565b6136cd565b3480156106ed57600080fd5b506102956106fc366004614f6a565b613ae7565b34801561070d57600080fd5b5061033361071c366004614d3b565b613ef6565b34801561072d57600080fd5b5061033361073c366004614f6a565b613f8e565b60006001600160e01b0319821663780e9d6360e01b1480610766575061076682613fbd565b92915050565b60006107778261400d565b61079c5760405162461bcd60e51b815260040161079390615a36565b60405180910390fd5b6000828152600b6020526040808220815161016081019092528054829082906107c490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546107f090615d82565b801561083d5780601f106108125761010080835404028352916020019161083d565b820191906000526020600020905b81548152906001019060200180831161082057829003601f168201915b5050505050815260200160018201805461085690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461088290615d82565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b505050505081526020016002820180546108e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461091490615d82565b80156109615780601f1061093657610100808354040283529160200191610961565b820191906000526020600020905b81548152906001019060200180831161094457829003601f168201915b5050505050815260200160038201805461097a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546109a690615d82565b80156109f35780601f106109c8576101008083540402835291602001916109f3565b820191906000526020600020905b8154815290600101906020018083116109d657829003601f168201915b50505050508152602001600482018054610a0c90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610a3890615d82565b8015610a855780601f10610a5a57610100808354040283529160200191610a85565b820191906000526020600020905b815481529060010190602001808311610a6857829003601f168201915b50505050508152602001600582018054610a9e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610aca90615d82565b8015610b175780601f10610aec57610100808354040283529160200191610b17565b820191906000526020600020905b815481529060010190602001808311610afa57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261010001519392505050565b606060008054610b7390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054610b9f90615d82565b8015610bec5780601f10610bc157610100808354040283529160200191610bec565b820191906000526020600020905b815481529060010190602001808311610bcf57829003601f168201915b5050505050905090565b6000610c018261400d565b610c625760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b506000908152600460205260409020546001600160a01b031690565b6000610c89826124a2565b9050806001600160a01b0316836001600160a01b03161415610cf75760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610793565b336001600160a01b0382161480610d135750610d138133610693565b610d855760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610793565b610d8f838361402a565b505050565b610d9d8161400d565b610db95760405162461bcd60e51b815260040161079390615a36565b610dc2816132df565b610dde5760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b03163314610e4257600e54341015610e425760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b60205260409020610e5982611121565b15610e79576009810154610e709062015180615cb5565b60098201555050565b610e704262015180615cb5565b5050565b6000610e9560085490565b90506000604051806101600160405280610eba846001610eb59190615cb5565b614098565b604051602001610eca919061558d565b604051602081830303815290604052815260200160405180604001604052806008815260200167082e2eac28cd2e6d60c31b8152508152602001604051806060016040528060318152602001615e85603191398152602001610f3c610eb5610169610f3644600a615cb5565b876118da565b8152602001610f56610eb56101694261040d886014615cb5565b8152602001610f75610eb5610169610f6f44601e615cb5565b426118da565b8152602001600115158152602001428152602001600181526020014262015180610f9f9190615cb5565b815260200160008152509050610fbd600a546001600160a01b031690565b6001600160a01b0316336001600160a01b031614610fe457600c54341015610fe457600080fd5b80600b6000610ff4856001615cb5565b815260208082019290925260400160002082518051919261101a92849290910190614c86565b5060208281015180516110339260018501920190614c86565b506040820151805161104f916002840191602090910190614c86565b506060820151805161106b916003840191602090910190614c86565b5060808201518051611087916004840191602090910190614c86565b5060a082015180516110a3916005840191602090910190614c86565b5060c082015160068201805460ff191691151591909117905560e082015160078201556101008201516008820155610120820151600982015561014090910151600a909101556110fd336110f8846001615cb5565b6141ba565b6103e8600c546103e96111109190615ce1565b61111a9190615ccd565b600c555050565b600061112c8261400d565b6111485760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061117090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461119c90615d82565b80156111e95780601f106111be576101008083540402835291602001916111e9565b820191906000526020600020905b8154815290600101906020018083116111cc57829003601f168201915b5050505050815260200160018201805461120290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461122e90615d82565b801561127b5780601f106112505761010080835404028352916020019161127b565b820191906000526020600020905b81548152906001019060200180831161125e57829003601f168201915b5050505050815260200160028201805461129490615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546112c090615d82565b801561130d5780601f106112e25761010080835404028352916020019161130d565b820191906000526020600020905b8154815290600101906020018083116112f057829003601f168201915b5050505050815260200160038201805461132690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461135290615d82565b801561139f5780601f106113745761010080835404028352916020019161139f565b820191906000526020600020905b81548152906001019060200180831161138257829003601f168201915b505050505081526020016004820180546113b890615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546113e490615d82565b80156114315780601f1061140657610100808354040283529160200191611431565b820191906000526020600020905b81548152906001019060200180831161141457829003601f168201915b5050505050815260200160058201805461144a90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461147690615d82565b80156114c35780601f10611498576101008083540402835291602001916114c3565b820191906000526020600020905b8154815290600101906020018083116114a657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015261012081015190915060009061151a9042615d00565b129392505050565b600b6020526000908152604090208054819061153d90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461156990615d82565b80156115b65780601f1061158b576101008083540402835291602001916115b6565b820191906000526020600020905b81548152906001019060200180831161159957829003601f168201915b5050505050908060010180546115cb90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546115f790615d82565b80156116445780601f1061161957610100808354040283529160200191611644565b820191906000526020600020905b81548152906001019060200180831161162757829003601f168201915b50505050509080600201805461165990615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461168590615d82565b80156116d25780601f106116a7576101008083540402835291602001916116d2565b820191906000526020600020905b8154815290600101906020018083116116b557829003601f168201915b5050505050908060030180546116e790615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461171390615d82565b80156117605780601f1061173557610100808354040283529160200191611760565b820191906000526020600020905b81548152906001019060200180831161174357829003601f168201915b50505050509080600401805461177590615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546117a190615d82565b80156117ee5780601f106117c3576101008083540402835291602001916117ee565b820191906000526020600020905b8154815290600101906020018083116117d157829003601f168201915b50505050509080600501805461180390615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461182f90615d82565b801561187c5780601f106118515761010080835404028352916020019161187c565b820191906000526020600020905b81548152906001019060200180831161185f57829003601f168201915b5050506006840154600785015460088601546009870154600a90970154959660ff9093169591945092508b565b6118b333826141d4565b6118cf5760405162461bcd60e51b815260040161079390615b08565b610d8f8383836142ba565b604080514260208083018290523360601b6bffffffffffffffffffffffff19168385018190526054840187905260748085018790528551808603909101815260948501865280519083012060b485019390935260d484015260e883018690526101088301859052610128808401839052845180850390910181526101489093019093528151919092012060009190611973908690615dd8565b95945050505050565b60606000600b6000848152602001908152602001600020604051806101600160405290816000820180546119af90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546119db90615d82565b8015611a285780601f106119fd57610100808354040283529160200191611a28565b820191906000526020600020905b815481529060010190602001808311611a0b57829003601f168201915b50505050508152602001600182018054611a4190615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611a6d90615d82565b8015611aba5780601f10611a8f57610100808354040283529160200191611aba565b820191906000526020600020905b815481529060010190602001808311611a9d57829003601f168201915b50505050508152602001600282018054611ad390615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611aff90615d82565b8015611b4c5780601f10611b2157610100808354040283529160200191611b4c565b820191906000526020600020905b815481529060010190602001808311611b2f57829003601f168201915b50505050508152602001600382018054611b6590615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611b9190615d82565b8015611bde5780601f10611bb357610100808354040283529160200191611bde565b820191906000526020600020905b815481529060010190602001808311611bc157829003601f168201915b50505050508152602001600482018054611bf790615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611c2390615d82565b8015611c705780601f10611c4557610100808354040283529160200191611c70565b820191906000526020600020905b815481529060010190602001808311611c5357829003601f168201915b50505050508152602001600582018054611c8990615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054611cb590615d82565b8015611d025780601f10611cd757610100808354040283529160200191611d02565b820191906000526020600020905b815481529060010190602001808311611ce557829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015290506000611d5084613ae7565b90506000611d5d8561076c565b90506000611d6d826112c0615d3f565b90506000611d7c836002615ce1565b611d8890612ae4615d3f565b90506000611d9e6101694461040d8b6064615cb5565b60c0870151909150611e9557600073a1ab1d42fc84af0ed1ce6587e7defbc03febee9863807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b158015611df057600080fd5b505af4158015611e04573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611e2c9190810190614f00565b90506000611e398a614098565b604051602001611e499190615455565b60405160208183030381529060405290506000611e868383604051602001611e729291906150cf565b604051602081830303815290604052614465565b9b9a5050505050505050505050565b6000736955b9915db05d6c42ac183c922c2bef7290667363e695d1506040518163ffffffff1660e01b815260040160006040518083038186803b158015611edb57600080fd5b505af4158015611eef573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611f179190810190614f00565b90506000876060015188608001518960a00151604051602001611f3c93929190615608565b60405160208183030381529060405290506000611f5884614098565b611f66610eb5866046615cb5565b611f74610eb58760c8615cb5565b604051602001611f869392919061574f565b6040516020818303038152906040529050611fa08b611121565b15612171576000736955b9915db05d6c42ac183c922c2bef729066736389788cfa6040518163ffffffff1660e01b815260040160006040518083038186803b158015611feb57600080fd5b505af4158015611fff573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120279190810190614f00565b9050600061203488614098565b61203d89614098565b61204689614098565b61204f8a614098565b6040516020016120629493929190615844565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b1580156120b957600080fd5b505af41580156120cd573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f191682016040526120f59190810190614f00565b905060006121028f614098565b61210b8d614098565b6121148d614098565b604051602001612126939291906152d6565b6040516020818303038152906040529050600061215988888888888888604051602001611e72979695949392919061517d565b9050809e505050505050505050505050505050919050565b600061217c87614098565b61218588614098565b61218e88614098565b61219789614098565b6040516020016121aa9493929190615499565b60405160208183030381529060405290506000730be66de4fe323cbf7ab851a948e63edff94f95f263807bcfe36040518163ffffffff1660e01b815260040160006040518083038186803b15801561220157600080fd5b505af4158015612215573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261223d9190810190614f00565b9050600061224a8e614098565b6122538c614098565b61225c8c614098565b60405160200161226e939291906153d6565b6040516020818303038152906040529050600061229f878787878787604051602001611e72969594939291906150fe565b9f9e505050505050505050505050505050565b60006122bd83612617565b821061231f5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610793565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600a546001600160a01b031633146123725760405162461bcd60e51b815260040161079390615ad3565b6000612386600a546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d80600081146123d0576040519150601f19603f3d011682016040523d82523d6000602084013e6123d5565b606091505b50509050806123e357600080fd5b50565b610d8f8383836040518060200160405280600081525061274c565b600061240c60085490565b821061246f5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610793565b6008828154811061249057634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806107665760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610793565b6125228161400d565b61253e5760405162461bcd60e51b815260040161079390615a36565b612547816132df565b6125635760405162461bcd60e51b8152600401610793906159ff565b600a546001600160a01b031633146125c757600e543410156125c75760405162461bcd60e51b815260206004820181905260248201527f596f75206e65656420746f2070617920746f2074616b6520737465726f6964736044820152606401610793565b6000818152600b6020526040902060088101546125e5906001615cb5565b6008820181905560408051808201909152600b81526a030b8bab09739b4bd329d160ad1b6020820152610e86916145db565b60006001600160a01b0382166126825760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610793565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b031633146126c85760405162461bcd60e51b815260040161079390615ad3565b6126d26000614620565b565b600a546001600160a01b031633146126fe5760405162461bcd60e51b815260040161079390615ad3565b600e55565b600a546001600160a01b0316331461272d5760405162461bcd60e51b815260040161079390615ad3565b600c55565b606060018054610b7390615d82565b610e86338383614672565b61275633836141d4565b6127725760405162461bcd60e51b815260040161079390615b08565b61277e84848484614741565b50505050565b61278d8261400d565b6127a95760405162461bcd60e51b815260040161079390615a36565b6127b28161400d565b6127ce5760405162461bcd60e51b815260040161079390615a36565b336127d8836124a2565b6001600160a01b0316146128405760405162461bcd60e51b815260206004820152602960248201527f596f7520617265206e6f7420746865206f776e65722773206f6620746865206560448201526861746572204171756160b81b6064820152608401610793565b612849816132df565b6128655760405162461bcd60e51b8152600401610793906159ff565b61286e826132df565b6128ba5760405162461bcd60e51b815260206004820152601f60248201527f45617465722049642068617320616c7265616479206265656e20656174656e006044820152606401610793565b6000828152600b6020526040808220838352912060088082015490830154116129365760405162461bcd60e51b815260206004820152602860248201527f4561746572206973206e6f742062696720656e6f75676820746f2065617420746044820152670d0d2e640ccd2e6d60c31b6064820152608401610793565b61293f83611121565b156129a05760405162461bcd60e51b815260206004820152602b60248201527f596f752063616e2774206561742066697368207769746820612070726f74656360448201526a7469766520627562626c6560a81b6064820152608401610793565b6129a98361076c565b6129b28561076c565b1180156129c557506129c383611121565b155b1561277e5760068101805460ff1916905560088201546129e6906001615cb5565b600883015542600a820155604051849084907f8d200ab8996878eb7c4e6051f07ecaf41372be7348232c623b3c58e80d2e83e490600090a350505050565b612a83604051806101600160405280606081526020016060815260200160608152602001606081526020016060815260200160608152602001600015158152602001600081526020016000815260200160008152602001600081525090565b612a8c8261400d565b612aa85760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612ad090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612afc90615d82565b8015612b495780601f10612b1e57610100808354040283529160200191612b49565b820191906000526020600020905b815481529060010190602001808311612b2c57829003601f168201915b50505050508152602001600182018054612b6290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612b8e90615d82565b8015612bdb5780601f10612bb057610100808354040283529160200191612bdb565b820191906000526020600020905b815481529060010190602001808311612bbe57829003601f168201915b50505050508152602001600282018054612bf490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612c2090615d82565b8015612c6d5780601f10612c4257610100808354040283529160200191612c6d565b820191906000526020600020905b815481529060010190602001808311612c5057829003601f168201915b50505050508152602001600382018054612c8690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612cb290615d82565b8015612cff5780601f10612cd457610100808354040283529160200191612cff565b820191906000526020600020905b815481529060010190602001808311612ce257829003601f168201915b50505050508152602001600482018054612d1890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612d4490615d82565b8015612d915780601f10612d6657610100808354040283529160200191612d91565b820191906000526020600020905b815481529060010190602001808311612d7457829003601f168201915b50505050508152602001600582018054612daa90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612dd690615d82565b8015612e235780601f10612df857610100808354040283529160200191612e23565b820191906000526020600020905b815481529060010190602001808311612e0657829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a0909101529392505050565b6060612e768261400d565b612eda5760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610793565b610766826136cd565b6000612eee8261400d565b612f0a5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290612f3290615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612f5e90615d82565b8015612fab5780601f10612f8057610100808354040283529160200191612fab565b820191906000526020600020905b815481529060010190602001808311612f8e57829003601f168201915b50505050508152602001600182018054612fc490615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054612ff090615d82565b801561303d5780601f106130125761010080835404028352916020019161303d565b820191906000526020600020905b81548152906001019060200180831161302057829003601f168201915b5050505050815260200160028201805461305690615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461308290615d82565b80156130cf5780601f106130a4576101008083540402835291602001916130cf565b820191906000526020600020905b8154815290600101906020018083116130b257829003601f168201915b505050505081526020016003820180546130e890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461311490615d82565b80156131615780601f1061313657610100808354040283529160200191613161565b820191906000526020600020905b81548152906001019060200180831161314457829003601f168201915b5050505050815260200160048201805461317a90615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546131a690615d82565b80156131f35780601f106131c8576101008083540402835291602001916131f3565b820191906000526020600020905b8154815290600101906020018083116131d657829003601f168201915b5050505050815260200160058201805461320c90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461323890615d82565b80156132855780601f1061325a57610100808354040283529160200191613285565b820191906000526020600020905b81548152906001019060200180831161326857829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506132d89042615d3f565b9392505050565b60006132ea8261400d565b6133065760405162461bcd60e51b815260040161079390615a36565b6000828152600b60205260408082208151610160810190925280548290829061332e90615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461335a90615d82565b80156133a75780601f1061337c576101008083540402835291602001916133a7565b820191906000526020600020905b81548152906001019060200180831161338a57829003601f168201915b505050505081526020016001820180546133c090615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546133ec90615d82565b80156134395780601f1061340e57610100808354040283529160200191613439565b820191906000526020600020905b81548152906001019060200180831161341c57829003601f168201915b5050505050815260200160028201805461345290615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461347e90615d82565b80156134cb5780601f106134a0576101008083540402835291602001916134cb565b820191906000526020600020905b8154815290600101906020018083116134ae57829003601f168201915b505050505081526020016003820180546134e490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461351090615d82565b801561355d5780601f106135325761010080835404028352916020019161355d565b820191906000526020600020905b81548152906001019060200180831161354057829003601f168201915b5050505050815260200160048201805461357690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546135a290615d82565b80156135ef5780601f106135c4576101008083540402835291602001916135ef565b820191906000526020600020905b8154815290600101906020018083116135d257829003601f168201915b5050505050815260200160058201805461360890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461363490615d82565b80156136815780601f1061365657610100808354040283529160200191613681565b820191906000526020600020905b81548152906001019060200180831161366457829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260c001519392505050565b60606000600b60008481526020019081526020016000206040518061016001604052908160008201805461370090615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461372c90615d82565b80156137795780601f1061374e57610100808354040283529160200191613779565b820191906000526020600020905b81548152906001019060200180831161375c57829003601f168201915b5050505050815260200160018201805461379290615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546137be90615d82565b801561380b5780601f106137e05761010080835404028352916020019161380b565b820191906000526020600020905b8154815290600101906020018083116137ee57829003601f168201915b5050505050815260200160028201805461382490615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461385090615d82565b801561389d5780601f106138725761010080835404028352916020019161389d565b820191906000526020600020905b81548152906001019060200180831161388057829003601f168201915b505050505081526020016003820180546138b690615d82565b80601f01602080910402602001604051908101604052809291908181526020018280546138e290615d82565b801561392f5780601f106139045761010080835404028352916020019161392f565b820191906000526020600020905b81548152906001019060200180831161391257829003601f168201915b5050505050815260200160048201805461394890615d82565b80601f016020809104026020016040519081016040528092919081815260200182805461397490615d82565b80156139c15780601f10613996576101008083540402835291602001916139c1565b820191906000526020600020905b8154815290600101906020018083116139a457829003601f168201915b505050505081526020016005820180546139da90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613a0690615d82565b8015613a535780601f10613a2857610100808354040283529160200191613a53565b820191906000526020600020905b815481529060010190602001808311613a3657829003601f168201915b5050509183525050600682015460ff161515602082015260078201546040808301919091526008830154606083015260098301546080830152600a9092015460a090910152815190820151919250613ac091613aae8661197c565b604051602001611e729392919061520f565b604051602001613ad091906155c3565b604051602081830303815290604052915050919050565b6000613af28261400d565b613b0e5760405162461bcd60e51b815260040161079390615a36565b6000828152600b602052604080822081516101608101909252805482908290613b3690615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613b6290615d82565b8015613baf5780601f10613b8457610100808354040283529160200191613baf565b820191906000526020600020905b815481529060010190602001808311613b9257829003601f168201915b50505050508152602001600182018054613bc890615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613bf490615d82565b8015613c415780601f10613c1657610100808354040283529160200191613c41565b820191906000526020600020905b815481529060010190602001808311613c2457829003601f168201915b50505050508152602001600282018054613c5a90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613c8690615d82565b8015613cd35780601f10613ca857610100808354040283529160200191613cd3565b820191906000526020600020905b815481529060010190602001808311613cb657829003601f168201915b50505050508152602001600382018054613cec90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613d1890615d82565b8015613d655780601f10613d3a57610100808354040283529160200191613d65565b820191906000526020600020905b815481529060010190602001808311613d4857829003601f168201915b50505050508152602001600482018054613d7e90615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613daa90615d82565b8015613df75780601f10613dcc57610100808354040283529160200191613df7565b820191906000526020600020905b815481529060010190602001808311613dda57829003601f168201915b50505050508152602001600582018054613e1090615d82565b80601f0160208091040260200160405190810160405280929190818152602001828054613e3c90615d82565b8015613e895780601f10613e5e57610100808354040283529160200191613e89565b820191906000526020600020905b815481529060010190602001808311613e6c57829003601f168201915b5050509183525050600682015460ff1615156020820152600782015460408201526008820154606082015260098201546080820152600a9091015460a09091015260e08101519091506201518090613ee19042615d3f565b613eeb9190615ccd565b6132d8906001615cb5565b600a546001600160a01b03163314613f205760405162461bcd60e51b815260040161079390615ad3565b6001600160a01b038116613f855760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610793565b6123e381614620565b600a546001600160a01b03163314613fb85760405162461bcd60e51b815260040161079390615ad3565b600d55565b60006001600160e01b031982166380ac58cd60e01b1480613fee57506001600160e01b03198216635b5e139f60e01b145b8061076657506301ffc9a760e01b6001600160e01b0319831614610766565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061405f826124a2565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6060816140bc5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156140e657806140d081615dbd565b91506140df9050600a83615ccd565b91506140c0565b60008167ffffffffffffffff81111561410f57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614139576020820181803683370190505b5090505b84156141b25761414e600183615d3f565b915061415b600a86615dd8565b614166906030615cb5565b60f81b81838151811061418957634e487b7160e01b600052603260045260246000fd5b60200101906001600160f81b031916908160001a9053506141ab600a86615ccd565b945061413d565b949350505050565b610e86828260405180602001604052806000815250614774565b60006141df8261400d565b6142405760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610793565b600061424b836124a2565b9050806001600160a01b0316846001600160a01b031614806142865750836001600160a01b031661427b84610bf6565b6001600160a01b0316145b806141b257506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff166141b2565b826001600160a01b03166142cd826124a2565b6001600160a01b0316146143355760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610793565b6001600160a01b0382166143975760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610793565b6143a28383836147a7565b6143ad60008261402a565b6001600160a01b03831660009081526003602052604081208054600192906143d6908490615d3f565b90915550506001600160a01b0382166000908152600360205260408120805460019290614404908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b606081516000141561448557505060408051602081019091526000815290565b6000604051806060016040528060408152602001615e4560409139905060006003845160026144b49190615cb5565b6144be9190615ccd565b6144c9906004615ce1565b905060006144d8826020615cb5565b67ffffffffffffffff8111156144fe57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015614528576020820181803683370190505b509050818152600183018586518101602084015b818310156145965760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b9382019390935260040161453c565b6003895106600181146145b057600281146145c1576145cd565b613d3d60f01b6001198301526145cd565b603d60f81b6000198301525b509398975050505050505050565b610e8682826040516024016145f19291906159dd565b60408051601f198184030181529190526020810180516001600160e01b03166309710a9d60e41b17905261485f565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156146d45760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610793565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b61474c8484846142ba565b61475884848484614880565b61277e5760405162461bcd60e51b815260040161079390615a81565b61477e838361498d565b61478b6000848484614880565b610d8f5760405162461bcd60e51b815260040161079390615a81565b6001600160a01b038316614802576147fd81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b614825565b816001600160a01b0316836001600160a01b031614614825576148258382614acc565b6001600160a01b03821661483c57610d8f81614b69565b826001600160a01b0316826001600160a01b031614610d8f57610d8f8282614c42565b80516a636f6e736f6c652e6c6f67602083016000808483855afa5050505050565b60006001600160a01b0384163b1561498257604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906148c49033908990889088906004016158ed565b602060405180830381600087803b1580156148de57600080fd5b505af192505050801561490e575060408051601f3d908101601f1916820190925261490b91810190614ee4565b60015b614968573d80801561493c576040519150601f19603f3d011682016040523d82523d6000602084013e614941565b606091505b5080516149605760405162461bcd60e51b815260040161079390615a81565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506141b2565b506001949350505050565b6001600160a01b0382166149e35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610793565b6149ec8161400d565b15614a395760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610793565b614a45600083836147a7565b6001600160a01b0382166000908152600360205260408120805460019290614a6e908490615cb5565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001614ad984612617565b614ae39190615d3f565b600083815260076020526040902054909150808214614b36576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090614b7b90600190615d3f565b60008381526009602052604081205460088054939450909284908110614bb157634e487b7160e01b600052603260045260246000fd5b906000526020600020015490508060088381548110614be057634e487b7160e01b600052603260045260246000fd5b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480614c2657634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000614c4d83612617565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054614c9290615d82565b90600052602060002090601f016020900481019282614cb45760008555614cfa565b82601f10614ccd57805160ff1916838001178555614cfa565b82800160010185558215614cfa579182015b82811115614cfa578251825591602001919060010190614cdf565b50614d06929150614d0a565b5090565b5b80821115614d065760008155600101614d0b565b80356001600160a01b0381168114614d3657600080fd5b919050565b600060208284031215614d4c578081fd5b6132d882614d1f565b60008060408385031215614d67578081fd5b614d7083614d1f565b9150614d7e60208401614d1f565b90509250929050565b600080600060608486031215614d9b578081fd5b614da484614d1f565b9250614db260208501614d1f565b9150604084013590509250925092565b60008060008060808587031215614dd7578081fd5b614de085614d1f565b9350614dee60208601614d1f565b925060408501359150606085013567ffffffffffffffff811115614e10578182fd5b8501601f81018713614e20578182fd5b8035614e33614e2e82615c8d565b615c5c565b818152886020838501011115614e47578384fd5b81602084016020830137908101602001929092525092959194509250565b60008060408385031215614e77578182fd5b614e8083614d1f565b915060208301358015158114614e94578182fd5b809150509250929050565b60008060408385031215614eb1578182fd5b614eba83614d1f565b946020939093013593505050565b600060208284031215614ed9578081fd5b81356132d881615e2e565b600060208284031215614ef5578081fd5b81516132d881615e2e565b600060208284031215614f11578081fd5b815167ffffffffffffffff811115614f27578182fd5b8201601f81018413614f37578182fd5b8051614f45614e2e82615c8d565b818152856020838501011115614f59578384fd5b611973826020830160208601615d56565b600060208284031215614f7b578081fd5b5035919050565b60008060408385031215614f94578182fd5b50508035926020909101359150565b600080600060608486031215614fb7578283fd5b505081359360208301359350604090920135919050565b60008151808452614fe6816020860160208601615d56565b601f01601f19169290920160200192915050565b7f3c73746f70206f66667365743d22353025222073746f702d636f6c6f723d22688152620e6d8560eb1b602082015260230190565b7f3c73746f70206f66667365743d2231303025222073746f702d636f6c6f723d228152630d0e6d8560e31b602082015260240190565b7f3c7465787420783d2233352220793d2238302220636c6173733d22736d616c6c8152630111f11960e51b602082015260240190565b7f3c73746f70206f66667365743d223025222073746f702d636f6c6f723d2268738152610d8560f31b602082015260220190565b600083516150e1818460208801615d56565b8351908301906150f5818360208801615d56565b01949350505050565b6000875160206151118285838d01615d56565b8851918401916151248184848d01615d56565b88519201916151368184848c01615d56565b87519201916151488184848b01615d56565b865192019161515a8184848a01615d56565b855192019161516c8184848901615d56565b919091019998505050505050505050565b6000885160206151908285838e01615d56565b8951918401916151a38184848e01615d56565b89519201916151b58184848d01615d56565b88519201916151c78184848c01615d56565b87519201916151d98184848b01615d56565b86519201916151eb8184848a01615d56565b85519201916151fd8184848901615d56565b919091019a9950505050505050505050565b683d913730b6b2911d1160b91b81528351600090615234816009850160208901615d56565b71111610113232b9b1b934b83a34b7b7111d1160711b600991840191820152845161526681601b840160208901615d56565b6c1116101134b6b0b3b2911d101160991b601b92909101918201527f646174613a696d6167652f7376672b786d6c3b6261736536342c000000000000602882015283516152ba816042840160208801615d56565b61227d60f01b6042929091019182015260440195945050505050565b60006152e182615065565b85516152f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223533302220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b603692019182018190526153a2603d83017f3c7465787420783d2233352220793d22313333302220636c6173733d22736d6181526903636111f29b4bd329d160b51b6020820152602a0190565b915084516153b4818460208901615d56565b91909101908152651e17b9bb339f60d11b6007820152600d0195945050505050565b60006153e182615065565b85516153f1818360208a01615d56565b661e17ba32bc3a1f60c91b91018181527f3c7465787420783d223436352220793d2238302220636c6173733d22736d616c60078201526e036111f2230bcb99020b634bb329d1608d1b60278201528551909190615355816036850160208a01615d56565b600061546082615065565b8351615470818360208801615d56565b661e17ba32bc3a1f60c91b9101908152651e17b9bb339f60d11b6007820152600d019392505050565b7f3c726563742077696474683d223133383022206865696768743d22313338302281527f2066696c6c3d2275726c2823677261644261636b67726f756e6429222f3e000060208201526e3c7376672076696577426f783d222d60881b603e8201526000855161550f81604d850160208a01615d56565b61202d60f01b604d91840191820152855161553181604f840160208a01615d56565b808201915050600160fd1b80604f8301528551615555816050850160208a01615d56565b60509201918201528351615570816051840160208801615d56565b61111f60f11b605192909101918201526053019695505050505050565b6d417175617469632057617273202360901b8152600082516155b681600e850160208701615d56565b91909101600e0192915050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516155fb81601d850160208701615d56565b91909101601d0192915050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d2267726164466973682220677261646960268201527f656e745472616e73666f726d3d22726f7461746528393029223e000000000000604682015260006156946060830161509b565b85516156a4818360208a01615d56565b6d16101c981296101a18129491179f60911b91019081526156c7600e8201614ffa565b905084516156d9818360208901615d56565b6d16101c98129610199b929491179f60911b9101818152906156fd600e830161502f565b9150845161570f818460208901615d56565b91909101908152701e17b634b732b0b923b930b234b2b73a1f60791b600e820152661e17b232b3399f60c91b601f820152602681015b9695505050505050565b651e3232b3399f60d11b81527f3c6c696e6561724772616469656e742063783d22302e3235222063793d22302e60068201527f32352220723d22302e3735222069643d22677261644669736846696e2220677260268201527f616469656e745472616e73666f726d3d22726f7461746528393029223e000000604682015260006157db6063830161509b565b85516157eb818360208a01615d56565b6d16101c181296101a18129491179f60911b910190815261580e600e8201614ffa565b90508451615820818360208901615d56565b6d16101c18129610199b929491179f60911b9101818152906156fd600e830161502f565b6e3c7376672076696577426f783d222d60881b8152845160009061586f81600f850160208a01615d56565b61202d60f01b600f918401918201528551615891816011840160208a01615d56565b808201915050600160fd1b80601183015285516158b5816012850160208a01615d56565b601292019182015283516158d0816013840160208801615d56565b61111f60f11b601392909101918201526015019695505050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061574590830184614fce565b6020815260006132d86020830184614fce565b60006101608083526159478184018f614fce565b9050828103602084015261595b818e614fce565b9050828103604084015261596f818d614fce565b90508281036060840152615983818c614fce565b90508281036080840152615997818b614fce565b905082810360a08401526159ab818a614fce565b97151560c0840152505060e0810194909452610100840192909252610120830152610140909101529695505050505050565b6040815260006159f06040830185614fce565b90508260208301529392505050565b6020808252601f908201527f456174656e2049642068617320616c7265616479206265656e20656174656e00604082015260600190565b6020808252602b908201527f4552433732314d657461646174613a20517565727920666f72206e6f6e65786960408201526a39ba32b73a103a37b5b2b760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b6020815260008251610160806020850152615b78610180850183614fce565b91506020850151601f1980868503016040870152615b968483614fce565b93506040870151915080868503016060870152615bb38483614fce565b93506060870151915080868503016080870152615bd08483614fce565b935060808701519150808685030160a0870152615bed8483614fce565b935060a08701519150808685030160c087015250615c0b8382614fce565b92505060c0850151615c2160e086018215159052565b5060e0850151610100858101919091528501516101208086019190915285015161014080860191909152909401519390920192909252919050565b604051601f8201601f1916810167ffffffffffffffff81118282101715615c8557615c85615e18565b604052919050565b600067ffffffffffffffff821115615ca757615ca7615e18565b50601f01601f191660200190565b60008219821115615cc857615cc8615dec565b500190565b600082615cdc57615cdc615e02565b500490565b6000816000190483118215151615615cfb57615cfb615dec565b500290565b60008083128015600160ff1b850184121615615d1e57615d1e615dec565b6001600160ff1b0384018313811615615d3957615d39615dec565b50500390565b600082821015615d5157615d51615dec565b500390565b60005b83811015615d71578181015183820152602001615d59565b8381111561277e5750506000910152565b600181811c90821680615d9657607f821691505b60208210811415615db757634e487b7160e01b600052602260045260246000fd5b50919050565b6000600019821415615dd157615dd1615dec565b5060010190565b600082615de757615de7615e02565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146123e357600080fdfe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4171756174696320576172732069732031303025206f6e2d636861696e2c2064796e616d69632c204e46542067616d652ea264697066735822122096d3491e38ada46f7241314df1a374e18f87786388209de074fd0c30d85ca35364736f6c63430008040033

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.