ETH Price: $2,383.77 (+1.35%)

Wormz (WORMZ)
 

Overview

TokenID

697

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

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

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

Contract Source Code Verified (Exact Match)

Contract Name:
Wormz

Compiler Version
v0.8.19+commit.7dd6d404

Optimization Enabled:
Yes with 1000000 runs

Other Settings:
paris EvmVersion
File 1 of 4 : Wormz.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./ERC404.sol";
import "./Base64.sol";

contract Wormz is ERC404 {
    string[8] private baseColors =
        ["#AE8B61", "#DBB181", "#E8AA96", "#FFC2C2", "#EECFA0", "#C9CDAF", "#D5C6E1", "#EAD9D9"];
    string[7] private thirdNames = ["Smile", "Frown", "Handlebars", "Zombie", "Alien", "Ape", "Normal"];
    string[7] private thirdLayers = [
        '<path fill="#000" d="M16 17h1v1h-1z"/>',
        '<path fill="#000" d="M16 19h1v1h-1z"/>',
        '<path stroke="#A66E2C" d="M16.5 20v-2m3.5-.5h-3m3.5.5v2"/><path stroke="#C28946" d="M16 17.5h1m3 0h1"/>',
        '<path fill="#7DA269" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM16 14h-1v1h1v-1zM21 14h-1v1h1v-1zM18 19h-1v1h1v-1z"/><path fill="red" d="M15 13h1v1h-1v-1zM20 13h1v1h-1v-1z"/><path fill="#000" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM20 16v-1h-2v1h2zM17 18v1h3v-1h-3z"/>',
        '<path fill="#C8FBFB" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path stroke="#75BDBD" d="M15.5 12v1m5-1v1"/><path fill="#000" d="M21 19v-1h-5v1h5zM15 13h1v-1h1v1h-1v1h-1v-1zM21 12h1v1h-1v1h-1v-1h1v-1z"/><path fill="#9BE0E0" d="M22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1zM17 13h-1v1h1v-1zM22 13h-1v1h1v-1zM19 14h-1v3h1v-3z"/>',
        '<path fill="#61503D" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#958A7D" stroke="#958A7D" d="M16.5 19.5v-1h-1v-1h1v-2h-1v-1h-1v-3h2v-1h3v1h2v4h-1v2h1v1h-1v1h-4z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/><path fill="#000" d="M16 13h-1v1h1v-1zM21 13h-1v1h1v-1zM18 16v-1h-1v1h1zM17 18v1h3v-1h-3zM19.724 16v-1h-1v1h1z"/><path fill="#AAA197" d="M17 14h-1v-1h1v1zM22 14h-1v-1h1v1z"/>',
        ""
    ];
    string[8] private fourthNames = [
        "3D Glasses",
        "VR",
        "Small Shades",
        "Eye Patch",
        "Classic Shades",
        "Regular Shades",
        "Horned Rim Glasses",
        "None"
    ];
    string[8] private fourthLayers = [
        '<path fill="#F0F0F0" d="M12 11h11v4h-9v-3h-2v-1z"/><path fill="#FD3232" d="M19 12h3v2h-3z"/><path fill="#328DFD" d="M15 12h3v2h-3z"/>',
        '<path fill="#B4B4B4" d="M14 11h9v4h-9z"/><path stroke="#000" d="M14 15.5h8m-8-5h8M13.5 14v1m10-4v4m-10-4v1m2 .5v1h6v-1h-6z"/><path stroke="#8D8D8D" d="M13.5 12v2m1 0v1m0-4v1m8-1v1m0 2v1"/>',
        '<path fill="#000" d="M13 13v-1h9v3h-2v-2h-3v2h-2v-2h-2z"/>',
        '<path fill="#000" d="M13 11h9v1h-4v2h-1v1h-2v-1h-1v-2h-1v-1z"/>',
        '<path stroke="#000" d="M13 11.5h9m-7 3h2m.5-.5v-2m2 0v2m.5.5h2m-7.5-.5v-2"/><path stroke="#5C390F" d="M15 12.5h2m3 0h2"/><path stroke="#C77514" d="M15 13.5h2m3 0h2"/>',
        '<path fill="#000" d="M13 12h11v2h-1v1h-2v-1h-1v-1h-2v1h-1v1h-2v-1h-1v-1h-1v-1z"/>',
        '<path fill="#fff" fill-opacity=".5" d="M14 12h3v3h-3zM19 12h3v3h-3z"/><path fill="#000" d="M13 11h11v2h-1v-1h-4v1h-2v-1h-3v1h-1v-2z"/>',
        ""
    ];
    string[14] private fifthNames = [
        "Beanie",
        "Cowboy Hat",
        "Fedora",
        "Police Cap",
        "Do-rag",
        "Knitted Cap",
        "Bandana",
        "Peak Spike",
        "Wild Hair",
        "Messy Hair",
        "Cap Forward",
        "Cap",
        "Top Hat",
        "None"
    ];
    string[14] private fifthLayers = [
        '<path fill="#3CC300" d="M14 10h7v1h-7z"/><path fill="#0060C3" d="M16 6v4h-4V8h1V7h1V6h2z"/><path fill="#D60404" d="M19 6v4h4V8h-1V7h-1V6h-2z"/><path fill="#E4EB17" d="M14 9h1V8h1V6h3v2h1v1h1v1h-7V9z"/><path fill="#000" d="M17 5h1v1h-1z"/><path fill="#0060C3" d="M15 4h5v1h-5z"/>',
        '<path fill="#794B11" d="M8 7h1v1h4V4h1V3h2v1h3V3h2v1h1v4h4V7h1v2h-1v1H9V9H8V7z"/><path fill="#502F05" d="M12 7h11v1H12z"/>',
        '<path fill="#3D2F1E" d="M9 9h1V8h3V6h1V4h1V3h5v1h1v2h1v2h3v1h1v1H9V9z"/><path fill="#000" d="M12 7h11v1H12z"/>',
        '<path fill="#26314A" d="M12 5h11v5H12z"/><path stroke="#fff" d="M13 8.5h1m1 0h1m1 0h1m1 0h1m1 0h1"/><path stroke="#FFD800" d="M17 6.5h1"/><path fill="#000" fill-rule="evenodd" d="M23 6V5h-4V4h-3v1h-4v1h-1v2h1v2h3v1h9V9h-1V8h1V6h-1zm0 0h-4V5h-3v1h-4v2h1v1h1V8h1v2h8V9h-1V8h1V6zm-7 3h1V8h-1v1zm2 0h1V8h-1v1zm2 0h1V8h-1v1z" clip-rule="evenodd"/>',
        '<path fill="#4C4C4C" d="M13 7h9v4h-9z"/><path fill="#000" d="M13 10h-1V8h1V7h1V6h7v1h2v2h-1V8h-1V7h-7v1h-1v2z"/><path stroke="#636363" d="M14 9.5h1m0-1h1"/>',
        '<path fill="#CA4E11" d="M14 7h-1v3h9V7h-1V6h-7v1z"/><path fill="#933709" d="M12 8h11v2h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V9h-1v1h-1V8z"/><path stroke="#000" d="M11.5 10V8m1 0V7m1 0V6m.5-.5h7m.5.5v1m1 0v1m1 0v2"/>',
        '<path fill="#1A43C8" d="M13 7h9v3H10v3H9v-3H8V9h5V7z"/><path stroke="#1637A4" d="M22 9.5h-1m0 1h-3m0-1h-4m8.5-.5V7m-.5-.5h-8m0 1h-1m0 1h-1m0 1h-1m0 1h-1m0-1H9"/><path stroke="#142C7C" d="M11 11.5h-1m2-1h-1m2-1h-1"/>',
        '<path fill="#000" d="M14 7V5h1V4h1v1h1V4h1v1h1V4h1v1h1v2h1v2h-3v1h-1v1h-1v-1h-1V9h-3V7h1zM12 9v1h1V9h-1z"/>',
        '<path stroke="#000" d="M12 4.5h2m4 0h5m-14 1h1m2 0h10m2 0h2m-17 1h16m-16 1h17m-16 1h15m-16 1h9m2 0h5m-17 1h7m2 0h2m2 0h3m-14 1h4m9 0h2m-16 1h5m9 0h2m-16 1h1m1 0h3m9.5-.5v2M10 14.5h4m-4 1h2"/>',
        '<path fill="#000" d="M14 11h1v1h-1zM15 10h1v1h-1zM18 9h1v3h-1zM12 9h6v1h-6zM13 10h1v1h-1zM11 10h1v1h-1zM11 8h3v1h-3zM12 7h2v1h-2zM13 6h2v1h-2zM14 5h6v1h-6zM21 5h1v2h-1zM21 7h3v1h-3zM21 10h3v1h-3zM20 8h3v2h-3zM15 7h4v2h-4z"/><path fill="#000" d="M17 6h4v2h-4z"/><path fill="#000" d="M14 6h4v3h-4z"/><path stroke="#000" d="M14 5.5h6m1 0h1m-9 1h9m-10 1h12m-13 1h8m1 0h3m-11 1h7m1 0h3m-12 1h1m1 0h1m1 0h1m-2 1h1m3.5-1.5v2m2.5-1.5h3"/>',
        '<path fill="#515151" d="M13 6h9v4h-9V6z"/><path stroke="#000" d="M12 10.5h12.5V9m-.5-.5h-8m0 1h-1m8-2h-1m0-1h-1m0-1h-7m0 1h-1m-.5.5v3"/><path stroke="#353535" d="M24 9.5h-8m-1-3h-1m0 1h-1"/>',
        '<path fill="#8119B7" d="M12 7h1V6h1V5h7v1h1v2h3v1h1v1H12V7z"/><path stroke="#B261DC" d="M21 7.5h-1m0-1h-1"/>',
        '<path fill="#000" d="M13 2h9v1h1v5h1v1h1v1H10V9h1V8h1V3h1V2z"/><path fill="#DC1D1D" d="M12 7h11v1H12z"/>',
        ""
    ];
    string[5] private sixthNames = ["Earring", "Vape", "Cigarette", "Pipe", "None"];
    string[5] private sixthLayers = [
        '<path fill="#FFD926" d="M12 14h1v1h-1z"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#595959" d="M20 18.5h6"/><path stroke="#0040FF" d="M26 18.5h1"/>',
        '<path stroke="#000" d="M20 17.5h7m1 1h-1m0 1h-7"/><path stroke="#D7D1D1" d="M20 18.5h6"/><path stroke="#E7A600" d="M26 18.5h1"/><path fill="#fff" fill-opacity=".4" d="M26 11h1v5h-1z"/>',
        '<path stroke="#000" d="M20 18.5h1m0 1h1m0 1h1m0 1h1.5v-2h4V22m-1 0v1m-.5.5h-4m0-1h-1m0-1h-1m0-1h-1m0-1h-1"/><path stroke="#855114" d="M20 19.5h1m0 1h1m0 1h1m0 1h3m-1-2h3m-2 1h1"/><path stroke="#683C08" d="M25 21.5h1m0 1h1m0-1h1"/><path stroke="#fff" stroke-opacity=".4" d="M26.5 12v1.5m0 0H25m1.5 0H28M26.5 15v1m0 1v1"/>',
        ""
    ];

    struct WormzObject {
        uint256 baseColor;
        uint256 layerThree;
        uint256 layerFour;
        uint256 layerFive;
        uint256 layerSix;
    }

    function randomWormz(uint256 tokenId) internal pure returns (WormzObject memory) {
        WormzObject memory wormz;

        wormz.baseColor = getBaseColor(tokenId);
        wormz.layerThree = getLayerThree(tokenId);
        wormz.layerFour = getLayerFour(tokenId);
        wormz.layerFive = getLayerFive(tokenId);
        wormz.layerSix = getLayerSix(tokenId);

        return wormz;
    }

    function getTraits(WormzObject memory wormz) internal view returns (string memory) {
        string[20] memory parts;

        parts[0] = ', "attributes": [{"trait_type": "Type","value": "';
        if (wormz.layerThree == 3) {
            parts[1] = 'Zombie"}, {"trait_type": "Mouth","value": "Zombie"},';
        }
        if (wormz.layerThree == 4) {
            parts[2] = 'Alien"}, {"trait_type": "Mouth","value": "Alien"},';
        }
        if (wormz.layerThree == 5) {
            parts[3] = 'Ape"}, {"trait_type": "Mouth","value": "Ape"},';
        }
        if (wormz.layerThree < 3 || wormz.layerThree > 5) {
            parts[4] = 'Normal"}, {"trait_type": "Mouth","value": "';
            parts[5] = thirdNames[wormz.layerThree];
            parts[6] = '"},';
        }
        parts[7] = ' {"trait_type": "Eyewear","value": "';
        parts[8] = fourthNames[wormz.layerFour];
        parts[9] = '"}, {"trait_type": "Headwear","value": "';
        parts[10] = fifthNames[wormz.layerFive];
        parts[11] = '"}, {"trait_type": "Accessory","value": "';
        parts[12] = sixthNames[wormz.layerSix];
        parts[13] = '"}], ';

        string memory output =
            string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7]));
        output = string(abi.encodePacked(output, parts[8], parts[9], parts[10], parts[11], parts[12], parts[13]));
        return output;
    }

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }

    function getBaseColor(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("BASE COLOR", toString(tokenId))));

        uint256 rn1 = rand % 79;
        uint256 bc = 0;

        if (rn1 >= 10 && rn1 < 20) bc = 1;
        if (rn1 >= 20 && rn1 < 30) bc = 2;
        if (rn1 >= 30 && rn1 < 40) bc = 3;
        if (rn1 >= 40 && rn1 < 50) bc = 4;
        if (rn1 >= 50 && rn1 < 60) bc = 5;
        if (rn1 >= 60 && rn1 < 70) bc = 6;
        if (rn1 >= 70) bc = 7;

        return bc;
    }

    function getLayerThree(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER THREE", toString(tokenId))));

        uint256 rn3 = rand % 170;
        uint256 l3 = 0;

        if (rn3 >= 46 && rn3 < 64) l3 = 1;
        if (rn3 >= 64 && rn3 < 81) l3 = 2;
        if (rn3 >= 81 && rn3 < 85) l3 = 3;
        if (rn3 == 85) l3 = 4;
        if (rn3 >= 86 && rn3 < 88) l3 = 5;
        if (rn3 >= 88) l3 = 6;

        return l3;
    }

    function getLayerFour(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FOUR", toString(tokenId))));

        uint256 rn4 = rand % 500;
        uint256 l4 = 0;

        if (rn4 >= 41 && rn4 < 81) l4 = 1;
        if (rn4 >= 81 && rn4 < 121) l4 = 2;
        if (rn4 >= 121 && rn4 < 161) l4 = 3;
        if (rn4 >= 161 && rn4 < 201) l4 = 4;
        if (rn4 >= 201 && rn4 < 261) l4 = 5;
        if (rn4 >= 261 && rn4 < 281) l4 = 6;
        if (rn4 >= 281) l4 = 7;

        return l4;
    }

    function getLayerFive(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER FIVE", toString(tokenId))));

        uint256 rn5 = rand % 240;
        uint256 l5 = 0;

        if (rn5 >= 10 && rn5 < 20) l5 = 1;
        if (rn5 >= 20 && rn5 < 30) l5 = 2;
        if (rn5 >= 30 && rn5 < 40) l5 = 3;
        if (rn5 >= 40 && rn5 < 50) l5 = 4;
        if (rn5 >= 50 && rn5 < 60) l5 = 5;
        if (rn5 >= 60 && rn5 < 70) l5 = 6;
        if (rn5 >= 70 && rn5 < 80) l5 = 7;
        if (rn5 >= 80 && rn5 < 90) l5 = 8;
        if (rn5 >= 90 && rn5 < 100) l5 = 9;
        if (rn5 >= 100 && rn5 < 110) l5 = 10;
        if (rn5 >= 110 && rn5 < 120) l5 = 11;
        if (rn5 >= 120 && rn5 < 130) l5 = 12;
        if (rn5 >= 130) l5 = 13;

        return l5;
    }

    function getLayerSix(uint256 tokenId) internal pure returns (uint256) {
        uint256 rand = random(string(abi.encodePacked("LAYER SIX", toString(tokenId))));

        uint256 rn6 = rand % 120;
        uint256 l6 = 0;

        if (rn6 >= 10 && rn6 < 20) l6 = 1;
        if (rn6 >= 20 && rn6 < 30) l6 = 2;
        if (rn6 >= 30 && rn6 < 40) l6 = 3;
        if (rn6 >= 40) l6 = 4;

        return l6;
    }

    function getSVG(WormzObject memory wormz) internal view returns (string memory) {
        string[9] memory parts;

        parts[0] =
            '<svg id="x" xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 30 30"><path fill="#638596" d="M0 0h30v30H0z"/>';
        parts[1] = '<path fill="';
        parts[2] = baseColors[wormz.baseColor];
        parts[3] =
            '" d="M22 10v12h-2v2h-1v1H5v-1h1v-1h1v-1h1v-1h1v-1h2v-1h2v-9h1V9h2V8h-1V7h3v1h1v1h2v1h1z"/><path fill="#000" d="M4 24v2h16v-2h-1v1H5v-1H4zM6 23H5v1h1v-1zM7 22H6v1h1v-1zM8 21H7v1h1v-1zM9 20H8v1h1v-1zM11 19H9v1h2v-1zM12 10v8h-1v1h2v-9h-1zM14 10V9h-1v1h1zM15 8V7h-1v2h2V8h-1zM18 6h-3v1h3V6zM19 7h-1v1h1V7zM21 8h-2v1h2V8zM23 22V9h-2v1h1v12h1zM21 24v-1h1v-1h-2v2h1zM15 13h1v1h-1v-1zM20 13h1v1h-1v-1zM18 15h2v1h-2v-1zM17 18h3v1h-3v-1z"/><path fill="#000" fill-opacity=".2" d="M17 13h-1v1h1v-1zM22 13h-1v1h1v-1z"/><path fill="#000" fill-opacity=".4" d="M17 12h-2v1h2v-1zM20 12v1h2v-1h-2zM22 21h-9v1h1v1h6v-1h2v-1zM12 19h-1v6h2v-1h-1v-5zM10 25v-5H9v5h1zM8 25v-3H7v3h1zM6 24H5v1h1v-1z"/>';
        parts[4] = thirdLayers[wormz.layerThree];
        parts[5] = fourthLayers[wormz.layerFour];
        parts[6] = fifthLayers[wormz.layerFive];
        parts[7] = sixthLayers[wormz.layerSix];
        parts[8] = "<style>#x{shape-rendering: crispedges;}</style></svg>";

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])
        );

        return output;
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        WormzObject memory wormz = randomWormz(tokenId);
        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Wormz #',
                        toString(tokenId),
                        '", "description": "A fully on-chain game utilising the experiemental token standard, ERC-404 which enables persistent liquidity and semi-fungibility."',
                        getTraits(wormz),
                        '"image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(getSVG(wormz))),
                        '"}'
                    )
                )
            )
        );
        json = string(abi.encodePacked("data:application/json;base64,", json));
        return json;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        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);
    }

    uint256 INIT_SUPPLY = 10_000 * 10 ** 18;
    uint256 public GARDEN_SUPPLY = 10_000 * 10 ** 18;
    bool public gardenLocked;
    address public garden;

    function setGarden(address _garden) external onlyOwner returns (address) {
        require(!gardenLocked, "garden locked!");
        if (garden != address(0)) {
            balanceOf[garden] = 0;
            whitelist[garden] = false;
        }
        garden = _garden;
        whitelist[_garden] = true;
        balanceOf[_garden] = GARDEN_SUPPLY;
        return garden;
    }

    function lockGarden() external onlyOwner {
        gardenLocked = true;
    }

    constructor(address _owner) ERC404("Wormz", "WORMZ", 18, 20_000, _owner) {
        balanceOf[_owner] = INIT_SUPPLY;
        whitelist[_owner] = true;
    }
}

File 2 of 4 : ERC404.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

import "./Ownable.sol";
// import { console2 } from "../lib/forge-std/src/console2.sol";

abstract contract ERC721Receiver {
    function onERC721Received(address, address, uint256, bytes calldata) external virtual returns (bytes4) {
        return ERC721Receiver.onERC721Received.selector;
    }
}

/// @notice ERC404
///         A gas-efficient, mixed ERC20 / ERC721 implementation
///         with native liquidity and fractionalization.
///
///         This is an experimental standard designed to integrate
///         with pre-existing ERC20 / ERC721 support as smoothly as
///         possible.
///
/// @dev    In order to support full functionality of ERC20 and ERC721
///         supply assumptions are made that slightly constraint usage.
///         Ensure decimals are sufficiently large (standard 18 recommended)
///         as ids are effectively encoded in the lowest range of amounts.
///
///         NFTs are spent on ERC20 functions in a FILO queue, this is by
///         design.
///
abstract contract ERC404 is Ownable {
    // Events
    event ERC20Transfer(address indexed from, address indexed to, uint256 amount);
    event Approval(address indexed owner, address indexed spender, uint256 amount);
    event Transfer(address indexed from, address indexed to, uint256 indexed id);
    event ERC721Approval(address indexed owner, address indexed spender, uint256 indexed id);
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    // Errors
    error NotFound();
    error AlreadyExists();
    error InvalidRecipient();
    error InvalidSender();
    error UnsafeRecipient();

    // Metadata
    /// @dev Token name
    string public name;

    /// @dev Token symbol
    string public symbol;

    /// @dev Decimals for fractional representation
    uint8 public immutable decimals;

    /// @dev Total supply in fractionalized representation
    uint256 public immutable totalSupply;

    /// @dev Current mint counter, monotonically increasing to ensure accurate ownership
    uint256 public minted;

    // Mappings
    /// @dev Balance of user in fractional representation
    mapping(address => uint256) public balanceOf;

    /// @dev Allowance of user in fractional representation
    mapping(address => mapping(address => uint256)) public allowance;

    /// @dev Approval in native representaion
    mapping(uint256 => address) public getApproved;

    /// @dev Approval for all in native representation
    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /// @dev Owner of id in native representation
    mapping(uint256 => address) internal _ownerOf;

    /// @dev Array of owned ids in native representation
    mapping(address => uint256[]) internal _owned;

    /// @dev Tracks indices for the _owned mapping
    mapping(uint256 => uint256) internal _ownedIndex;

    /// @dev Addresses whitelisted from minting / burning for gas savings (pairs, routers, etc)
    mapping(address => bool) public whitelist;
    mapping(address => bool) greylist;
    uint256 greylistTimestamp;
    bool greylistEnabled;

    // Constructor
    constructor(
        string memory _name,
        string memory _symbol,
        uint8 _decimals,
        uint256 _totalNativeSupply,
        address _owner
    )
        Ownable(_owner)
    {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        totalSupply = _totalNativeSupply * (10 ** decimals);
        greylistTimestamp = block.timestamp + 120 minutes;
    }

    /// @notice Initialization function to set pairs / etc
    ///         saving gas by avoiding mint / burn on unnecessary targets
    function setWhitelist(address target, bool state) public onlyOwner {
        whitelist[target] = state;
    }

    function setGreylist(address[] calldata target, bool state) public onlyOwner {
        require(greylistTimestamp > block.timestamp, "greylist over");
        greylistEnabled = true;
        for (uint256 i = 0; i < target.length; i++) {
            greylist[target[i]] = state;
        }
    }

    function closeGreylist() public onlyOwner {
        greylistEnabled = false;
    }

    /// @notice Function to find owner of a given native token
    function ownerOf(uint256 id) public view virtual returns (address owner) {
        owner = _ownerOf[id];

        if (owner == address(0)) {
            revert NotFound();
        }
    }

    /// @notice tokenURI must be implemented by child contract
    function tokenURI(uint256 id) public view virtual returns (string memory);

    /// @notice Function for token approvals
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function approve(address spender, uint256 amountOrId) public virtual returns (bool) {
        if (amountOrId <= minted && amountOrId > 0) {
            address owner = _ownerOf[amountOrId];

            if (msg.sender != owner && !isApprovedForAll[owner][msg.sender]) {
                revert Unauthorized();
            }

            getApproved[amountOrId] = spender;

            emit Approval(owner, spender, amountOrId);
        } else {
            allowance[msg.sender][spender] = amountOrId;

            emit Approval(msg.sender, spender, amountOrId);
        }

        return true;
    }

    /// @notice Function native approvals
    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

        emit ApprovalForAll(msg.sender, operator, approved);
    }

    /// @notice Function for mixed transfers
    /// @dev This function assumes id / native if amount less than or equal to current max id
    function transferFrom(address from, address to, uint256 amountOrId) public virtual {
        if (amountOrId <= minted) {
            if (from != _ownerOf[amountOrId]) {
                revert InvalidSender();
            }

            if (to == address(0)) {
                revert InvalidRecipient();
            }

            if (msg.sender != from && !isApprovedForAll[from][msg.sender] && msg.sender != getApproved[amountOrId]) {
                revert Unauthorized();
            }

            balanceOf[from] -= _getUnit();

            unchecked {
                balanceOf[to] += _getUnit();
            }

            _ownerOf[amountOrId] = to;
            delete getApproved[amountOrId];

            // update _owned for sender
            uint256 updatedId = _owned[from][_owned[from].length - 1];
            _owned[from][_ownedIndex[amountOrId]] = updatedId;
            // pop
            _owned[from].pop();
            // update index for the moved id
            _ownedIndex[updatedId] = _ownedIndex[amountOrId];
            // push token to to owned
            _owned[to].push(amountOrId);
            // update index for to owned
            _ownedIndex[amountOrId] = _owned[to].length - 1;

            emit Transfer(from, to, amountOrId);
            emit ERC20Transfer(from, to, _getUnit());
        } else {
            uint256 allowed = allowance[from][msg.sender];

            if (allowed != type(uint256).max) {
                allowance[from][msg.sender] = allowed - amountOrId;
            }

            _transfer(from, to, amountOrId);
        }
    }

    /// @notice Function for fractional transfers
    function transfer(address to, uint256 amount) public virtual returns (bool) {
        return _transfer(msg.sender, to, amount);
    }

    /// @notice Function for native transfers with contract support
    function safeTransferFrom(address from, address to, uint256 id) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, "") != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Function for native transfers with contract support and callback data
    function safeTransferFrom(address from, address to, uint256 id, bytes calldata data) public virtual {
        transferFrom(from, to, id);

        if (
            to.code.length != 0
                && ERC721Receiver(to).onERC721Received(msg.sender, from, id, data)
                    != ERC721Receiver.onERC721Received.selector
        ) {
            revert UnsafeRecipient();
        }
    }

    /// @notice Internal function for fractional transfers
    function _transfer(address from, address to, uint256 amount) internal returns (bool) {
        uint256 unit = _getUnit();
        uint256 balanceBeforeSender = balanceOf[from];
        uint256 balanceBeforeReceiver = balanceOf[to];

        balanceOf[from] -= amount;

        unchecked {
            balanceOf[to] += amount;
        }

        if (greylistEnabled && (!greylist[from] || !greylist[to])) {
            revert Unauthorized();
        }

        // Skip burn for certain addresses to save gas
        if (!whitelist[from]) {
            uint256 tokens_to_burn = (balanceBeforeSender / unit) - (balanceOf[from] / unit);
            for (uint256 i = 0; i < tokens_to_burn; i++) {
                _burn(from);
            }
        }

        // Skip minting for certain addresses to save gas
        if (!whitelist[to]) {
            uint256 tokens_to_mint = (balanceOf[to] / unit) - (balanceBeforeReceiver / unit);
            for (uint256 i = 0; i < tokens_to_mint; i++) {
                _mint(to);
            }
        }

        emit ERC20Transfer(from, to, amount);
        return true;
    }

    // Internal utility logic
    function _getUnit() internal view returns (uint256) {
        return 10 ** decimals;
    }

    function _mint(address to) internal virtual {
        if (to == address(0)) {
            revert InvalidRecipient();
        }

        unchecked {
            minted++;
        }

        uint256 id = minted;

        if (_ownerOf[id] != address(0)) {
            revert AlreadyExists();
        }

        _ownerOf[id] = to;
        _owned[to].push(id);
        _ownedIndex[id] = _owned[to].length - 1;

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

    function _burn(address from) internal virtual {
        if (from == address(0)) {
            revert InvalidSender();
        }

        uint256 id = _owned[from][_owned[from].length - 1];
        _owned[from].pop();
        delete _ownedIndex[id];
        delete _ownerOf[id];
        delete getApproved[id];

        emit Transfer(from, address(0), id);
    }

    function _setNameSymbol(string memory _name, string memory _symbol) internal {
        name = _name;
        symbol = _symbol;
    }
}

File 3 of 4 : Base64.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

        uint256 encodedLen = 4 * ((len + 2) / 3);

        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

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

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

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

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

File 4 of 4 : Ownable.sol
//SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.8.0;

abstract contract Ownable {
    event OwnershipTransferred(address indexed user, address indexed newOwner);

    error Unauthorized();
    error InvalidOwner();

    address public owner;

    modifier onlyOwner() virtual {
        if (msg.sender != owner) revert Unauthorized();

        _;
    }

    constructor(address _owner) {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(address(0), _owner);
    }

    function transferOwnership(address _owner) public virtual onlyOwner {
        if (_owner == address(0)) revert InvalidOwner();

        owner = _owner;

        emit OwnershipTransferred(msg.sender, _owner);
    }

    function revokeOwnership() public virtual onlyOwner {
        owner = address(0);

        emit OwnershipTransferred(msg.sender, address(0));
    }
}

Settings
{
  "remappings": [
    "@forge-std/=lib/forge-std/src/",
    "@openzeppelin/=lib/openzeppelin-contracts/",
    "@solady/=lib/solady/src/",
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "forge-std/=lib/forge-std/src/",
    "solady/=lib/solady/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 1000000
  },
  "metadata": {
    "useLiteralContent": false,
    "bytecodeHash": "none",
    "appendCBOR": false
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "paris",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"AlreadyExists","type":"error"},{"inputs":[],"name":"InvalidOwner","type":"error"},{"inputs":[],"name":"InvalidRecipient","type":"error"},{"inputs":[],"name":"InvalidSender","type":"error"},{"inputs":[],"name":"NotFound","type":"error"},{"inputs":[],"name":"Unauthorized","type":"error"},{"inputs":[],"name":"UnsafeRecipient","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"ERC20Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"ERC721Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"user","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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"GARDEN_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"closeGreylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"garden","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gardenLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockGarden","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"revokeOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","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":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_garden","type":"address"}],"name":"setGarden","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"target","type":"address[]"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setGreylist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"target","type":"address"},{"internalType":"bool","name":"state","type":"bool"}],"name":"setWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amountOrId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

60076101c0818152662341453842363160c81b6101e05260c0908152610200828152662344424231383160c81b6102205260e0526102408281526611a29c20a09c9b60c91b61026052610100526102808281526611a3232199219960c91b6102a052610120526102c0828152660234545434641360cc1b6102e052610140526103008281526611a19ca1a220a360c91b6103205261016052610340828152662344354336453160c81b61036052610180526103c0604052610380918252662345414439443960c81b6103a0526101a091909152620000e290600f90600862000bb4565b506040805161012081018252600560e0820181815264536d696c6560d81b61010084015282528251808401845281815264233937bbb760d91b6020828101919091528084019190915283518085018552600a81526948616e646c656261727360b01b8183015283850152835180850185526006808252655a6f6d62696560d01b828401526060850191909152845180860186529283526420b634b2b760d91b83830152608084019290925283518085018552600381526241706560e81b8183015260a0840152835180850190945290835265139bdc9b585b60d21b9083015260c0810191909152620001d990601790600762000c04565b50604080516101408101909152602660e0820181815282916200650c61010084013981526020016040518060600160405280602681526020016200586c6026913981526020016040518060a0016040528060678152602001620055666067913981526020016040518061020001604052806101e081526020016200632c6101e091398152602001604051806101e001604052806101a6815260200162005b426101a691398152602001604051806102600160405280610235815260200162005e796102359139815260408051602081810190925260008152910152620002c490601e90600762000c04565b506040805161014081018252600a610100820190815269334420476c617373657360b01b61012083015281528151808301835260028152612b2960f11b6020828101919091528083019190915282518084018452600c81526b536d616c6c2053686164657360a01b818301528284015282518084018452600981526808af2ca40a0c2e8c6d60bb1b81830152606083015282518084018452600e8082526d436c61737369632053686164657360901b828401526080840191909152835180850185529081526d526567756c61722053686164657360901b8183015260a0830152825180840184526012815271486f726e65642052696d20476c617373657360701b8183015260c0830152825180840190935260048352634e6f6e6560e01b9083015260e0810191909152620003fe90602590600862000bb4565b50604080516101c08101909152608561010082018181528291620054e161012084013981526020016040518060e0016040528060bc81526020016200620460bc913981526020016040518060600160405280603a8152602001620055cd603a913981526020016040518060600160405280603f815260200162005238603f913981526020016040518060e0016040528060a681526020016200516960a69139815260200160405180608001604052806051815260200162005ce86051913981526020016040518060c001604052806086815260200162005900608691398152604080516020818101909252600081529101526200050090602d90600862000bb4565b50604080516102008101825260066101c08201818152654265616e696560d01b6101e0840152825282518084018452600a8082526910dbddd89bde4812185d60b21b6020838101919091528085019290925284518086018652838152654665646f726160d01b818401528486015284518086018652818152690506f6c696365204361760b41b8184015260608501528451808601865292835265446f2d72616760d01b83830152608084019290925283518085018552600b8082526a04b6e6974746564204361760ac1b8284015260a08501919091528451808601865260078082526642616e64616e6160c81b8285015260c086019190915285518087018752848152695065616b205370696b6560b01b8185015260e08601528551808701875260098152682bb4b632102430b4b960b91b81850152610100860152855180870187529384526926b2b9b9bc902430b4b960b11b84840152610120850193909352845180860186529081526a10d85c08119bdc9dd85c9960aa1b8183015261014084015283518085018552600381526204361760ec1b818301526101608401528351808501855291825266151bdc0812185d60ca1b82820152610180830191909152825180840190935260048352634e6f6e6560e01b908301526101a0810191909152620006f390603590600e62000c42565b506040805161030081019091526101166101c082018181528291620053cb6101e084013981526020016040518060a00160405280607a815260200162005a5d607a913981526020016040518060a00160405280606e815260200162005892606e913981526020016040518061018001604052806101568152602001620060ae610156913981526020016040518060c00160405280609c815260200162005277609c9139815260200160405180610100016040528060dc8152602001620066e060dc9139815260200160405180610100016040528060d781526020016200598660d7913981526020016040518060a00160405280606b815260200162005ad7606b913981526020016040518060e0016040528060bf8152602001620057ad60bf91398152602001604051806101e001604052806101ae8152602001620065326101ae913981526020016040518060e0016040528060be8152602001620056ef60be913981526020016040518060a00160405280606c8152602001620062c0606c913981526020016040518060a00160405280606881526020016200568760689139815260408051602081810190925260008152910152620008b890604390600e62000c42565b506040805160e081018252600760a082019081526645617272696e6760c81b60c08301528152815180830183526004808252635661706560e01b6020838101919091528084019290925283518085018552600981526843696761726574746560b81b818401528385015283518085018552818152635069706560e01b81840152606084015283518085019094528352634e6f6e6560e01b9083015260808101919091526200096b90605190600562000c80565b50604080516101008101909152602960a0820181815282916200520f60c084013981526020016040518060a0016040528060808152602001620056076080913981526020016040518060e0016040528060b881526020016200531360b891398152602001604051806101600160405280610140815260200162005d39610140913981526040805160208181019092526000815291015262000a1190605690600562000c80565b5069021e19e0c9bab2400000605b5569021e19e0c9bab2400000605c5534801562000a3b57600080fd5b50604051620067bc380380620067bc83398101604081905262000a5e9162000d38565b604051806040016040528060058152602001642bb7b936bd60d91b815250604051806040016040528060058152602001642ba7a926ad60d91b8152506012614e20848060006001600160a01b0316816001600160a01b03160362000ad5576040516349e27cff60e01b815260040160405180910390fd5b600080546001600160a01b0319166001600160a01b03831690811782556040519091907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a350600162000b2c868262000e0f565b50600262000b3b858262000e0f565b5060ff8316608081905262000b5290600a62000ff0565b62000b5e908362001001565b60a05262000b6f42611c206200101b565b600d555050605b546001600160a01b03909416600090815260046020908152604080832096909655600b905293909320805460ff191660011790555062001031915050565b826008810192821562000bf2579160200282015b8281111562000bf2578251829062000be1908262000e0f565b509160200191906001019062000bc8565b5062000c0092915062000cbe565b5090565b826007810192821562000bf2579160200282015b8281111562000bf2578251829062000c31908262000e0f565b509160200191906001019062000c18565b82600e810192821562000bf2579160200282015b8281111562000bf2578251829062000c6f908262000e0f565b509160200191906001019062000c56565b826005810192821562000bf2579160200282015b8281111562000bf2578251829062000cad908262000e0f565b509160200191906001019062000c94565b8082111562000c0057600062000cd5828262000cdf565b5060010162000cbe565b50805462000ced9062000d80565b6000825580601f1062000cfe575050565b601f01602090049060005260206000209081019062000d1e919062000d21565b50565b5b8082111562000c00576000815560010162000d22565b60006020828403121562000d4b57600080fd5b81516001600160a01b038116811462000d6357600080fd5b9392505050565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168062000d9557607f821691505b60208210810362000db657634e487b7160e01b600052602260045260246000fd5b50919050565b601f82111562000e0a57600081815260208120601f850160051c8101602086101562000de55750805b601f850160051c820191505b8181101562000e065782815560010162000df1565b5050505b505050565b81516001600160401b0381111562000e2b5762000e2b62000d6a565b62000e438162000e3c845462000d80565b8462000dbc565b602080601f83116001811462000e7b576000841562000e625750858301515b600019600386901b1c1916600185901b17855562000e06565b600085815260208120601f198616915b8281101562000eac5788860151825594840194600190910190840162000e8b565b508582101562000ecb5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111562000f3257816000190482111562000f165762000f1662000edb565b8085161562000f2457918102915b93841c939080029062000ef6565b509250929050565b60008262000f4b5750600162000fea565b8162000f5a5750600062000fea565b816001811462000f73576002811462000f7e5762000f9e565b600191505062000fea565b60ff84111562000f925762000f9262000edb565b50506001821b62000fea565b5060208310610133831016604e8410600b841016171562000fc3575081810a62000fea565b62000fcf838362000ef1565b806000190482111562000fe65762000fe662000edb565b0290505b92915050565b600062000d6360ff84168362000f3a565b808202811582820484141762000fea5762000fea62000edb565b8082018082111562000fea5762000fea62000edb565b60805160a05161410b6200105e60003960006102750152600081816102e201526116f3015261410b6000f3fe608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063644c43b411610104578063b0d1b56f116100a2578063dd62ed3e11610071578063dd62ed3e14610458578063e985e9c514610483578063f2fde38b146104b1578063fc66ed84146104c457600080fd5b8063b0d1b56f14610417578063b88d4fde1461041f578063bbb1471314610432578063c87b56dd1461044557600080fd5b806395d89b41116100de57806395d89b41146103c65780639b19251a146103ce578063a22cb465146103f1578063a9059cbb1461040457600080fd5b8063644c43b41461037d57806370a08231146103865780638da5cb5b146103a657600080fd5b80632b968958116101715780634f02c4201161014b5780634f02c4201461032957806353d6fd591461033257806356ba88b8146103455780636352211e1461036a57600080fd5b80632b968958146102d5578063313ce567146102dd57806342842e0e1461031657600080fd5b806318160ddd116101ad57806318160ddd146102705780631e6b6ab3146102a55780632311930b146102ba57806323b872dd146102c257600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b31461024d575b600080fd5b6101dc6104d1565b6040516101e99190613050565b60405180910390f35b6102286102003660046130a1565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b61026061025b3660046130de565b61055f565b60405190151581526020016101e9565b6102977f000000000000000000000000000000000000000000000000000000000000000081565b6040519081526020016101e9565b6102b86102b3366004613118565b610716565b005b6102b86108a4565b6102b86102d036600461319c565b61091f565b6102b8610e0b565b6103047f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff90911681526020016101e9565b6102b861032436600461319c565b610eb0565b61029760035481565b6102b86103403660046131d8565b610fe9565b605d5461022890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6102286103783660046130a1565b611090565b610297605c5481565b61029761039436600461320b565b60046020526000908152604090205481565b6000546102289073ffffffffffffffffffffffffffffffffffffffff1681565b6101dc6110f1565b6102606103dc36600461320b565b600b6020526000908152604090205460ff1681565b6102b86103ff3660046131d8565b6110fe565b6102606104123660046130de565b611195565b6102b86111a9565b6102b861042d366004613226565b611227565b61022861044036600461320b565b61134e565b6101dc6104533660046130a1565b611538565b6102976104663660046132c1565b600560209081526000928352604080842090915290825290205481565b6102606104913660046132c1565b600760209081526000928352604080842090915290825290205460ff1681565b6102b86104bf36600461320b565b6115de565b605d546102609060ff1681565b600180546104de906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461050a906132eb565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b505050505081565b600060035482111580156105735750600082115b156106a35760008281526008602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148015906105de575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020908152604080832033845290915290205460ff16155b15610615576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061070c565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610767576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600d54116107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f677265796c697374206f7665720000000000000000000000000000000000000060448201526064015b60405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b8281101561089e5781600c60008686858181106108245761082461333e565b9050602002016020810190610839919061320b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806108968161339c565b915050610805565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6003548111610d645760008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610988576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166109d5576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff841614801590610a2c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832033845290915290205460ff16155b8015610a5c575060008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610a93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a9b6116ec565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054909190610ad09084906133d4565b90915550610ade90506116ec565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260046020908152604080832080549096019095558582526008815284822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690941790556006815284822080549093169092559186168252600990529081208054610b6d906001906133d4565b81548110610b7d57610b7d61333e565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff87168352600982526040808420868552600a90935290922054815492935083928110610bce57610bce61333e565b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff86168152600990915260409020805480610c1057610c106133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255838252600a81526040808320548484528184205573ffffffffffffffffffffffffffffffffffffffff8616808452600983529083208054600181810183558286529385200186905592529054610c9f91906133d4565b6000838152600a6020526040808220929092559051839173ffffffffffffffffffffffffffffffffffffffff80871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610d4d6116ec565b60405190815260200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df857610dc682826133d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610e0384848461171e565b50505b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ebb83838361091f565b73ffffffffffffffffffffffffffffffffffffffff82163b15801590610fb257506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e06576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461103a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110ec576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104de906132eb565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111a233848461171e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61123285858561091f565b73ffffffffffffffffffffffffffffffffffffffff84163b1580159061131757506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a02906112af9033908a90899089908990600401613458565b6020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e03576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1633146113a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d5460ff161561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f67617264656e206c6f636b65642100000000000000000000000000000000000060448201526064016107ce565b605d54610100900473ffffffffffffffffffffffffffffffffffffffff161561149e57605d805473ffffffffffffffffffffffffffffffffffffffff61010091829004811660009081526004602090815260408083208390559454939093049091168152600b9091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50605d805473ffffffffffffffffffffffffffffffffffffffff9283166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9093169290921783556000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055605c546004909252909120559054041690565b60606000611545836119f1565b9050600061159561155585611a9e565b61155e84611bdb565b61156f61156a8661214c565b6125d8565b604051602001611581939291906134d7565b6040516020818303038152906040526125d8565b9050806040516020016115a89190613685565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661167c576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60006117197f0000000000000000000000000000000000000000000000000000000000000000600a6137ea565b905090565b6000806117296116ec565b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600460205260408082208054948a168352908220549282529394509192909186919061177283866133d4565b909155505073ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020805486019055600e5460ff16801561180a575073ffffffffffffffffffffffffffffffffffffffff87166000908152600c602052604090205460ff16158061180a575073ffffffffffffffffffffffffffffffffffffffff86166000908152600c602052604090205460ff16155b15611841576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600b602052604090205460ff166118de5773ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604081205461189f908590613828565b6118a98585613828565b6118b391906133d4565b905060005b818110156118db576118c9896127b5565b806118d38161339c565b9150506118b8565b50505b73ffffffffffffffffffffffffffffffffffffffff86166000908152600b602052604090205460ff1661197d5760006119178483613828565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040902054611948908690613828565b61195291906133d4565b905060005b8181101561197a576119688861296d565b806119728161339c565b915050611957565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516119dc91815260200190565b60405180910390a35060019695505050505050565b611a236040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a556040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a5e83612af6565b8152611a6983612beb565b6020820152611a7783612ca4565b6040820152611a8583612d8a565b6060820152611a9383612f07565b608082015292915050565b606081600003611ae157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b0b5780611af58161339c565b9150611b049050600a83613828565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661383c565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611bd357611b656001836133d4565b9150611b72600a8661386b565b611b7d90603061387f565b60f81b818381518110611b9257611b9261333e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611bcc600a86613828565b9450611b54565b949350505050565b6060611be5612fe9565b6040518060600160405280603181526020016140276031913981526020830151600303611c2b57604051806060016040528060348152602001613cd96034913960208201525b8260200151600403611c56576040518060600160405280603281526020016140586032913960408201525b8260200151600503611c81576040518060600160405280602e81526020016140dd602e913960608201525b600383602001511080611c98575060058360200151115b15611dc7576040518060600160405280602b81526020016140b2602b91396080820152602083015160179060078110611cd357611cd361333e565b018054611cdf906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b906132eb565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b505050505081600560148110611d7057611d7061333e565b60200201819052506040518060400160405280600381526020017f227d2c000000000000000000000000000000000000000000000000000000000081525081600660148110611dc157611dc161333e565b60200201525b604051806060016040528060248152602001613cb56024913960e0820152604083015160259060088110611dfd57611dfd61333e565b018054611e09906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906132eb565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b505050505081600860148110611e9a57611e9a61333e565b602002018190525060405180606001604052806028815260200161408a602891396101208201526060830151603590600e8110611ed957611ed961333e565b018054611ee5906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f11906132eb565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081600a60148110611f7657611f7661333e565b6020020181905250604051806060016040528060298152602001613bfd60299139610160820152608083015160519060058110611fb557611fb561333e565b018054611fc1906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed906132eb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081600c601481106120525761205261333e565b60200201819052506040518060400160405280600581526020017f227d5d2c2000000000000000000000000000000000000000000000000000000081525081600d601481106120a3576120a361333e565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015160e08a015195516000996120e79998979101613892565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290526101008401516101208501516101408601516101608701516101808801516101a08901519597506115a896889690602001613937565b6060612156613011565b6040518060c00160405280608f8152602001613c26608f9139815260408051808201909152600c81527f3c706174682066696c6c3d220000000000000000000000000000000000000000602082015281600160200201528251600f90600881106121c2576121c261333e565b0180546121ce906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa906132eb565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b50505050508160026009811061225f5761225f61333e565b6020020181905250604051806102e001604052806102a58152602001613d0d6102a5913960608201526020830151601e90600781106122a0576122a061333e565b0180546122ac906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d8906132eb565b80156123255780601f106122fa57610100808354040283529160200191612325565b820191906000526020600020905b81548152906001019060200180831161230857829003601f168201915b50505050508160046009811061233d5761233d61333e565b60200201526040830151602d906008811061235a5761235a61333e565b018054612366906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612392906132eb565b80156123df5780601f106123b4576101008083540402835291602001916123df565b820191906000526020600020905b8154815290600101906020018083116123c257829003601f168201915b5050505050816005600981106123f7576123f761333e565b60200201526060830151604390600e81106124145761241461333e565b018054612420906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461244c906132eb565b80156124995780601f1061246e57610100808354040283529160200191612499565b820191906000526020600020905b81548152906001019060200180831161247c57829003601f168201915b5050505050816006600981106124b1576124b161333e565b60200201526080830151605690600581106124ce576124ce61333e565b0180546124da906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612506906132eb565b80156125535780601f1061252857610100808354040283529160200191612553565b820191906000526020600020905b81548152906001019060200180831161253657829003601f168201915b50505050508160076009811061256b5761256b61333e565b6020020181905250604051806060016040528060358152602001613fb260359139610100820181905281516020808401516040808601516060870151608088015160a089015160c08a015160e08b0151955160009a6115a89a9996979596949593949293929091016139c9565b805160609060008190036125fc575050604080516020810190915260008152919050565b6000600361260b83600261387f565b6126159190613828565b612620906004613a8a565b9050600061262f82602061387f565b67ffffffffffffffff8111156126475761264761383c565b6040519080825280601f01601f191660200182016040528015612671576020820181803683370190505b5090506000604051806060016040528060408152602001613fe7604091399050600181016020830160005b868110156126fd576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161269c565b5060038606600181146127175760028114612761576127a7565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526127a7565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116612802576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081208054612835906001906133d4565b815481106128455761284561333e565b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806128a0576128a06133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600690925280832080549092169091555182919073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff81166129ba576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001019081905560008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612a21576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155808452600983529083208054600181810183558286529385200185905592529054612a9e91906133d4565b6000828152600a6020526040808220929092559051829173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080612b29612b0584611a9e565b604051602001612b159190613aa1565b604051602081830303815290604052612f9a565b90506000612b38604f8361386b565b90506000600a8210158015612b4d5750601482105b15612b56575060015b60148210158015612b675750601e82105b15612b70575060025b601e8210158015612b815750602882105b15612b8a575060035b60288210158015612b9b5750603282105b15612ba4575060045b60328210158015612bb55750603c82105b15612bbe575060055b603c8210158015612bcf5750604682105b15612bd8575060065b60468210611bd357506007949350505050565b600080612c0a612bfa84611a9e565b604051602001612b159190613ae6565b90506000612c1960aa8361386b565b90506000602e8210158015612c2e5750604082105b15612c37575060015b60408210158015612c485750605182105b15612c51575060025b60518210158015612c625750605582105b15612c6b575060035b81605503612c77575060045b60568210158015612c885750605882105b15612c91575060055b60588210611bd357506006949350505050565b600080612cc3612cb384611a9e565b604051602001612b159190613b2b565b90506000612cd36101f48361386b565b9050600060298210158015612ce85750605182105b15612cf1575060015b60518210158015612d025750607982105b15612d0b575060025b60798210158015612d1c575060a182105b15612d25575060035b60a18210158015612d36575060c982105b15612d3f575060045b60c98210158015612d51575061010582105b15612d5a575060055b6101058210158015612d6d575061011982105b15612d76575060065b6101198210611bd357506007949350505050565b600080612da9612d9984611a9e565b604051602001612b159190613b63565b90506000612db860f08361386b565b90506000600a8210158015612dcd5750601482105b15612dd6575060015b60148210158015612de75750601e82105b15612df0575060025b601e8210158015612e015750602882105b15612e0a575060035b60288210158015612e1b5750603282105b15612e24575060045b60328210158015612e355750603c82105b15612e3e575060055b603c8210158015612e4f5750604682105b15612e58575060065b60468210158015612e695750605082105b15612e72575060075b60508210158015612e835750605a82105b15612e8c575060085b605a8210158015612e9d5750606482105b15612ea6575060095b60648210158015612eb75750606e82105b15612ec05750600a5b606e8210158015612ed15750607882105b15612eda5750600b5b60788210158015612eeb5750608282105b15612ef45750600c5b60828210611bd35750600d949350505050565b600080612f26612f1684611a9e565b604051602001612b159190613b9b565b90506000612f3560788361386b565b90506000600a8210158015612f4a5750601482105b15612f53575060015b60148210158015612f645750601e82105b15612f6d575060025b601e8210158015612f7e5750602882105b15612f87575060035b60288210611bd357506004949350505050565b600081604051602001612fad9190613be0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6040518061028001604052806014905b6060815260200190600190039081612ff95790505090565b60408051610120810190915260608152600860208201612ff9565b60005b8381101561304757818101518382015260200161302f565b50506000910152565b602081526000825180602084015261306f81604085016020870161302c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156130b357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110ec57600080fd5b600080604083850312156130f157600080fd5b6130fa836130ba565b946020939093013593505050565b803580151581146110ec57600080fd5b60008060006040848603121561312d57600080fd5b833567ffffffffffffffff8082111561314557600080fd5b818601915086601f83011261315957600080fd5b81358181111561316857600080fd5b8760208260051b850101111561317d57600080fd5b6020928301955093506131939186019050613108565b90509250925092565b6000806000606084860312156131b157600080fd5b6131ba846130ba565b92506131c8602085016130ba565b9150604084013590509250925092565b600080604083850312156131eb57600080fd5b6131f4836130ba565b915061320260208401613108565b90509250929050565b60006020828403121561321d57600080fd5b6111a2826130ba565b60008060008060006080868803121561323e57600080fd5b613247866130ba565b9450613255602087016130ba565b935060408601359250606086013567ffffffffffffffff8082111561327957600080fd5b818801915088601f83011261328d57600080fd5b81358181111561329c57600080fd5b8960208285010111156132ae57600080fd5b9699959850939650602001949392505050565b600080604083850312156132d457600080fd5b6132dd836130ba565b9150613202602084016130ba565b600181811c908216806132ff57607f821691505b602082108103613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133cd576133cd61336d565b5060010190565b818103818111156107105761071061336d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561342857600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146111a257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f7b226e616d65223a2022576f726d7a202300000000000000000000000000000081526000845161350f81601185016020890161302c565b7f222c20226465736372697074696f6e223a2022412066756c6c79206f6e2d63686011918401918201527f61696e2067616d65207574696c6973696e672074686520657870657269656d6560318201527f6e74616c20746f6b656e207374616e646172642c204552432d3430342077686960518201527f636820656e61626c65732070657273697374656e74206c69717569646974792060718201527f616e642073656d692d66756e676962696c6974792e2200000000000000000000609182015284516135e48160a784016020890161302c565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360a792909101918201527f6536342c0000000000000000000000000000000000000000000000000000000060c782015283516136488160cb84016020880161302c565b61367a60cb828401017f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136bd81601d85016020870161302c565b91909101601d0192915050565b600181815b8085111561372357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137095761370961336d565b8085161561371657918102915b93841c93908002906136cf565b509250929050565b60008261373a57506001610710565b8161374757506000610710565b816001811461375d576002811461376757613783565b6001915050610710565b60ff8411156137785761377861336d565b50506001821b610710565b5060208310610133831016604e8410600b84101617156137a6575081810a610710565b6137b083836136ca565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137e2576137e261336d565b029392505050565b60006111a260ff84168361372b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613837576138376137f9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008261387a5761387a6137f9565b500690565b808201808211156107105761071061336d565b6000895160206138a58285838f0161302c565b8a51918401916138b88184848f0161302c565b8a519201916138ca8184848e0161302c565b89519201916138dc8184848d0161302c565b88519201916138ee8184848c0161302c565b87519201916139008184848b0161302c565b86519201916139128184848a0161302c565b8551920191613924818484890161302c565b919091019b9a5050505050505050505050565b60008851602061394a8285838e0161302c565b89519184019161395d8184848e0161302c565b895192019161396f8184848d0161302c565b88519201916139818184848c0161302c565b87519201916139938184848b0161302c565b86519201916139a58184848a0161302c565b85519201916139b7818484890161302c565b919091019a9950505050505050505050565b60008a516139db818460208f0161302c565b8a516139ed8183860160208f0161302c565b8a519184010190613a02818360208e0161302c565b8951613a148183850160208e0161302c565b8951929091010190613a2a818360208c0161302c565b8751613a3c8183850160208c0161302c565b8751929091010190613a52818360208a0161302c565b8551613a648183850160208a0161302c565b8551929091010190613a7a81836020880161302c565b019b9a5050505050505050505050565b80820281158282048414176107105761071061336d565b7f4241534520434f4c4f5200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b91909101600a0192915050565b7f4c41594552205448524545000000000000000000000000000000000000000000815260008251613b1e81600b85016020870161302c565b91909101600b0192915050565b7f4c4159455220464f555200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552204649564500000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552205349580000000000000000000000000000000000000000000000815260008251613bd381600985016020870161302c565b9190910160090192915050565b60008251613bf281846020870161302c565b919091019291505056fe227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e3c706174682066696c6c3d22233633383539362220643d224d30203068333076333048307a222f3e207b2274726169745f74797065223a202245796577656172222c2276616c7565223a20225a6f6d626965227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a20225a6f6d626965227d2c2220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d22233030302220643d224d342032347632683136762d32682d3176314835762d3148347a4d36203233483576316831762d317a4d37203232483676316831762d317a4d38203231483776316831762d317a4d39203230483876316831762d317a4d3131203139483976316832762d317a4d31322031307638682d3176316832762d39682d317a4d31342031305639682d31763168317a4d313520385637682d31763268325638682d317a4d31382036682d337631683356367a4d31392037682d317631683156377a4d32312038682d327631683256387a4d32332032325639682d327631683176313268317a4d3231203234762d316831762d31682d32763268317a4d313520313368317631682d31762d317a4d323020313368317631682d31762d317a4d313820313568327631682d32762d317a4d313720313868337631682d33762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e322220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2c202261747472696275746573223a205b7b2274726169745f74797065223a202254797065222c2276616c7565223a2022416c69656e227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022416c69656e227d2c227d2c207b2274726169745f74797065223a20224865616477656172222c2276616c7565223a20224e6f726d616c227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c3c70617468207374726f6b653d22233030302220643d224d31332031312e3568396d2d37203368326d2e352d2e35762d326d32203076326d2e352e3568326d2d372e352d2e35762d32222f3e3c70617468207374726f6b653d22233543333930462220643d224d31352031322e3568326d3320306832222f3e3c70617468207374726f6b653d22234337373531342220643d224d31352031332e3568326d3320306832222f3e3c706174682066696c6c3d22234646443932362220643d224d313220313468317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313320313168397631682d347632682d317631682d32762d31682d31762d32682d31762d317a222f3e3c706174682066696c6c3d22233443344334432220643d224d3133203768397634682d397a222f3e3c706174682066696c6c3d22233030302220643d224d3133203130682d31563868315637683156366837763168327632682d315638682d315637682d377631682d3176327a222f3e3c70617468207374726f6b653d22233633363336332220643d224d313420392e3568316d302d316831222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22234437443144312220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22234537413630302220643d224d32362031382e356831222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e342220643d224d323620313168317635682d317a222f3e3c706174682066696c6c3d22233343433330302220643d224d313420313068377631682d377a222f3e3c706174682066696c6c3d22233030363043332220643d224d313620367634682d345638683156376831563668327a222f3e3c706174682066696c6c3d22234436303430342220643d224d31392036763468345638682d315637682d315636682d327a222f3e3c706174682066696c6c3d22234534454231372220643d224d313420396831563868315636683376326831763168317631682d3756397a222f3e3c706174682066696c6c3d22233030302220643d224d3137203568317631682d317a222f3e3c706174682066696c6c3d22233030363043332220643d224d3135203468357631682d357a222f3e3c706174682066696c6c3d22234630463046302220643d224d31322031316831317634682d39762d33682d32762d317a222f3e3c706174682066696c6c3d22234644333233322220643d224d313920313268337632682d337a222f3e3c706174682066696c6c3d22233332384446442220643d224d313520313268337632682d337a222f3e3c70617468207374726f6b653d22234136364532432220643d224d31362e35203230762d326d332e352d2e35682d336d332e352e357632222f3e3c70617468207374726f6b653d22234332383934362220643d224d31362031372e3568316d3320306831222f3e3c706174682066696c6c3d22233030302220643d224d3133203133762d3168397633682d32762d32682d337632682d32762d32682d327a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031372e3568376d312031682d316d302031682d37222f3e3c70617468207374726f6b653d22233539353935392220643d224d32302031382e356836222f3e3c70617468207374726f6b653d22233030343046462220643d224d32362031382e356831222f3e3c706174682066696c6c3d22233030302220643d224d313320326839763168317635683176316831763148313056396831563868315633683156327a222f3e3c706174682066696c6c3d22234443314431442220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233531353135312220643d224d3133203668397634682d3956367a222f3e3c70617468207374726f6b653d22233030302220643d224d31322031302e356831322e3556396d2d2e352d2e35682d386d302031682d316d382d32682d316d302d31682d316d302d31682d376d302031682d316d2d2e352e357633222f3e3c70617468207374726f6b653d22233335333533352220643d224d323420392e35682d386d2d312d33682d316d302031682d31222f3e3c70617468207374726f6b653d22233030302220643d224d313220342e3568326d34203068356d2d3134203168316d3220306831306d32203068326d2d313720316831366d2d313620316831376d2d313620316831356d2d3136203168396d32203068356d2d3137203168376d32203068326d32203068336d2d3134203168346d39203068326d2d3136203168356d39203068326d2d3136203168316d31203068336d392e352d2e3576324d31302031342e3568346d2d3420316832222f3e3c706174682066696c6c3d22233030302220643d224d313620313968317631682d317a222f3e3c706174682066696c6c3d22233344324631452220643d224d392039683156386833563668315634683156336835763168317632683176326833763168317631483956397a222f3e3c706174682066696c6c3d22233030302220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d2223666666222066696c6c2d6f7061636974793d222e352220643d224d313420313268337633682d337a4d313920313268337633682d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031316831317632682d31762d31682d347631682d32762d31682d337631682d31762d327a222f3e3c706174682066696c6c3d22233141343343382220643d224d313320376839763348313076334839762d3348385639683556377a222f3e3c70617468207374726f6b653d22233136333741342220643d224d323220392e35682d316d302031682d336d302d31682d346d382e352d2e3556376d2d2e352d2e35682d386d302031682d316d302031682d316d302031682d316d302031682d316d302d314839222f3e3c70617468207374726f6b653d22233134324337432220643d224d31312031312e35682d316d322d31682d316d322d31682d31222f3e3c706174682066696c6c3d22233739344231312220643d224d382037683176316834563468315633683276316833563368327631683176346834563768317632682d31763148395639483856377a222f3e3c706174682066696c6c3d22233530324630352220643d224d3132203768313176314831327a222f3e3c706174682066696c6c3d22233030302220643d224d3134203756356831563468317631683156346831763168315634683176316831763268317632682d337631682d317631682d31762d31682d315639682d33563768317a4d31322039763168315639682d317a222f3e3c706174682066696c6c3d22234338464246422220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c70617468207374726f6b653d22233735424442442220643d224d31352e3520313276316d352d317631222f3e3c706174682066696c6c3d22233030302220643d224d3231203139762d31682d35763168357a4d31352031336831762d3168317631682d317631682d31762d317a4d323120313268317631682d317631682d31762d316831762d317a222f3e3c706174682066696c6c3d22233942453045302220643d224d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3139203134682d3176336831762d337a222f3e3c706174682066696c6c3d22233030302220643d224d31332031326831317632682d317631682d32762d31682d31762d31682d327631682d317631682d32762d31682d31762d31682d31762d317a222f3e3c70617468207374726f6b653d22233030302220643d224d32302031382e3568316d30203168316d30203168316d30203168312e35762d3268345632326d2d31203076316d2d2e352e35682d346d302d31682d316d302d31682d316d302d31682d316d302d31682d31222f3e3c70617468207374726f6b653d22233835353131342220643d224d32302031392e3568316d30203168316d30203168316d30203168336d2d312d3268336d2d3220316831222f3e3c70617468207374726f6b653d22233638334330382220643d224d32352032312e3568316d30203168316d302d316831222f3e3c70617468207374726f6b653d222366666622207374726f6b652d6f7061636974793d222e342220643d224d32362e3520313276312e356d3020304832356d312e3520304832384d32362e3520313576316d3020317631222f3e3c706174682066696c6c3d22233631353033442220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d222339353841374422207374726f6b653d22233935384137442220643d224d31362e352031392e35762d31682d31762d316831762d32682d31762d31682d31762d336832762d316833763168327634682d31763268317631682d317631682d347a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3136203133682d3176316831762d317a4d3231203133682d3176316831762d317a4d3138203136762d31682d31763168317a4d313720313876316833762d31682d337a4d31392e373234203136762d31682d31763168317a222f3e3c706174682066696c6c3d22234141413139372220643d224d3137203134682d31762d31683176317a4d3232203134682d31762d31683176317a222f3e3c706174682066696c6c3d22233236333134412220643d224d3132203568313176354831327a222f3e3c70617468207374726f6b653d22236666662220643d224d313320382e3568316d31203068316d31203068316d31203068316d3120306831222f3e3c70617468207374726f6b653d22234646443830302220643d224d313720362e356831222f3e3c706174682066696c6c3d2223303030222066696c6c2d72756c653d226576656e6f64642220643d224d323320365635682d345634682d337631682d347631682d317632683176326833763168395639682d31563868315636682d317a6d302030682d345635682d337631682d34763268317631683156386831763268385639682d315638683156367a6d2d37203368315638682d3176317a6d32203068315638682d3176317a6d32203068315638682d3176317a2220636c69702d72756c653d226576656e6f6464222f3e3c706174682066696c6c3d22234234423442342220643d224d313420313168397634682d397a222f3e3c70617468207374726f6b653d22233030302220643d224d31342031352e3568386d2d382d3568384d31332e3520313476316d31302d3476346d2d31302d3476316d32202e3576316836762d31682d367a222f3e3c70617468207374726f6b653d22233844384438442220643d224d31332e3520313276326d31203076316d302d3476316d382d3176316d3020327631222f3e3c706174682066696c6c3d22233831313942372220643d224d3132203768315636683156356837763168317632683376316831763148313256377a222f3e3c70617468207374726f6b653d22234232363144432220643d224d323120372e35682d316d302d31682d31222f3e3c706174682066696c6c3d22233744413236392220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a4d3136203134682d3176316831762d317a4d3231203134682d3176316831762d317a4d3138203139682d3176316831762d317a222f3e3c706174682066696c6c3d227265642220643d224d313520313368317631682d31762d317a4d323020313368317631682d31762d317a222f3e3c706174682066696c6c3d22233030302220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a4d3230203136762d31682d32763168327a4d313720313876316833762d31682d337a222f3e3c706174682066696c6c3d22233030302220643d224d313620313768317631682d317a222f3e3c706174682066696c6c3d22233030302220643d224d313420313168317631682d317a4d313520313068317631682d317a4d3138203968317633682d317a4d3132203968367631682d367a4d313320313068317631682d317a4d313120313068317631682d317a4d3131203868337631682d337a4d3132203768327631682d327a4d3133203668327631682d327a4d3134203568367631682d367a4d3231203568317632682d317a4d3231203768337631682d337a4d323120313068337631682d337a4d3230203868337632682d337a4d3135203768347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3137203668347632682d347a222f3e3c706174682066696c6c3d22233030302220643d224d3134203668347633682d347a222f3e3c70617468207374726f6b653d22233030302220643d224d313420352e3568366d31203068316d2d39203168396d2d313020316831326d2d3133203168386d31203068336d2d3131203168376d31203068336d2d3132203168316d31203068316d31203068316d2d32203168316d332e352d312e3576326d322e352d312e356833222f3e3c706174682066696c6c3d22234341344531312220643d224d31342037682d31763368395637682d315636682d3776317a222f3e3c706174682066696c6c3d22233933333730392220643d224d313220386831317632682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d315639682d317631682d3156387a222f3e3c70617468207374726f6b653d22233030302220643d224d31312e3520313056386d31203056376d31203056366d2e352d2e3568376d2e352e3576316d31203076316d3120307632222f3e000000000000000000000000b680082e0424ec0818b4201d0cc3e59378915d9d

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101cf5760003560e01c8063644c43b411610104578063b0d1b56f116100a2578063dd62ed3e11610071578063dd62ed3e14610458578063e985e9c514610483578063f2fde38b146104b1578063fc66ed84146104c457600080fd5b8063b0d1b56f14610417578063b88d4fde1461041f578063bbb1471314610432578063c87b56dd1461044557600080fd5b806395d89b41116100de57806395d89b41146103c65780639b19251a146103ce578063a22cb465146103f1578063a9059cbb1461040457600080fd5b8063644c43b41461037d57806370a08231146103865780638da5cb5b146103a657600080fd5b80632b968958116101715780634f02c4201161014b5780634f02c4201461032957806353d6fd591461033257806356ba88b8146103455780636352211e1461036a57600080fd5b80632b968958146102d5578063313ce567146102dd57806342842e0e1461031657600080fd5b806318160ddd116101ad57806318160ddd146102705780631e6b6ab3146102a55780632311930b146102ba57806323b872dd146102c257600080fd5b806306fdde03146101d4578063081812fc146101f2578063095ea7b31461024d575b600080fd5b6101dc6104d1565b6040516101e99190613050565b60405180910390f35b6102286102003660046130a1565b60066020526000908152604090205473ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b61026061025b3660046130de565b61055f565b60405190151581526020016101e9565b6102977f00000000000000000000000000000000000000000000043c33c193756480000081565b6040519081526020016101e9565b6102b86102b3366004613118565b610716565b005b6102b86108a4565b6102b86102d036600461319c565b61091f565b6102b8610e0b565b6103047f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff90911681526020016101e9565b6102b861032436600461319c565b610eb0565b61029760035481565b6102b86103403660046131d8565b610fe9565b605d5461022890610100900473ffffffffffffffffffffffffffffffffffffffff1681565b6102286103783660046130a1565b611090565b610297605c5481565b61029761039436600461320b565b60046020526000908152604090205481565b6000546102289073ffffffffffffffffffffffffffffffffffffffff1681565b6101dc6110f1565b6102606103dc36600461320b565b600b6020526000908152604090205460ff1681565b6102b86103ff3660046131d8565b6110fe565b6102606104123660046130de565b611195565b6102b86111a9565b6102b861042d366004613226565b611227565b61022861044036600461320b565b61134e565b6101dc6104533660046130a1565b611538565b6102976104663660046132c1565b600560209081526000928352604080842090915290825290205481565b6102606104913660046132c1565b600760209081526000928352604080842090915290825290205460ff1681565b6102b86104bf36600461320b565b6115de565b605d546102609060ff1681565b600180546104de906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461050a906132eb565b80156105575780601f1061052c57610100808354040283529160200191610557565b820191906000526020600020905b81548152906001019060200180831161053a57829003601f168201915b505050505081565b600060035482111580156105735750600082115b156106a35760008281526008602052604090205473ffffffffffffffffffffffffffffffffffffffff163381148015906105de575073ffffffffffffffffffffffffffffffffffffffff8116600090815260076020908152604080832033845290915290205460ff16155b15610615576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008381526006602090815260409182902080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8881169182179092559251868152908416917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35061070c565b33600081815260056020908152604080832073ffffffffffffffffffffffffffffffffffffffff881680855290835292819020869055518581529192917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a35b5060015b92915050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610767576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b42600d54116107d7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f677265796c697374206f7665720000000000000000000000000000000000000060448201526064015b60405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560005b8281101561089e5781600c60008686858181106108245761082461333e565b9050602002016020810190610839919061320b565b73ffffffffffffffffffffffffffffffffffffffff168152602081019190915260400160002080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055806108968161339c565b915050610805565b50505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146108f5576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600e80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b6003548111610d645760008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff848116911614610988576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166109d5576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff841614801590610a2c575073ffffffffffffffffffffffffffffffffffffffff8316600090815260076020908152604080832033845290915290205460ff16155b8015610a5c575060008181526006602052604090205473ffffffffffffffffffffffffffffffffffffffff163314155b15610a93576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a9b6116ec565b73ffffffffffffffffffffffffffffffffffffffff841660009081526004602052604081208054909190610ad09084906133d4565b90915550610ade90506116ec565b73ffffffffffffffffffffffffffffffffffffffff808416600081815260046020908152604080832080549096019095558582526008815284822080547fffffffffffffffffffffffff000000000000000000000000000000000000000090811690941790556006815284822080549093169092559186168252600990529081208054610b6d906001906133d4565b81548110610b7d57610b7d61333e565b600091825260208083209091015473ffffffffffffffffffffffffffffffffffffffff87168352600982526040808420868552600a90935290922054815492935083928110610bce57610bce61333e565b600091825260208083209091019290925573ffffffffffffffffffffffffffffffffffffffff86168152600990915260409020805480610c1057610c106133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255838252600a81526040808320548484528184205573ffffffffffffffffffffffffffffffffffffffff8616808452600983529083208054600181810183558286529385200186905592529054610c9f91906133d4565b6000838152600a6020526040808220929092559051839173ffffffffffffffffffffffffffffffffffffffff80871692908816917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a48273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487610d4d6116ec565b60405190815260200160405180910390a350505050565b73ffffffffffffffffffffffffffffffffffffffff831660009081526005602090815260408083203384529091529020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610df857610dc682826133d4565b73ffffffffffffffffffffffffffffffffffffffff851660009081526005602090815260408083203384529091529020555b610e0384848461171e565b50505b505050565b60005473ffffffffffffffffffffffffffffffffffffffff163314610e5c576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560405133907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3565b610ebb83838361091f565b73ffffffffffffffffffffffffffffffffffffffff82163b15801590610fb257506040517f150b7a020000000000000000000000000000000000000000000000000000000080825233600483015273ffffffffffffffffffffffffffffffffffffffff858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015610f69573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f8d9190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e06576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60005473ffffffffffffffffffffffffffffffffffffffff16331461103a576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff919091166000908152600b6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055565b60008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff16806110ec576040517fc5723b5100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600280546104de906132eb565b33600081815260076020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168085529083529281902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b60006111a233848461171e565b9392505050565b60005473ffffffffffffffffffffffffffffffffffffffff1633146111fa576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055565b61123285858561091f565b73ffffffffffffffffffffffffffffffffffffffff84163b1580159061131757506040517f150b7a02000000000000000000000000000000000000000000000000000000008082529073ffffffffffffffffffffffffffffffffffffffff86169063150b7a02906112af9033908a90899089908990600401613458565b6020604051808303816000875af11580156112ce573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112f29190613416565b7fffffffff000000000000000000000000000000000000000000000000000000001614155b15610e03576040517f3da6393100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000805473ffffffffffffffffffffffffffffffffffffffff1633146113a0576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b605d5460ff161561140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f67617264656e206c6f636b65642100000000000000000000000000000000000060448201526064016107ce565b605d54610100900473ffffffffffffffffffffffffffffffffffffffff161561149e57605d805473ffffffffffffffffffffffffffffffffffffffff61010091829004811660009081526004602090815260408083208390559454939093049091168152600b9091522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b50605d805473ffffffffffffffffffffffffffffffffffffffff9283166101008181027fffffffffffffffffffffff0000000000000000000000000000000000000000ff9093169290921783556000908152600b6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055605c546004909252909120559054041690565b60606000611545836119f1565b9050600061159561155585611a9e565b61155e84611bdb565b61156f61156a8661214c565b6125d8565b604051602001611581939291906134d7565b6040516020818303038152906040526125d8565b9050806040516020016115a89190613685565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052949350505050565b60005473ffffffffffffffffffffffffffffffffffffffff16331461162f576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811661167c576040517f49e27cff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83169081178255604051909133917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60006117197f0000000000000000000000000000000000000000000000000000000000000012600a6137ea565b905090565b6000806117296116ec565b73ffffffffffffffffffffffffffffffffffffffff8087166000818152600460205260408082208054948a168352908220549282529394509192909186919061177283866133d4565b909155505073ffffffffffffffffffffffffffffffffffffffff86166000908152600460205260409020805486019055600e5460ff16801561180a575073ffffffffffffffffffffffffffffffffffffffff87166000908152600c602052604090205460ff16158061180a575073ffffffffffffffffffffffffffffffffffffffff86166000908152600c602052604090205460ff16155b15611841576040517f82b4290000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166000908152600b602052604090205460ff166118de5773ffffffffffffffffffffffffffffffffffffffff871660009081526004602052604081205461189f908590613828565b6118a98585613828565b6118b391906133d4565b905060005b818110156118db576118c9896127b5565b806118d38161339c565b9150506118b8565b50505b73ffffffffffffffffffffffffffffffffffffffff86166000908152600b602052604090205460ff1661197d5760006119178483613828565b73ffffffffffffffffffffffffffffffffffffffff8816600090815260046020526040902054611948908690613828565b61195291906133d4565b905060005b8181101561197a576119688861296d565b806119728161339c565b915050611957565b50505b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fe59fdd36d0d223c0c7d996db7ad796880f45e1936cb0bb7ac102e7082e031487876040516119dc91815260200190565b60405180910390a35060019695505050505050565b611a236040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a556040518060a0016040528060008152602001600081526020016000815260200160008152602001600081525090565b611a5e83612af6565b8152611a6983612beb565b6020820152611a7783612ca4565b6040820152611a8583612d8a565b6060820152611a9383612f07565b608082015292915050565b606081600003611ae157505060408051808201909152600181527f3000000000000000000000000000000000000000000000000000000000000000602082015290565b8160005b8115611b0b5780611af58161339c565b9150611b049050600a83613828565b9150611ae5565b60008167ffffffffffffffff811115611b2657611b2661383c565b6040519080825280601f01601f191660200182016040528015611b50576020820181803683370190505b5090505b8415611bd357611b656001836133d4565b9150611b72600a8661386b565b611b7d90603061387f565b60f81b818381518110611b9257611b9261333e565b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350611bcc600a86613828565b9450611b54565b949350505050565b6060611be5612fe9565b6040518060600160405280603181526020016140276031913981526020830151600303611c2b57604051806060016040528060348152602001613cd96034913960208201525b8260200151600403611c56576040518060600160405280603281526020016140586032913960408201525b8260200151600503611c81576040518060600160405280602e81526020016140dd602e913960608201525b600383602001511080611c98575060058360200151115b15611dc7576040518060600160405280602b81526020016140b2602b91396080820152602083015160179060078110611cd357611cd361333e565b018054611cdf906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0b906132eb565b8015611d585780601f10611d2d57610100808354040283529160200191611d58565b820191906000526020600020905b815481529060010190602001808311611d3b57829003601f168201915b505050505081600560148110611d7057611d7061333e565b60200201819052506040518060400160405280600381526020017f227d2c000000000000000000000000000000000000000000000000000000000081525081600660148110611dc157611dc161333e565b60200201525b604051806060016040528060248152602001613cb56024913960e0820152604083015160259060088110611dfd57611dfd61333e565b018054611e09906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611e35906132eb565b8015611e825780601f10611e5757610100808354040283529160200191611e82565b820191906000526020600020905b815481529060010190602001808311611e6557829003601f168201915b505050505081600860148110611e9a57611e9a61333e565b602002018190525060405180606001604052806028815260200161408a602891396101208201526060830151603590600e8110611ed957611ed961333e565b018054611ee5906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611f11906132eb565b8015611f5e5780601f10611f3357610100808354040283529160200191611f5e565b820191906000526020600020905b815481529060010190602001808311611f4157829003601f168201915b505050505081600a60148110611f7657611f7661333e565b6020020181905250604051806060016040528060298152602001613bfd60299139610160820152608083015160519060058110611fb557611fb561333e565b018054611fc1906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611fed906132eb565b801561203a5780601f1061200f5761010080835404028352916020019161203a565b820191906000526020600020905b81548152906001019060200180831161201d57829003601f168201915b505050505081600c601481106120525761205261333e565b60200201819052506040518060400160405280600581526020017f227d5d2c2000000000000000000000000000000000000000000000000000000081525081600d601481106120a3576120a361333e565b602090810291909101919091528151828201516040808501516060860151608087015160a088015160c089015160e08a015195516000996120e79998979101613892565b604080518083037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0018152908290526101008401516101208501516101408601516101608701516101808801516101a08901519597506115a896889690602001613937565b6060612156613011565b6040518060c00160405280608f8152602001613c26608f9139815260408051808201909152600c81527f3c706174682066696c6c3d220000000000000000000000000000000000000000602082015281600160200201528251600f90600881106121c2576121c261333e565b0180546121ce906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546121fa906132eb565b80156122475780601f1061221c57610100808354040283529160200191612247565b820191906000526020600020905b81548152906001019060200180831161222a57829003601f168201915b50505050508160026009811061225f5761225f61333e565b6020020181905250604051806102e001604052806102a58152602001613d0d6102a5913960608201526020830151601e90600781106122a0576122a061333e565b0180546122ac906132eb565b80601f01602080910402602001604051908101604052809291908181526020018280546122d8906132eb565b80156123255780601f106122fa57610100808354040283529160200191612325565b820191906000526020600020905b81548152906001019060200180831161230857829003601f168201915b50505050508160046009811061233d5761233d61333e565b60200201526040830151602d906008811061235a5761235a61333e565b018054612366906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612392906132eb565b80156123df5780601f106123b4576101008083540402835291602001916123df565b820191906000526020600020905b8154815290600101906020018083116123c257829003601f168201915b5050505050816005600981106123f7576123f761333e565b60200201526060830151604390600e81106124145761241461333e565b018054612420906132eb565b80601f016020809104026020016040519081016040528092919081815260200182805461244c906132eb565b80156124995780601f1061246e57610100808354040283529160200191612499565b820191906000526020600020905b81548152906001019060200180831161247c57829003601f168201915b5050505050816006600981106124b1576124b161333e565b60200201526080830151605690600581106124ce576124ce61333e565b0180546124da906132eb565b80601f0160208091040260200160405190810160405280929190818152602001828054612506906132eb565b80156125535780601f1061252857610100808354040283529160200191612553565b820191906000526020600020905b81548152906001019060200180831161253657829003601f168201915b50505050508160076009811061256b5761256b61333e565b6020020181905250604051806060016040528060358152602001613fb260359139610100820181905281516020808401516040808601516060870151608088015160a089015160c08a015160e08b0151955160009a6115a89a9996979596949593949293929091016139c9565b805160609060008190036125fc575050604080516020810190915260008152919050565b6000600361260b83600261387f565b6126159190613828565b612620906004613a8a565b9050600061262f82602061387f565b67ffffffffffffffff8111156126475761264761383c565b6040519080825280601f01601f191660200182016040528015612671576020820181803683370190505b5090506000604051806060016040528060408152602001613fe7604091399050600181016020830160005b868110156126fd576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b83526004909201910161269c565b5060038606600181146127175760028114612761576127a7565b7f3d3d0000000000000000000000000000000000000000000000000000000000007ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe8301526127a7565b7f3d000000000000000000000000000000000000000000000000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8301525b505050918152949350505050565b73ffffffffffffffffffffffffffffffffffffffff8116612802576040517fddb5de5e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff811660009081526009602052604081208054612835906001906133d4565b815481106128455761284561333e565b90600052602060002001549050600960008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208054806128a0576128a06133e7565b6000828152602080822083017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff908101839055909201909255828252600a815260408083208390556008825280832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600690925280832080549092169091555182919073ffffffffffffffffffffffffffffffffffffffff8516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b73ffffffffffffffffffffffffffffffffffffffff81166129ba576040517f9c8d2cd200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600380546001019081905560008181526008602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612a21576040517f23369fa600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600081815260086020908152604080832080547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8716908117909155808452600983529083208054600181810183558286529385200185905592529054612a9e91906133d4565b6000828152600a6020526040808220929092559051829173ffffffffffffffffffffffffffffffffffffffff8516917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b600080612b29612b0584611a9e565b604051602001612b159190613aa1565b604051602081830303815290604052612f9a565b90506000612b38604f8361386b565b90506000600a8210158015612b4d5750601482105b15612b56575060015b60148210158015612b675750601e82105b15612b70575060025b601e8210158015612b815750602882105b15612b8a575060035b60288210158015612b9b5750603282105b15612ba4575060045b60328210158015612bb55750603c82105b15612bbe575060055b603c8210158015612bcf5750604682105b15612bd8575060065b60468210611bd357506007949350505050565b600080612c0a612bfa84611a9e565b604051602001612b159190613ae6565b90506000612c1960aa8361386b565b90506000602e8210158015612c2e5750604082105b15612c37575060015b60408210158015612c485750605182105b15612c51575060025b60518210158015612c625750605582105b15612c6b575060035b81605503612c77575060045b60568210158015612c885750605882105b15612c91575060055b60588210611bd357506006949350505050565b600080612cc3612cb384611a9e565b604051602001612b159190613b2b565b90506000612cd36101f48361386b565b9050600060298210158015612ce85750605182105b15612cf1575060015b60518210158015612d025750607982105b15612d0b575060025b60798210158015612d1c575060a182105b15612d25575060035b60a18210158015612d36575060c982105b15612d3f575060045b60c98210158015612d51575061010582105b15612d5a575060055b6101058210158015612d6d575061011982105b15612d76575060065b6101198210611bd357506007949350505050565b600080612da9612d9984611a9e565b604051602001612b159190613b63565b90506000612db860f08361386b565b90506000600a8210158015612dcd5750601482105b15612dd6575060015b60148210158015612de75750601e82105b15612df0575060025b601e8210158015612e015750602882105b15612e0a575060035b60288210158015612e1b5750603282105b15612e24575060045b60328210158015612e355750603c82105b15612e3e575060055b603c8210158015612e4f5750604682105b15612e58575060065b60468210158015612e695750605082105b15612e72575060075b60508210158015612e835750605a82105b15612e8c575060085b605a8210158015612e9d5750606482105b15612ea6575060095b60648210158015612eb75750606e82105b15612ec05750600a5b606e8210158015612ed15750607882105b15612eda5750600b5b60788210158015612eeb5750608282105b15612ef45750600c5b60828210611bd35750600d949350505050565b600080612f26612f1684611a9e565b604051602001612b159190613b9b565b90506000612f3560788361386b565b90506000600a8210158015612f4a5750601482105b15612f53575060015b60148210158015612f645750601e82105b15612f6d575060025b601e8210158015612f7e5750602882105b15612f87575060035b60288210611bd357506004949350505050565b600081604051602001612fad9190613be0565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152919052805160209091012092915050565b6040518061028001604052806014905b6060815260200190600190039081612ff95790505090565b60408051610120810190915260608152600860208201612ff9565b60005b8381101561304757818101518382015260200161302f565b50506000910152565b602081526000825180602084015261306f81604085016020870161302c565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000602082840312156130b357600080fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146110ec57600080fd5b600080604083850312156130f157600080fd5b6130fa836130ba565b946020939093013593505050565b803580151581146110ec57600080fd5b60008060006040848603121561312d57600080fd5b833567ffffffffffffffff8082111561314557600080fd5b818601915086601f83011261315957600080fd5b81358181111561316857600080fd5b8760208260051b850101111561317d57600080fd5b6020928301955093506131939186019050613108565b90509250925092565b6000806000606084860312156131b157600080fd5b6131ba846130ba565b92506131c8602085016130ba565b9150604084013590509250925092565b600080604083850312156131eb57600080fd5b6131f4836130ba565b915061320260208401613108565b90509250929050565b60006020828403121561321d57600080fd5b6111a2826130ba565b60008060008060006080868803121561323e57600080fd5b613247866130ba565b9450613255602087016130ba565b935060408601359250606086013567ffffffffffffffff8082111561327957600080fd5b818801915088601f83011261328d57600080fd5b81358181111561329c57600080fd5b8960208285010111156132ae57600080fd5b9699959850939650602001949392505050565b600080604083850312156132d457600080fd5b6132dd836130ba565b9150613202602084016130ba565b600181811c908216806132ff57607f821691505b602082108103613338577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036133cd576133cd61336d565b5060010190565b818103818111156107105761071061336d565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60006020828403121561342857600080fd5b81517fffffffff00000000000000000000000000000000000000000000000000000000811681146111a257600080fd5b600073ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015260806060830152826080830152828460a0840137600060a0848401015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f85011683010190509695505050505050565b7f7b226e616d65223a2022576f726d7a202300000000000000000000000000000081526000845161350f81601185016020890161302c565b7f222c20226465736372697074696f6e223a2022412066756c6c79206f6e2d63686011918401918201527f61696e2067616d65207574696c6973696e672074686520657870657269656d6560318201527f6e74616c20746f6b656e207374616e646172642c204552432d3430342077686960518201527f636820656e61626c65732070657273697374656e74206c69717569646974792060718201527f616e642073656d692d66756e676962696c6974792e2200000000000000000000609182015284516135e48160a784016020890161302c565b7f22696d616765223a2022646174613a696d6167652f7376672b786d6c3b62617360a792909101918201527f6536342c0000000000000000000000000000000000000000000000000000000060c782015283516136488160cb84016020880161302c565b61367a60cb828401017f227d000000000000000000000000000000000000000000000000000000000000815260020190565b979650505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516136bd81601d85016020870161302c565b91909101601d0192915050565b600181815b8085111561372357817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137095761370961336d565b8085161561371657918102915b93841c93908002906136cf565b509250929050565b60008261373a57506001610710565b8161374757506000610710565b816001811461375d576002811461376757613783565b6001915050610710565b60ff8411156137785761377861336d565b50506001821b610710565b5060208310610133831016604e8410600b84101617156137a6575081810a610710565b6137b083836136ca565b807fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048211156137e2576137e261336d565b029392505050565b60006111a260ff84168361372b565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600082613837576138376137f9565b500490565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60008261387a5761387a6137f9565b500690565b808201808211156107105761071061336d565b6000895160206138a58285838f0161302c565b8a51918401916138b88184848f0161302c565b8a519201916138ca8184848e0161302c565b89519201916138dc8184848d0161302c565b88519201916138ee8184848c0161302c565b87519201916139008184848b0161302c565b86519201916139128184848a0161302c565b8551920191613924818484890161302c565b919091019b9a5050505050505050505050565b60008851602061394a8285838e0161302c565b89519184019161395d8184848e0161302c565b895192019161396f8184848d0161302c565b88519201916139818184848c0161302c565b87519201916139938184848b0161302c565b86519201916139a58184848a0161302c565b85519201916139b7818484890161302c565b919091019a9950505050505050505050565b60008a516139db818460208f0161302c565b8a516139ed8183860160208f0161302c565b8a519184010190613a02818360208e0161302c565b8951613a148183850160208e0161302c565b8951929091010190613a2a818360208c0161302c565b8751613a3c8183850160208c0161302c565b8751929091010190613a52818360208a0161302c565b8551613a648183850160208a0161302c565b8551929091010190613a7a81836020880161302c565b019b9a5050505050505050505050565b80820281158282048414176107105761071061336d565b7f4241534520434f4c4f5200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b91909101600a0192915050565b7f4c41594552205448524545000000000000000000000000000000000000000000815260008251613b1e81600b85016020870161302c565b91909101600b0192915050565b7f4c4159455220464f555200000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552204649564500000000000000000000000000000000000000000000815260008251613ad981600a85016020870161302c565b7f4c41594552205349580000000000000000000000000000000000000000000000815260008251613bd381600985016020870161302c565b9190910160090192915050565b60008251613bf281846020870161302c565b919091019291505056fe227d2c207b2274726169745f74797065223a20224163636573736f7279222c2276616c7565223a20223c7376672069643d22782220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d22302030203330203330223e3c706174682066696c6c3d22233633383539362220643d224d30203068333076333048307a222f3e207b2274726169745f74797065223a202245796577656172222c2276616c7565223a20225a6f6d626965227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a20225a6f6d626965227d2c2220643d224d3232203130763132682d327632682d3176314835762d316831762d316831762d316831762d316831762d316832762d316832762d396831563968325638682d31563768337631683176316832763168317a222f3e3c706174682066696c6c3d22233030302220643d224d342032347632683136762d32682d3176314835762d3148347a4d36203233483576316831762d317a4d37203232483676316831762d317a4d38203231483776316831762d317a4d39203230483876316831762d317a4d3131203139483976316832762d317a4d31322031307638682d3176316832762d39682d317a4d31342031305639682d31763168317a4d313520385637682d31763268325638682d317a4d31382036682d337631683356367a4d31392037682d317631683156377a4d32312038682d327631683256387a4d32332032325639682d327631683176313268317a4d3231203234762d316831762d31682d32763268317a4d313520313368317631682d31762d317a4d323020313368317631682d31762d317a4d313820313568327631682d32762d317a4d313720313868337631682d33762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e322220643d224d3137203133682d3176316831762d317a4d3232203133682d3176316831762d317a222f3e3c706174682066696c6c3d2223303030222066696c6c2d6f7061636974793d222e342220643d224d3137203132682d3276316832762d317a4d323020313276316832762d31682d327a4d3232203231682d397631683176316836762d316832762d317a4d3132203139682d3176366832762d31682d31762d357a4d3130203235762d354839763568317a4d38203235762d334837763368317a4d36203234483576316831762d317a222f3e3c7374796c653e23787b73686170652d72656e646572696e673a20637269737065646765733b7d3c2f7374796c653e3c2f7376673e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f2c202261747472696275746573223a205b7b2274726169745f74797065223a202254797065222c2276616c7565223a2022416c69656e227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022416c69656e227d2c227d2c207b2274726169745f74797065223a20224865616477656172222c2276616c7565223a20224e6f726d616c227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c207b2274726169745f74797065223a20224d6f757468222c2276616c7565223a2022417065227d2c

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

000000000000000000000000b680082e0424ec0818b4201d0cc3e59378915d9d

-----Decoded View---------------
Arg [0] : _owner (address): 0xB680082e0424ec0818b4201d0cc3e59378915d9d

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000b680082e0424ec0818b4201d0cc3e59378915d9d


Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]

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