ETH Price: $2,530.29 (-4.09%)

Token

OnChain Sands (SND)
 

Overview

Max Total Supply

4,959 SND

Holders

1,394

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 SND
0xf3eb7fb785ed6b2a997d5e81c1602550c07d1b2f
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

5000 beautiful views, completely generated OnChain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OnChainSands

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 15 : sand.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/utils/math/SafeMath.sol";

contract OnChainSands is ERC721, ERC721Enumerable, Ownable {
    using Counters for Counters.Counter;
    using SafeMath for uint256;

    Counters.Counter private _tokenIdCounter;
    uint private constant maxTokensPerTransaction = 30;
    uint256 private tokenPrice = 30000000000000000; //0.03 ETH
    uint256 private constant nftsNumber = 5000;
    uint256 private constant nftsPublicNumber = 4950;
    
    constructor() ERC721("OnChain Sands", "SND") {
        _tokenIdCounter.increment();
    }
    

     function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
    function safeMint(address to) public onlyOwner {
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    // The following functions are overrides required by Solidity.

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input)));
    }
    
    function toHashCode(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "000000";
        }
        uint256 i;

        bytes memory buffer = "000000";
        for(i=6;i>0;i--) {
            if (value % 16 < 10)
                buffer[i-1] = bytes1(uint8(48 + uint256(value % 16)));
            else
                buffer[i-1] = bytes1(uint8(55 + uint256(value % 16)));

            value /= 16;
        }
        return string(buffer);
    }
    
    
    
    function getFarObject(uint256 num) internal pure returns (string memory) {
        string[4] memory far;
        
        far[0] ='M431.741,537.724 371.85,467.096 321.582,517.364 254.859,442.361 160.11,537.109';
        far[1] ='M191,556l219-2l-99-117L191,556z';
        far[2] ='M244,557 238,488 248,488 238,413 298,398 296,389 424,407 401,484 391,487 383,555';
        far[3] ='M209,511c0-0,36-8,36-8 s10-1,11-1s17-15,17-16s0-6,0-6l19-0v-6h9l1-6h4v-1 h67v2h5v4c0,0,11-1,11,0s0,8,0,8h20v6l18,18h7v10v70H209 L209,511z';

        return far[num-1];
    }
    
    function getSun(uint256 num) internal pure returns (string memory) {
        uint256 suns;
        uint256 suns_m;

        suns_m = 650299126634312082;
        suns = 709260192684279125512259162535278106613289157619291124044823099706295099;
        if (num >= 8) {
            suns = num == 8 ? suns_m : suns_m / 1000000000;
        } else {
            if (num > 0)
                suns = suns / (1000 ** (num*3));
        }

        string memory output = string(abi.encodePacked('cx="',toString((suns/1000000)%1000),'" cy="',toString((suns/1000)%1000),  '" r="',toString(suns%1000),'"'));
        
        return output;
    }
//this feature is just for fun, it's pointless.
 function getCamel(uint256 num) internal pure returns (string memory) {
        uint256[50] memory xtypes;
        uint256 pos;

        uint256 i;
        uint256 temp;
        uint256 sym;
        uint256 lines;

        xtypes[0] = 2750871777490806264085493004602956112481215626846361120;
// Elon Musk is a poser
        xtypes[1] = 24031940146303221873185246330856176777890234172085460524828847635091787832103;
        xtypes[2] = 4369554406778136407906521031351492442121714090311337998835645029932110349922;
        xtypes[3] = 35339669699060465125668189898147169548632576962648599291375229098669428362322;
        xtypes[4] = 672238645676028630017590070904525;

        xtypes[11] = 37599700675902714367317740679304042296080055052422520140113640294389393350439;
        xtypes[12] = 38087302781903350862724587794493881498317283716547227642212787098338845152311;
        xtypes[13] = 1114275929128553399568145623741250323077119217211655860047041411166003561237;
        xtypes[14] = 44483940829496349223937135327653774303045114145795750475934727822431742908025;
        xtypes[15] = 1301031010810467202189960410466201454370628906584976487492660977313;
        

        xtypes[21] = 24511554605809013553427690817438832449166603887000346203695542442847542862631;
        xtypes[22] = 24712231507965098789272277915974614596914779217528115716846960336470200999989;
        xtypes[23] = 31779261119830188930260713981005416210882557915559935577937916313743035255330;
        xtypes[24] = 30845749996097297930742408311135328346981512733480170301818670564314058110498;
        xtypes[25] = 4393324743237794958108912339045511528520735357988065415454558326487042311245;
        xtypes[26] = 4383618393247594429327385840719100733921976757672061077695343950821928420434;
        xtypes[27] = 28260977779972716408629221197954496518888178178346784762024000144425;
// I wrote that because I'm jealous of his billions
        xtypes[31] = 33981201337895841066299736423112852304759862823304893271895015697500599799591;
        xtypes[32] = 38092437674498035584450155165625035089506200894468052066380022772320589009972;
        xtypes[33] = 1002964437672768398493084675030519774534336229557529541653364574576256516854;
        xtypes[34] = 41202914189462662695915620887590875333337880836299726911136825280773640739640;
        xtypes[35] = 40993983140047288513282733679841254915488686784624912185639295148702690920129;
        xtypes[36] = 43462155136449166491448379421314888609432193428547199763947083681431896678423;
        xtypes[37] = 3091541931616987385254478349605488253295528003625843124585170727615066703541;
        xtypes[38] = 42893843881028951002600077923910138109116652418088673519145098082818520534773;
        xtypes[39] = 35790225028626312902234269550783631619805539570794490376389285434126321176320;
        xtypes[40] = 23946826271475684407;
// and the fact that he's sexy
        xtypes[41] = 32696238382569806469557342148762393436204618157687364688486249358066242446087;
        xtypes[42] = 30829847781535805781250327403060765435737126585110613555906562372477089399884;
        xtypes[43] = 2322370439730553613354915887410243625117939153279733562435129926126979548749;
        xtypes[44] = 3077242879332650009073929722759956366751482431073885344923252432370954176881;
        xtypes[45] = 35126784166904065671947169645446477285741344117817602589955598641710815590065;
        xtypes[46] = 2978473281905248387737881203435264718697731825484007630263831601596209749570;
        xtypes[47] = 542357;

        bytes memory buffer = new bytes(500);
        temp = xtypes[1];
        pos=0;
        for(lines=1;lines<=10;lines++) {
            if (xtypes[10*(num-1) + lines] == 0)
                break;
            temp = xtypes[10*(num-1) + lines];
            for(i=0;i<=50;i++) {
                if (temp==0)
                    break;
                sym = temp%32;
                temp /= 32;
                buffer[pos++] = bytes1(uint8((xtypes[0]/(128**sym))%128));
            }
        }
        
        bytes memory buffer2 = new bytes(pos);
        for(i=0;i<pos;i++)
            buffer2[i] = buffer[i];

        return string(buffer2);
    }
    // programmers are the coolest people.
    function getDune1(uint256 num) internal pure returns (string memory) {
        string[2] memory dune;
        
            dune[0] = 'M-68,1082l1157,6l-19-577c0,0-39-6-117-6 s-102,8-185,16s-118,8-183,8s-181-21-331-21s-286,42-286,42 L-68,1082z';
            dune[1] = 'M1089,1015l-1157,5l19-478c0,0,42-15,119-22 c77-6,173-8,255,0c82,9,159,12,225,12s188-14,338-14 s165,33,165,33L1089,1015z';

        return dune[num-1];
    }
    
    // and humble. 
    function getDune2(uint256 num) internal pure returns (string memory) {
        string[4] memory dune;
        
            dune[0] = 'M-39,1013l1181,40c0,0-18-502-77-485 c-185,52-250-23-416-5c-77,8-148,29-324-22S-61,574-61,614 L-39,1013z';
            dune[1] = 'M1140,1013l-1181,40c0,0-37-507,23-496c189,34,315-4,482,13 c77,8,205,51,391-21c170-66,270,61,273,69L1140,1013z';
            dune[2] = 'M-39,1016l1181,40c0,0-18-502-77-485 c-185,52-211-40-377-22c-77,8-203,37-380,25 c-182-12-327,14-330,22L-39,1016z';
            dune[3] = 'M1142,1016l-1181,40c0,0-66-554-9-530 c181,77,299,26,464,33c77,3,207,45,382,14 c180-32,327,14,330,22L1142,1016z';

        return dune[num-1];
    }
    
    
     function tokenURI(uint256 tokenId) pure public override(ERC721)  returns (string memory) {
        uint256[17] memory xtypes;
        string[5] memory colors;
        string[4] memory dune3;
        string[4] memory dune31;
        string[4] memory dune32;

        string[27] memory parts;
        uint256[12] memory params;
        string[6] memory obj1;
        string[6] memory obj2;

        uint256 pos;

        uint256 rand = random(string(abi.encodePacked('Sand',toString(tokenId))));

        params[0] = 1 + ((rand/10) % 5);// camel=
        params[1] = 1 + ((rand/1000) % 33); // pallette=
        params[2] = 1 + ((rand/10000) % 4); // dune main
        params[3] = 1 + ((rand/10000) % 2); // dune top
        params[4] = 1 + ((rand/100000) % 4); // dune bottom
        params[5] = 1 + ((rand/1000000000) % 4); // pyr=
        params[6] = 1 + ((rand/10000000000) % 5); // obj=
        params[7] = 1 + ((rand/100000000) % 5); // sun

        
        obj1[0] = 'M128,897c4,1,8,6,15,7 c8-5,15-11,20-17c0-2,1-5,1-6c0-0,0-0,0-0 c0-0,0-0,0-0c2-3,5-4,7-3c0-0,0-1,1-1 c-2-2-8-1-12,4c-3,5-6,6-6,6c-2,0-3,0-4,0 c-0-0-0-0-0-0c-0-2-3-4-6-4l-0-2l-3,1l0,2 c-2,1-3,4-2,7c0,0,0,0,0,0c-4,1-11,2-16,2 c-8-0-8,6-8,6l9-2C125,896,127,896,128,897z';
        obj1[1] = 'M177,903 214,864 186,888 177,872 181,892 167,904 160,889 168,880 158,885 140,842 152,878 134,874 154,884 164,915 171,915 175,905 190,903';
        obj1[2] = 'M173,924l-2-9l-8-4l-5-9 l-0,11l-7,3l-0,3l-16,13l2,3l6-0l10-0l2-2l3,1l7-1 l1-2l4-1l10,3L173,924z';
        obj1[3] = 'M102,924c42,0,79-13,96-32 l-1-10l-19-6l-9,4l-6-6l-20-11l-11,3l-1,37l-8,5l-6-2 l-8,2l-5,17C100,924,101,924,102,924z';
        obj1[4] = 'M196,909l-27-60l2-3l-2-2 l2-1l-7-3l0,6l-14,16l1,11l0-9l13-11l2,0l2,5 l-2,44l3-7l0,3l2-30l0,1c0,7,2,21,2,21 c0-0,0-9,0-14l13,34L196,909z';

        obj2[0] = 'M176,873c0,0-92,25-89,38 c3,13,43,1,56-8C157,895,176,873,176,873z';
        obj2[1] = 'M135,907 164,913 164,915 171,915 145,929 112,932 145,925 160,916 151,912 145,914 147,911';
        obj2[2] = 'M164,927 159,927 155,929 155,931 141,931 140,930 150,922 139,929 138,929 133,933 137,932 134,935 155,931 155,932 158,934 163,932 166,930';
        obj2[3] = 'M188,900l-14-21l-4,1 c0,0,7,19,7,20c-0,0-6,1-6,1l-18-6l-2-17l-3,13l-8-21 l-3,2l0,13l-43,12l-6,9l-43,6l-6,6l67,1l9-0 C142,922,170,913,188,900z';
        obj2[4]= 'M189,905 100,921 96,944 107,925 196,909';
// Frank Herbert is a genius.
        dune3[0] = 'M789.651,612.665c-75.205-13.229-180.045,29.189-247.215,32.078c-67.168,2.892-214.902-55.596-254.981-57.02c-80.609-2.861-205.862,94.49-292.672,100.213c-15.255,1.007-30.625-0.204-46.191-2.981v364.425l1091.444-8.328V687.689C964.066,678.827,883.855,629.24,789.651,612.665z';
        dune3[1] = 'M-132,707c93-1,328-89,431-72 c102,17,188,72,270,68c81-4,199-87,275-85s268,142,268,142 v254H-98L-132,707z';
        dune3[2] = 'M1231.049,614.778c-106.1-3.109-270.963,102.704-385.223,108.925c-114.258,6.229-233.418-65.354-377.06-87.139c-99.948-15.158-239.281,33.44-328.552,36.751c-89.269,3.313-285.609-63.696-338.877-65.326c-107.132-3.277-14.89,534.698-14.89,534.698l1120.001-20.622C906.449,1122.064,1337.147,617.889,1231.049,614.778z';
        dune3[3] = 'M-47.384,729.587l16.5,334.482H1082.06l-7.499-400.48c0,0-143.994,46.509-293.986,48.009c-138.278,1.383-269.985-73.507-410.979-102.005S-47.384,729.587-47.384,729.587';

        dune31[0] =  'M730.696,695.521c-14.66-64.234,54.479-83.549,53.738-83.668c-74.773-10.486-176.365,30.068-241.998,32.891c-65.18,2.806-206.219-52.184-251.139-56.739c10.547,3.674,18.777,12.776,20.959,31.223c5.711,48.342-25.114,246.768-200.632,410.215l572.048,6.992h0.246c157.754-55.303,336.631-126.377,336.631-164.342C1020.549,804.177,747.467,768.968,730.696,695.521z';
        dune31[1] =  'M569,702 c-81,4-167-51-270-68c-90-14-282,51-391,68l-6,301l0,8h750 C841,871,874,687,868,644c-2-15-9-23-19-26c-1-0-2-0-3-0 C769,615,651,698,569,702z';
        dune31[2] =  'M390.417,731.489c-19.484-73.591,72.4-95.72,71.42-95.854c-99.376-12.017-234.395,34.446-321.621,37.682c-54.263,2.01-148.083-21.957-225.287-41.429c5.73,98.433,58.558,405.557,495.521,392.111c96.733-2.977,150.2,2.841,173.166,14.275c110.086-40.351,192.021-78.959,192.021-104.494C775.637,855.974,412.705,815.635,390.417,731.489z';
        dune31[3] =  'M1143.557,771.596C842.766,774.434,590.294,994.69,563.871,1018.5H281.277c219.414-27.692,269.289-134.762,270.71-200.116c1.5-68.996-181.491-76.496-295.484-116.994c-107.063-38.035,57.096-89.3,77.455-95.395C186.829,603.571-47.384,729.587-47.384,729.587l14.307,321.913l1176.634,27.58C1143.557,1079.08,1461.541,768.596,1143.557,771.596z';

        dune32[0] = 'M312.256,619.224c-2.186-18.486-10.448-27.592-21.027-31.25c-1.286-0.119-2.543-0.203-3.773-0.246c-80.611-2.863-205.862,94.489-292.671,100.211c-15.255,1.007-30.627-0.204-46.193-2.981v369.479H83.292C283.871,886.871,318.262,670.06,312.256,619.224z';
        dune32[1] = 'M296,634 c-104-14-335,72-428,73l33,306h296c150-49,320-113,320-147 c0-60-259-92-275-158C229,651,283,636,296,634z';
        dune32[2] = '';
        dune32[3] = '';

// His War of the Worlds is a masterpiece.

        xtypes[0] = 438473426514619468937593363674906600980101972218980261389738755026321310;
        xtypes[1] = 1528428735494740386746687706769036728542265312936553054402188188078571243;
        xtypes[2] = 1576159433658212066304323894815932062177799089437395523990699050641915806;
        xtypes[3] = 1638277479168345925933593678264841420808332802796276121428815506753716126;
        xtypes[4] = 1482277213785937432487838137602393875317079519468030334287176488800222955;
        xtypes[5] = 569254049910285240562266942057277174170434705955446158280559749706542294;
        xtypes[6] = 695961355261660318153968727586838433117983201812599465335857818068058111;
        xtypes[7] = 1499951127606893309180610179916526153806597374206025036948893607141571007;
        xtypes[8] = 1487975643258097207966143169235216509055880303550960490725369271497513569;
        xtypes[9] = 893871907223691020346594411790439061317907470229888515211998968157829111;
        xtypes[10] = 1456322660702981972363882139452691332072845879862426480408917545756655090;
        xtypes[11] = 1414100953265237643112910920600703942226523030837917351177428632577495874;
        xtypes[12] = 1412526850302830771701738382967853559447456676243931652623233627352724185;
        xtypes[13] = 956176030089680310714094738241368283497248873645169781803481032958345082;
        xtypes[14] = 407203048447432245888292259364249687668615656070679106091707478370827939;
        xtypes[15] = 720473443048720196433395035253138729115353664155452813862022957330631299;
        xtypes[16] = 1219326055746586710817491577091388615;
    
        pos = (params[1]-1) * 5;
        colors[0] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216);
    
        pos = (params[1]-1) * 5 + 1;
        colors[1] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216);
        
        pos = (params[1]-1) * 5 + 2;
        colors[2] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216);
        
        pos = (params[1]-1) * 5 + 3;
        colors[3] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216);
        
        pos = (params[1]-1) * 5 + 4;
        colors[4] = toHashCode(xtypes[pos/10] / (16777216 ** (pos%10)) % 16777216);
        
// Who's stronger, the camel or the Bedouin?        
        
        parts[0] = '<svg version="1.1" id="Layer_2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="1000px" height="1000px" viewBox="0 0 1000 1000" enable-background="new 0 0 1000 1000" xml:space="preserve"> <linearGradient id="mainGradient" gradientUnits="userSpaceOnUse" x1="-162.3992" y1="118.0994" x2="-162.3993" y2="1117.9104" gradientTransform="matrix(1 0 0 -1 662.3999 1118.0991)"> <stop offset="0.64" style="stop-color:#'; // 2
        parts[1] = '"/> <stop offset="1" style="stop-color:#'; // 3
        parts[2] = '"/> </linearGradient> <rect x="0.001" y="0.189" fill="url(#mainGradient)" width="1000" height="1000"/> <circle opacity="0.1" fill="#'; // 1
        parts[3] = string(abi.encodePacked('" cx="44" cy="823" r="99"/> <radialGradient id="sunGradient" ',getSun(params[7]*2-2),' gradientUnits="userSpaceOnUse"> <stop offset="0.7" style="stop-color:#')); // 1
        parts[4] = '"/> <stop offset="1" style="stop-color:#'; // 2
        parts[5] = string(abi.encodePacked('"/> </radialGradient> <circle opacity="0.8" fill="url(#sunGradient)" ',getSun(params[7]*2-2),'/>')); // 1
        parts[6] = ''; // 1
        parts[7] = ''; // 2
        parts[8] = ''; // 1
        parts[9] = ''; // 1
        parts[10] = ''; // 2
        parts[11] = ''; // 1
        parts[12] = ''; // 1
        parts[13] = ''; // 2
        parts[14] = '<g> <path opacity="0.11" fill="#'; // 1
        parts[15] = '" d="M668,423c0,0,313-0,303-28 c-10-28-397-48,15-46c301,2,196,46,460,43 c258-3,484-60,485-17c1,43-290,24-290,50s288,9,478,12 c189,3,341-83,535-26c194,56,322,32,517,5 c194-27,140,0,427,0c287,0,1180,0,1180,0v-31H3607c0,0-137-11-283-10 c-146,0-162,33-394-7c-232-41-312-43-420-24 c-107,18-255,68-395,74s-397,18-398,7c-1-10,447-26,446-65 c-1-38-176-42-391-25c-215,16-395-14-568-19 c-172-4-626-8-627,25s323,25,322,50c-0,9-593,3-593,3H-36v27 h478C442,421,553,423,668,423z"/> <path opacity="0.11" fill="#'; // 1
        parts[16] = '" d="M668,404c0,0,322,12,312-15 c-10-28-804-56,8-62c301-2,239,37,503,34 c258-3,565-42,569,1c2,29-381,32-417,61 c-23,18,273,12,470,7c189-5,513-94,714-52 c212,44,184,46,379,18c194-27,188,1,475,1c287,0,1096,0,1096,0 v-20c0,0-1102,0-1175,0s-137-13-284-13c-146,0-161,25-393-16 c-232-41-315-31-422-12c-107,18-250,68-389,74s-432,24-432,13 c0-13,458-25,473-71c12-37-172-54-387-38 c-215,16-395-14-568-19c-172-4-620,7-621,41 c-1,34,319,32,321,51c0,9-598-12-598-12H-36v27h478 C442,403,553,404,668,404z"/> <animateMotion path="M 0 0 L -3750 40 Z" dur="250s" repeatCount="indefinite" /> </g> <path opacity="0.25" fill="#'; // 5
        parts[17] = string(abi.encodePacked('" d="',getFarObject(params[5]),'"/> <path fill="#')); // 5
        parts[18] = string(abi.encodePacked('" d="',getDune1(params[3]),'"/> <g> <path fill="#')); // 4
        parts[19] = string(abi.encodePacked('" d="',getCamel(params[0]),'"/> <animateMotion path="m 0 0 h -5000" dur="2500s" repeatCount="indefinite" /> </g> <path fill="#')); // 4
        parts[20] = string(abi.encodePacked('" d="',getDune2(params[4]),'"/> <path fill="#')); // 2
        parts[21] = string(abi.encodePacked('" d="',dune3[params[2]-1],'"/> <linearGradient id="sandGradient" gradientUnits="userSpaceOnUse" x1="-1424" y1="658" x2="-456" y2="658" gradientTransform="matrix(1 0 0 1 1324.7998 158.1992)"> <stop offset="0" style="stop-color:#')); // 2
        parts[22] = '"/> <stop offset="0.8" style="stop-color:#'; // 3
        parts[23] = string(abi.encodePacked('"/> </linearGradient> <path opacity="0.35" fill="url(#sandGradient)" d="',dune31[params[2]-1],'"/> <path opacity="0.35" fill="#')); // 3
        parts[24] = string(abi.encodePacked('" d="',dune32[params[2]-1],'"/> <path opacity="0.1" fill="#')); // 3
        parts[25] = string(abi.encodePacked('" d="',obj2[params[6]-1],'"/> <path opacity="0.4" fill="#')); // 3
        parts[26] = string(abi.encodePacked('" d="',obj1[params[6]-1],'"/> </svg> '));

// Stronger is the earthworm.

        string memory output = string(abi.encodePacked(parts[0],colors[1],parts[1],colors[2],parts[2]));
        output = string(abi.encodePacked(output,colors[0],parts[3],colors[0],parts[4],colors[1] ));
         
        output = string(abi.encodePacked(output,parts[5],colors[0],parts[6],colors[0] ));
         
        output = string(abi.encodePacked(output,parts[7],colors[1],parts[8],colors[0]));
         
        output = string(abi.encodePacked(output,parts[9],colors[0],parts[10],colors[1] ));
        output = string(abi.encodePacked(output,parts[11],colors[0],parts[12],colors[0]));
        output = string(abi.encodePacked(output,parts[13],colors[1],parts[14],colors[0] ));
        output = string(abi.encodePacked(output,parts[15],colors[0],parts[16],colors[4]));
        output = string(abi.encodePacked(output,parts[17],colors[4],parts[18],colors[3] ));
        output = string(abi.encodePacked(output,parts[19],colors[3],parts[20],colors[1]));
        
        output = string(abi.encodePacked(output,parts[21],colors[1],parts[22],colors[2]));
        output = string(abi.encodePacked(output,parts[23],colors[2],parts[24],colors[2]));
        output = string(abi.encodePacked(output,parts[25],colors[2],parts[26]));

// please don't scold me for the quality of my code, I've been programming in PHP for 10 years
        
        string[11] memory aparts;
        aparts[0] = '[{ "trait_type": "Main", "value": "';
        aparts[1] = toString(params[0]);
        aparts[2] = '" }, { "trait_type": "Palette", "value": "';
        aparts[3] = toString(params[1]);
        aparts[4] = '" }, { "trait_type": "Near Object", "value": "';
        aparts[5] = toString(params[6]);
        aparts[6] = '" }, { "trait_type": "Far Object", "value": "';
        aparts[7] = toString(params[5]);
        aparts[8] = '" }, { "trait_type": "Sun", "value": "';
        aparts[9] = toString(params[7]);
        aparts[10] = '" }]';
// they're going to make me squeeze Doom into the next collection
// help...
        string memory strparams = string(abi.encodePacked(aparts[0], aparts[1], aparts[2], aparts[3], aparts[4], aparts[5]));
        strparams = string(abi.encodePacked(strparams, aparts[6], aparts[7], aparts[8], aparts[9], aparts[10]));

// they made me write this code

        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "OnChain Sands", "description": "Beautiful views, completely generated OnChain","attributes":', strparams, ', "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }
    
    function claimdQw4w9WgXcQ() public  {
        require(_tokenIdCounter.current() <= 500, "Tokens number to mint exceeds number of public tokens");
        _safeMint(msg.sender, _tokenIdCounter.current());
        _tokenIdCounter.increment();

    }
    // why are you reading this? is there something between us?
    function withdraw() public onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

// they won't fall for it a second time
    function buySands(uint tokensNumber) public payable {
        require(tokensNumber > 0, "Wrong amount");
        require(tokensNumber <= maxTokensPerTransaction, "Max tokens per transaction number exceeded");
        require(_tokenIdCounter.current().add(tokensNumber) <= nftsPublicNumber, "Tokens number to mint exceeds number of public tokens");
        require(tokenPrice.mul(tokensNumber) <= msg.value, "Ether value sent is too low");

        for(uint i = 0; i < tokensNumber; i++) {
            _safeMint(msg.sender, _tokenIdCounter.current());
            _tokenIdCounter.increment();
        }
    }

    
}




/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

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

        // Add some extra buffer at the end
        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 2 of 15 : SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 3 of 15 : Counters.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 4 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 5 of 15 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 6 of 15 : ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 7 of 15 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 8 of 15 : ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 9 of 15 : Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

File 10 of 15 : Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

File 11 of 15 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 12 of 15 : IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 13 of 15 : IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

File 14 of 15 : IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

File 15 of 15 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"buySands","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claimdQw4w9WgXcQ","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052666a94d74f430000600c553480156200001c57600080fd5b50604080518082018252600d81526c4f6e436861696e2053616e647360981b60208083019182528351808501909452600384526214d39160ea1b9084015281519192916200006d916000916200011c565b508051620000839060019060208401906200011c565b505050620000a06200009a620000bd60201b60201c565b620000c1565b620000b7600b6200011360201b62001f2d1760201c565b620001ff565b3390565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b80546001019055565b8280546200012a90620001c2565b90600052602060002090601f0160209004810192826200014e576000855562000199565b82601f106200016957805160ff191683800117855562000199565b8280016001018555821562000199579182015b82811115620001995782518255916020019190600101906200017c565b50620001a7929150620001ab565b5090565b5b80821115620001a75760008155600101620001ac565b600181811c90821680620001d757607f821691505b60208210811415620001f957634e487b7160e01b600052602260045260246000fd5b50919050565b615f7f806200020f6000396000f3fe6080604052600436106101405760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610365578063aaf492a314610385578063b88d4fde1461039a578063c87b56dd146103ba578063e985e9c5146103da578063f2fde38b1461042357600080fd5b80634f6ccce7146102bd5780636352211e146102dd57806370a08231146102fd578063715018a61461031d5780638da5cb5b1461033257806395d89b411461035057600080fd5b806323b872dd1161010857806323b872dd146102155780632f745c591461023557806330ffc9e3146102555780633ccfd60b1461026857806340d097c31461027d57806342842e0e1461029d57600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806318160ddd146101f6575b600080fd5b34801561015157600080fd5b506101656101603660046138a5565b610443565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610454565b60405161017191906141f3565b3480156101a857600080fd5b506101bc6101b73660046138df565b6104e6565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461387b565b610580565b005b34801561020257600080fd5b506008545b604051908152602001610171565b34801561022157600080fd5b506101f4610230366004613727565b610696565b34801561024157600080fd5b5061020761025036600461387b565b6106c7565b6101f46102633660046138df565b61075d565b34801561027457600080fd5b506101f46108d2565b34801561028957600080fd5b506101f46102983660046136d9565b61092b565b3480156102a957600080fd5b506101f46102b8366004613727565b610973565b3480156102c957600080fd5b506102076102d83660046138df565b61098e565b3480156102e957600080fd5b506101bc6102f83660046138df565b610a21565b34801561030957600080fd5b506102076103183660046136d9565b610a98565b34801561032957600080fd5b506101f4610b1f565b34801561033e57600080fd5b50600a546001600160a01b03166101bc565b34801561035c57600080fd5b5061018f610b55565b34801561037157600080fd5b506101f461038036600461383f565b610b64565b34801561039157600080fd5b506101f4610c29565b3480156103a657600080fd5b506101f46103b5366004613763565b610c6e565b3480156103c657600080fd5b5061018f6103d53660046138df565b610ca6565b3480156103e657600080fd5b506101656103f53660046136f4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561042f57600080fd5b506101f461043e3660046136d9565b611e95565b600061044e82611f36565b92915050565b606060008054610463906144c3565b80601f016020809104026020016040519081016040528092919081815260200182805461048f906144c3565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058b82610a21565b9050806001600160a01b0316836001600160a01b031614156105f95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055b565b336001600160a01b0382161480610615575061061581336103f5565b6106875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055b565b6106918383611f5b565b505050565b6106a03382611fc9565b6106bc5760405162461bcd60e51b815260040161055b906142e2565b6106918383836120c0565b60006106d283610a98565b82106107345760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161055b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000811161079c5760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8185b5bdd5b9d60a21b604482015260640161055b565b601e8111156108005760405162461bcd60e51b815260206004820152602a60248201527f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d62656044820152691c88195e18d95959195960b21b606482015260840161055b565b61135661081682610810600b5490565b9061226b565b11156108345760405162461bcd60e51b815260040161055b90614258565b600c543490610843908361227e565b11156108915760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420697320746f6f206c6f770000000000604482015260640161055b565b60005b818110156108ce576108ae336108a9600b5490565b61228a565b6108bc600b80546001019055565b806108c6816144fe565b915050610894565b5050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161055b906142ad565b6040514790339082156108fc029083906000818181858888f193505050501580156108ce573d6000803e3d6000fd5b600a546001600160a01b031633146109555760405162461bcd60e51b815260040161055b906142ad565b610962816108a9600b5490565b610970600b80546001019055565b50565b61069183838360405180602001604052806000815250610c6e565b600061099960085490565b82106109fc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161055b565b60088281548110610a0f57610a0f61456f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061044e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161055b565b60006001600160a01b038216610b035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161055b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b495760405162461bcd60e51b815260040161055b906142ad565b610b5360006122a4565b565b606060018054610463906144c3565b6001600160a01b038216331415610bbd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6101f4610c35600b5490565b1115610c535760405162461bcd60e51b815260040161055b90614258565b610c60336108a9600b5490565b610b53600b80546001019055565b610c783383611fc9565b610c945760405162461bcd60e51b815260040161055b906142e2565b610ca0848484846122f6565b50505050565b6060610cb06135b6565b610cb86135d5565b610cc06135fc565b610cc86135fc565b610cd06135fc565b610cd8613616565b610ce0613631565b610ce8613650565b610cf0613650565b600080610d23610cff8e612329565b604051602001610d0f919061418a565b604051602081830303815290604052612427565b90506005610d32600a8361434b565b610d3c9190614519565b610d47906001614333565b85526021610d576103e88361434b565b610d619190614519565b610d6c906001614333565b60208601526004610d7f6127108361434b565b610d899190614519565b610d94906001614333565b60408601526002610da76127108361434b565b610db19190614519565b610dbc906001614333565b60608601526004610dd0620186a08361434b565b610dda9190614519565b610de5906001614333565b60808601526004610dfa633b9aca008361434b565b610e049190614519565b610e0f906001614333565b60a08601526005610e256402540be4008361434b565b610e2f9190614519565b610e3a906001614333565b60c08601526005610e4f6305f5e1008361434b565b610e599190614519565b610e64906001614333565b60e08601526040805161014081019091526101098082526157ba602083013984526040805160c081019091526088808252614785602083013984600160200201819052506040518060800160405280605f81526020016148a9605f9139604080860191909152805160a08101909152607280825261480d602083013960608501526040805160c081019091526087808252614f5a602083013960808086019190915260408051918201905260418082526154816020830139835260408051608081019091526058808252615c75602083013983600160200201819052506040518060c00160405280608881526020016150ec60889139604080850191909152805160c08101909152608d80825261566e60208301396060808501919091526040805191820190526027808252615e6b6020830139608084015260408051610140810190915261010b808252614fe1602083013989526040805160a0810190915260688082526145b2602083013989600160200201819052506040518061016001604052806101318152602001615ccd61013191396040808b0191909152805160e0810190915260a2808252614cf8602083013960608a015260408051610180810190915261015c808252615b19602083013988526040805160c081019091526092808252615eb8602083013988600160200201819052506040518061018001604052806101418152602001614bb761014191396040808a019190915280516101808101909152610149808252614e116020830139606089015260408051610120810190915260f28082526154c2602083013987526040805160a08101909152606f808252614b2560208301396020888101919091526040805180830182526000808252828b0191909152815180840183529081526060808b01919091527d3f87e2204da90013704fa4ffebfafff2a140ba0000ba0000ffc64fffff9e8e527ddd74929a3a93560094ffd28afffeebdd74929a3a93560094ff9191fffeeb8e8401527de45f00ae3000780000ff7700ffff9ee47946ae3c23780000ff9757ffff9e918e01919091527ded5f16ca300ba60000ff771cffff9ed55f178230462f0075ff7700ffff9e908d01527dd6c4b7b395888f6559e3cfbdfffeebedb688ca7d56a64324ffd3a1fffeeb60808d01527d527ace653d9a7800664898e8d6fffbd2713ca5382578000ee88d48ffecd660a08d01527d64d6a432836d0031367dffc0ffff9ee4b478ae5a6f780066ffe17dffffff60c08d01527dd954478c2a463f0045ff6947fff9bfd2a75a7754671d0073ffd154fff9bf60e08d01527dd79815864c0a360000ffbe19ffedb0d92a228c15333f0045ff3419ffda616101008d01527d81838d404664000a3ba1a1a1f7f7f78096c14d4b7e1a003b9abbe3f7f7f76101208d01527dd302027c0101240000ff0303ffcb21c5ce92626c67000a3bf6ffa8fffdf26101408d01527dcce3eb66acc2007599ffffff8bb6c7d846088923113b001aff5703ffd3426101608d01527dcca98866565c000330ffd29efff7e8b64ed15e2776060019e261fffff2d96101808d01527d8a8a8a454545000000adadadffffff74bd713a6e52001f3391e581f2ff7a6101a08d01527d3b00002200000a0000470000a3000024003912001c0000002d0047523ea36101c08d01527d6863d863328a5e003c6b7cff59005000373a006062008a8a002226008a836101e08d01526eead56a7f5e542a0042ffec6efff4c76102008d015285015161136b90600190614469565b61137690600561444a565b91506113d3630100000061138b600a85614519565b6113999063010000006143a2565b8d6113a5600a8761434b565b601181106113b5576113b561456f565b60200201516113c4919061434b565b6113ce9190614519565b612458565b8a5260208501516113e690600190614469565b6113f190600561444a565b6113fc906001614333565b9150611411630100000061138b600a85614519565b6020808c019190915285015161142990600190614469565b61143490600561444a565b61143f906002614333565b9150611454630100000061138b600a85614519565b60408b0152602085015161146a90600190614469565b61147590600561444a565b611480906003614333565b9150611495630100000061138b600a85614519565b60608b015260208501516114ab90600190614469565b6114b690600561444a565b6114c1906004614333565b91506114d6630100000061138b600a85614519565b60808b01526040805161020081019091526101cd8082526158c360208301398652604080516060810190915260288082526146cc602083013986600160200201819052506040518060c001604052806084815260200161461a60849139604087015261156060028660075b602002015161155190600261444a565b61155b9190614469565b612577565b6040516020016115709190613efe565b60408051808303601f190181529181526060808901929092528051918201905260288082526146cc602083013960808701526115af6002866007611541565b6040516020016115bf9190613fc6565b60408051601f1981840301815291815260a0880191909152805160208082018352600080835260c08a01929092528251808201845282815260e08a0152825180820184528281526101008a0152825180820184528281526101208a0152825180820184528281526101408a0152825180820184528281526101608a0152825180820184528281526101808a0152825180820184529182526101a0890191909152815180830183528181527f3c673e203c70617468206f7061636974793d22302e3131222066696c6c3d2223818301526101c0890152815161022081019092526101f080835290614935908301396101e087015260408051610280810190915261025f808252615222602083013961020087015260a08501516116e090612665565b6040516020016116f09190613c55565b60408051808303601f19018152919052610220870152606085015161171490612732565b6040516020016117249190613c9e565b60408051808303601f19018152919052610240870152845161174590612790565b6040516020016117559190613e52565b60408051808303601f19018152919052610260870152608085015161177990612e97565b6040516020016117899190613c55565b60408051808303601f1901815291815261028088019190915285015189906117b390600190614469565b600481106117c3576117c361456f565b60200201516040516020016117d89190613d2e565b60408051808303601f190181529181526102a0880191909152805160608101909152602a8082526146f460208301396102c08701526040850151889061182090600190614469565b600481106118305761183061456f565b60200201516040516020016118459190613b08565b60408051808303601f190181529181526102e0880191909152850151879061186f90600190614469565b6004811061187f5761187f61456f565b60200201516040516020016118949190613c00565b60408051808303601f1901815291905261030087015260c085015183906118bd90600190614469565b600681106118cd576118cd61456f565b60200201516040516020016118e29190613bab565b60408051808303601f1901815291905261032087015260c0850151849061190b90600190614469565b6006811061191b5761191b61456f565b60200201516040516020016119309190613ceb565b60408051808303601f19018152918152610340880191909152865160208c810151818a01518e8501518b860151955160009661196f9695909101613997565b60408051601f198184030181529190529050808b6000602002015188600360200201518d600060200201518a600460200201518f600160200201516040516020016119bf96959493929190613a02565b60408051808303601f190181529082905260a08901518d5160c08b01519294506119f0938593908290602001613997565b60408051601f1981840301815291905290508087600760200201518c6001602002015189600860200201518e60006020020151604051602001611a37959493929190613997565b60408051601f1981840301815291905290508087600960200201518c6000602002015189600a60200201518e60016020020151604051602001611a7e959493929190613997565b60408051808303601f19018152908290526101608901518d516101808b0151929450611ab1938593908290602001613997565b60408051601f1981840301815291905290508087600d60200201518c6001602002015189600e60200201518e60006020020151604051602001611af8959493929190613997565b60408051601f1981840301815291905290508087600f60200201518c6000602002015189601060200201518e60046020020151604051602001611b3f959493929190613997565b60408051601f1981840301815291905290508087601160200201518c6004602002015189601260200201518e60036020020151604051602001611b86959493929190613997565b60408051601f1981840301815291905290508087601360200201518c6003602002015189601460200201518e60016020020151604051602001611bcd959493929190613997565b60408051601f1981840301815291905290508087601560200201518c6001602002015189601660200201518e60026020020151604051602001611c14959493929190613997565b60408051808303601f190181528282526102e08a0151918e01516103008b0151919450611c4993859392908290602001613997565b60408051808303601f190181528282526103208a0151918e01516103408b0151919450611c7c9385939290602001613940565b6040516020818303038152906040529050611c9561366a565b604051806060016040528060238152602001614b94602391398152611cc18760005b6020020151612329565b81600160200201819052506040518060600160405280602a815260200161487f602a91396040820152611cf5876001611cb7565b606080830191909152604080519182019052602e80825261469e60208301396080820152611d24876006611cb7565b60a08201526040805160608101909152602d808252614908602083013960c0820152611d51876005611cb7565b60e082015260408051606081019091526026808252615e926020830139610100820152611d7f876007611cb7565b610120820152604080518082018252600481526322207d5d60e01b602080830191909152610140840191909152825181840151838501516060860151608087015160a08801519651600097611dd697909101613a02565b60408051808303601f190181529082905260c084015160e0850151610100860151610120870151610140880151949650611e1595879590602001613a02565b60405160208183030381529060405290506000611e5a82611e3586612f1f565b604051602001611e4692919061404b565b604051602081830303815290604052612f1f565b905080604051602001611e6d9190614145565b6040516020818303038152906040529350839f50505050505050505050505050505050919050565b600a546001600160a01b03163314611ebf5760405162461bcd60e51b815260040161055b906142ad565b6001600160a01b038116611f245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055b565b610970816122a4565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061044e575061044e82613085565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9082610a21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166120425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161055b565b600061204d83610a21565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d846104e6565b6001600160a01b0316145b806120b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120d382610a21565b6001600160a01b03161461213b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161055b565b6001600160a01b03821661219d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161055b565b6121a88383836130d5565b6121b3600082611f5b565b6001600160a01b03831660009081526003602052604081208054600192906121dc908490614469565b90915550506001600160a01b038216600090815260036020526040812080546001929061220a908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122778284614333565b9392505050565b6000612277828461444a565b6108ce8282604051806020016040528060008152506130e0565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123018484846120c0565b61230d84848484613113565b610ca05760405162461bcd60e51b815260040161055b90614206565b60608161234d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123775780612361816144fe565b91506123709050600a8361434b565b9150612351565b60008167ffffffffffffffff81111561239257612392614585565b6040519080825280601f01601f1916602001820160405280156123bc576020820181803683370190505b5090505b84156120b8576123d1600183614469565b91506123de600a86614519565b6123e9906030614333565b60f81b8183815181106123fe576123fe61456f565b60200101906001600160f81b031916908160001a905350612420600a8661434b565b94506123c0565b60008160405160200161243a9190613924565b60408051601f19818403018152919052805160209091012092915050565b60608161248157505060408051808201909152600681526503030303030360d41b602082015290565b6040805180820190915260068082526503030303030360d41b6020830152905b811561227757600a6124b4601086614519565b101561250b576124c5601085614519565b6124d0906030614333565b60f81b816124df600185614469565b815181106124ef576124ef61456f565b60200101906001600160f81b031916908160001a905350612558565b612516601085614519565b612521906037614333565b60f81b81612530600185614469565b815181106125405761254061456f565b60200101906001600160f81b031916908160001a9053505b61256360108561434b565b93508161256f816144ac565b9250506124a1565b60607d66c3ec35814cf53a8d1d8f8f2b573412cb485cf3ae933a4389431f09c33b670906539c38c8f192600884106125cd57836008146125c4576125bf633b9aca008261434b565b6125c6565b805b91506125f7565b83156125f7576125de84600361444a565b6125ea906103e86143a2565b6125f4908361434b565b91505b600061261b6103e861260c620f42408661434b565b6126169190614519565b612329565b61262b6103e861260c818761434b565b61263a6126166103e887614519565b60405160200161264c93929190613a81565b60408051601f1981840301815291905295945050505050565b606061266f6135fc565b6040518060800160405280604e8152602001615620604e9139815260408051808201909152601f81527f4d3139312c3535366c3231392d326c2d39392d3131374c3139312c3535367a006020820152816001602002018190525060405180608001604052806050815260200161576a60509139604080830191909152805160c081019091526089808252615a9060208301398160035b602002015280612716600185614469565b600481106127265761272661456f565b60200201519392505050565b606061273c613685565b6040518060a00160405280606c81526020016155b4606c913981526040805160a081019091526077808252614d9a6020830139602082015280612780600185614469565b600281106127265761272661456f565b606061279a61369e565b761cb86ed9ab466c98faedcf668c7598539b324435cb562081527f3521989a09445313522889b48867113631146226c622489b788a2d926c1b5b276020808301919091527f09a91484d058561363113d32149b2162426d221889b90d5b28862d486cda866260408301527f4e218b521c34150d44d486a26ce22a09a91444da4433889b51544d906426cc5260608301526d2124d836b64d2cb3320d84dc86cd60808301527f5320ad2a1c5320c52a1cd320b56a195720a56a1ad720b5aa195f20adea1b5f276101608301527f5434a6416ad433a6415ad4399e415ad432a6409ad436a6415a5434a6413a54376101808301527f0276a8674c8276a8674c8276a8634c82d6a8534c8336a86f3c8335a8733c83156101a08301527f625904ad50da5904ad50de3905ab50ce59056b50e259066d50ce79026f50d6796101c08301527b0c5aa195f209e2a19df20ce6a14df20c66a1b4f20b62a1acf20b5ea16101e08301527f36310c5b1159a0a06426c433135311504db87226d433136c29444dc5aa1a63276102a08301527f36a2a09b10c84d0485213522909b51584d4c44f948516cc51909b8886226e0356102c08301527f46426ca41989b80d9a08c4316a4376d03413521a09b288a826a451136710ca226102e08301527f4432136814b641b89b60a5a0886f113702489b515c4d4c4516a4336da424b6226103008301527f09b6889f988989905226e436682510c5a90ddb40d04d486826ce22a09a91444d6103208301527f09b10a4310a4290a5690a4290a4290a560985226a45213642489a91244db44526103408301527c010c5aa1a63264c8496c622a49a0ace2cc46c1b4b068862d486426c4296103608301527f4b20adaa1a4b20c5aa1bcb209dea1c4b20adea1bcb20bdea1c4b20c5ea18cf276103e083015260009081908190819081907f54378e412b54358e412b54368e412b54388e415b542996412b543296411b543490879060200201527f0237a8629c8278a86a9c8298a86c9c82d7a8691c82b7a8651c8297a86b1c82f66104208701527f5b1805e360c539063350d939067150a53905ef50e73805af50c738046f50db386104408701527f5aa1c5b00adaa18df00b5ea1be300ae2a18e700c5ea1be300966a1ce300b46c16104608701527f6016b5438ae011b5432b6017ad429b6014ad433b6017ad434b6019ad434b60176104808701527f06d5c02f7a86b5c0337a8675c0137a86b5c0336a8536c02f6a8735c02d6a86b56104a08701527f5ed50e27805ad50d298027150e698027150c6b8052f50e6b804ef50e6b804ef56104c08701527f4f208cac1b4f204cac14d700ae6a18d700b62a19d3009dea1953009dea19cf006104e087015268014c54379e414cd4376105008701527f48496a45213411125a90c9b2125a91484dc8a426c453136511504d8dea1a63076105208701527f44291352290922909c090522905224852b48a226c84913662ac44d885226c44c6105408701527f05226a433136214b622934150cc4d9864d886226c851136e2a09b90d04d4864d6105608701527f06cda86226dc3113661989b40cc4d04858148581242912d218892188921489716105808701527f4da90e26db852dbc429136510c44d024326c4586d222909b7149b265c31136b16105a08701527f0695c1922b444d985226c8358b411a5434ae0e0846f50d31835c316e0536de426105c0870152620846956105e0870152604080516101f4808252610220820190925260009160208201818036833750505060208801516000975094506001925090505b600a8211612ddd578682612cc360018c614469565b612cce90600a61444a565b612cd89190614333565b60328110612ce857612ce861456f565b6020020151612cf657612ddd565b8682612d0360018c614469565b612d0e90600a61444a565b612d189190614333565b60328110612d2857612d2861456f565b60200201519350600094505b60328511612dcb5783612d4657612dcb565b612d51602085614519565b9250612d5e60208561434b565b93506080612d6c84826143a2565b8851612d78919061434b565b612d829190614519565b60f81b8187612d90816144fe565b985081518110612da257612da261456f565b60200101906001600160f81b031916908160001a90535084612dc3816144fe565b955050612d34565b81612dd5816144fe565b925050612cae565b60008667ffffffffffffffff811115612df857612df8614585565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b509050600095505b86861015612e8a57818681518110612e4457612e4461456f565b602001015160f81c60f81b818781518110612e6157612e6161456f565b60200101906001600160f81b031916908160001a90535085612e82816144fe565b965050612e2a565b9998505050505050505050565b6060612ea16135fc565b6040518060a001604052806067815260200161471e6067913981526040805160a08101909152606d808252615dfe602083013981600160200201819052506040518060a00160405280606f81526020016156fb606f9139604080830191909152805160a08101909152606e8082526151b46020830139816003612705565b805160609080612f3f575050604080516020810190915260008152919050565b60006003612f4e836002614333565b612f58919061434b565b612f6390600461444a565b90506000612f72826020614333565b67ffffffffffffffff811115612f8a57612f8a614585565b6040519080825280601f01601f191660200182016040528015612fb4576020820181803683370190505b5090506000604051806060016040528060408152602001615174604091399050600181016020830160005b86811015613040576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fdf565b50600386066001811461305a576002811461306b57613077565b613d3d60f01b600119830152613077565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806130b657506001600160e01b03198216635b5e139f60e01b145b8061044e57506301ffc9a760e01b6001600160e01b031983161461044e565b610691838383613220565b6130ea83836132d8565b6130f76000848484613113565b6106915760405162461bcd60e51b815260040161055b90614206565b60006001600160a01b0384163b1561321557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131579033908990889088906004016141b6565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a1575060408051601f3d908101601f1916820190925261319e918101906138c2565b60015b6131fb573d8080156131cf576040519150601f19603f3d011682016040523d82523d6000602084013e6131d4565b606091505b5080516131f35760405162461bcd60e51b815260040161055b90614206565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120b8565b506001949350505050565b6001600160a01b03831661327b5761327681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61329e565b816001600160a01b0316836001600160a01b03161461329e5761329e8382613426565b6001600160a01b0382166132b557610691816134c3565b826001600160a01b0316826001600160a01b031614610691576106918282613572565b6001600160a01b03821661332e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161055b565b6000818152600260205260409020546001600160a01b0316156133935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161055b565b61339f600083836130d5565b6001600160a01b03821660009081526003602052604081208054600192906133c8908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161343384610a98565b61343d9190614469565b600083815260076020526040902054909150808214613490576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134d590600190614469565b600083815260096020526040812054600880549394509092849081106134fd576134fd61456f565b90600052602060002001549050806008838154811061351e5761351e61456f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061355657613556614559565b6001900381819060005260206000200160009055905550505050565b600061357d83610a98565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011906020820280368337509192915050565b6040518060a001604052806005905b60608152602001906001900390816135e45790505090565b6040805160808101909152606081526003602082016135e4565b60408051610360810190915260608152601a602082016135e4565b604051806101800160405280600c906020820280368337509192915050565b6040805160c08101909152606081526005602082016135e4565b60408051610160810190915260608152600a602082016135e4565b60408051808201909152606081526001602082016135e4565b6040518061064001604052806032906020820280368337509192915050565b80356001600160a01b03811681146136d457600080fd5b919050565b6000602082840312156136eb57600080fd5b612277826136bd565b6000806040838503121561370757600080fd5b613710836136bd565b915061371e602084016136bd565b90509250929050565b60008060006060848603121561373c57600080fd5b613745846136bd565b9250613753602085016136bd565b9150604084013590509250925092565b6000806000806080858703121561377957600080fd5b613782856136bd565b9350613790602086016136bd565b925060408501359150606085013567ffffffffffffffff808211156137b457600080fd5b818701915087601f8301126137c857600080fd5b8135818111156137da576137da614585565b604051601f8201601f19908116603f0116810190838211818310171561380257613802614585565b816040528281528a602084870101111561381b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561385257600080fd5b61385b836136bd565b91506020830135801515811461387057600080fd5b809150509250929050565b6000806040838503121561388e57600080fd5b613897836136bd565b946020939093013593505050565b6000602082840312156138b757600080fd5b81356122778161459b565b6000602082840312156138d457600080fd5b81516122778161459b565b6000602082840312156138f157600080fd5b5035919050565b60008151808452613910816020860160208601614480565b601f01601f19169290920160200192915050565b60008251613936818460208701614480565b9190910192915050565b60008551613952818460208a01614480565b855190830190613966818360208a01614480565b8551910190613979818360208901614480565b845191019061398c818360208801614480565b019695505050505050565b600086516139a9818460208b01614480565b8651908301906139bd818360208b01614480565b86519101906139d0818360208a01614480565b85519101906139e3818360208901614480565b84519101906139f6818360208801614480565b01979650505050505050565b600087516020613a158285838d01614480565b885191840191613a288184848d01614480565b8851920191613a3a8184848c01614480565b8751920191613a4c8184848b01614480565b8651920191613a5e8184848a01614480565b8551920191613a708184848901614480565b919091019998505050505050505050565b6331bc1e9160e11b81528351600090613aa1816004850160208901614480565b65111031bc9e9160d11b6004918401918201528451613ac781600a840160208901614480565b641110391e9160d91b600a92909101918201528351613aed81600f840160208801614480565b601160f91b600f929091019182015260100195945050505050565b7f222f3e203c2f6c696e6561724772616469656e743e203c70617468206f70616381527f6974793d22302e3335222066696c6c3d2275726c282373616e64477261646965602082015267373a149110321e9160c11b604082015260008251613b77816048850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e3335222066696c6c3d22236048939091019283015250606801919050565b641110321e9160d91b81528151600090613bcc816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e34222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c21816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e31222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c76816005850160208701614480565b70222f3e203c706174682066696c6c3d222360781b6005939091019283015250601601919050565b641110321e9160d91b81528151600090613cbf816005850160208701614480565b74222f3e203c673e203c706174682066696c6c3d222360581b6005939091019283015250601a01919050565b641110321e9160d91b81528151600090613d0c816005850160208701614480565b6a011179f101e17b9bb339f160ad1b6005939091019283015250601001919050565b641110321e9160d91b81528151600090613d4f816005850160208701614480565b7f222f3e203c6c696e6561724772616469656e742069643d2273616e644772616460059390910192830152507f69656e7422206772616469656e74556e6974733d227573657253706163654f6e60258201527f557365222078313d222d31343234222079313d22363538222078323d222d343560458201527f36222079323d2236353822206772616469656e745472616e73666f726d3d226d60658201527f6174726978283120302030203120313332342e37393938203135382e3139393260858201527f29223e203c73746f70206f66667365743d223022207374796c653d2273746f7060a5820152672d636f6c6f723a2360c01b60c582015260cd01919050565b641110321e9160d91b81528151600090613e73816005850160208701614480565b7f222f3e203c616e696d6174654d6f74696f6e20706174683d226d20302030206860059390910192830152507f202d3530303022206475723d2232353030732220726570656174436f756e743d60258201527f22696e646566696e69746522202f3e203c2f673e203c706174682066696c6c3d604582015261222360f01b6065820152606701919050565b7f222063783d223434222063793d223832332220723d223939222f3e203c72616481527f69616c4772616469656e742069643d2273756e4772616469656e742220000000602082015260008251613f5c81603d850160208701614480565b7f206772616469656e74556e6974733d227573657253706163654f6e557365223e603d9390910192830152507f203c73746f70206f66667365743d22302e3722207374796c653d2273746f702d605d82015266636f6c6f723a2360c81b607d820152608401919050565b7f222f3e203c2f72616469616c4772616469656e743e203c636972636c65206f7081527f61636974793d22302e38222066696c6c3d2275726c282373756e4772616469656020820152640373a1491160dd1b604082015260008251614032816045850160208701614480565b61179f60f11b6045939091019283015250604701919050565b7f7b226e616d65223a20224f6e436861696e2053616e6473222c2022646573637281527f697074696f6e223a202242656175746966756c2076696577732c20636f6d706c60208201527f6574656c792067656e657261746564204f6e436861696e222c226174747269626040820152653aba32b9911d60d11b6060820152600083516140de816066850160208801614480565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260669184019182015265185cd94d8d0b60d21b6086820152835161412a81608c840160208801614480565b61227d60f01b608c9290910191820152608e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161417d81601d850160208701614480565b91909101601d0192915050565b6314d85b9960e21b8152600082516141a9816004850160208701614480565b9190910160040192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141e9908301846138f8565b9695505050505050565b60208152600061227760208301846138f8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f546f6b656e73206e756d62657220746f206d696e742065786365656473206e756040820152746d626572206f66207075626c696320746f6b656e7360581b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156143465761434661452d565b500190565b60008261435a5761435a614543565b500490565b600181815b8085111561439a5781600019048211156143805761438061452d565b8085161561438d57918102915b93841c9390800290614364565b509250929050565b600061227783836000826143b85750600161044e565b816143c55750600061044e565b81600181146143db57600281146143e557614401565b600191505061044e565b60ff8411156143f6576143f661452d565b50506001821b61044e565b5060208310610133831016604e8410600b8410161715614424575081810a61044e565b61442e838361435f565b80600019048211156144425761444261452d565b029392505050565b60008160001904831182151516156144645761446461452d565b500290565b60008282101561447b5761447b61452d565b500390565b60005b8381101561449b578181015183820152602001614483565b83811115610ca05750506000910152565b6000816144bb576144bb61452d565b506000190190565b600181811c908216806144d757607f821691505b602082108114156144f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145125761451261452d565b5060010190565b60008261452857614528614543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097057600080fdfe4d2d3133322c3730376339332d312c3332382d38392c3433312d373220633130322c31372c3138382c37322c3237302c36386338312d342c3139392d38372c3237352d3835733236382c3134322c3236382c3134322076323534482d39384c2d3133322c3730377a222f3e203c2f6c696e6561724772616469656e743e203c7265637420783d22302e3030312220793d22302e313839222066696c6c3d2275726c28236d61696e4772616469656e7429222077696474683d223130303022206865696768743d2231303030222f3e203c636972636c65206f7061636974793d22302e31222066696c6c3d222322207d2c207b202274726169745f74797065223a20224e656172204f626a656374222c202276616c7565223a2022222f3e203c73746f70206f66667365743d223122207374796c653d2273746f702d636f6c6f723a23222f3e203c73746f70206f66667365743d22302e3822207374796c653d2273746f702d636f6c6f723a234d2d33392c313031336c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3235302d32332d3431362d35632d37372c382d3134382c32392d3332342d3232532d36312c3537342d36312c363134204c2d33392c313031337a4d3137372c393033203231342c383634203138362c383838203137372c383732203138312c383932203136372c393034203136302c383839203136382c383830203135382c383835203134302c383432203135322c383738203133342c383734203135342c383834203136342c393135203137312c393135203137352c393035203139302c3930334d3130322c3932346334322c302c37392d31332c39362d3332206c2d312d31306c2d31392d366c2d392c346c2d362d366c2d32302d31316c2d31312c336c2d312c33376c2d382c356c2d362d32206c2d382c326c2d352c3137433130302c3932342c3130312c3932342c3130322c3932347a22207d2c207b202274726169745f74797065223a202250616c65747465222c202276616c7565223a20224d3137332c3932346c2d322d396c2d382d346c2d352d39206c2d302c31316c2d372c336c2d302c336c2d31362c31336c322c336c362d306c31302d306c322d326c332c316c372d31206c312d326c342d316c31302c334c3137332c3932347a22207d2c207b202274726169745f74797065223a2022466172204f626a656374222c202276616c7565223a20222220643d224d3636382c34323363302c302c3331332d302c3330332d323820632d31302d32382d3339372d34382c31352d3436633330312c322c3139362c34362c3436302c343320633235382d332c3438342d36302c3438352d313763312c34332d3239302c32342d3239302c3530733238382c392c3437382c313220633138392c332c3334312d38332c3533352d3236633139342c35362c3332322c33322c3531372c3520633139342d32372c3134302c302c3432372c30633238372c302c313138302c302c313138302c30762d3331483336303763302c302d3133372d31312d3238332d313020632d3134362c302d3136322c33332d3339342d37632d3233322d34312d3331322d34332d3432302d323420632d3130372c31382d3235352c36382d3339352c3734732d3339372c31382d3339382c37632d312d31302c3434372d32362c3434362d363520632d312d33382d3137362d34322d3339312d3235632d3231352c31362d3339352d31342d3536382d313920632d3137322d342d3632362d382d3632372c3235733332332c32352c3332322c3530632d302c392d3539332c332d3539332c33482d33367632372068343738433434322c3432312c3535332c3432332c3636382c3432337a222f3e203c70617468206f7061636974793d22302e3131222066696c6c3d22234d3239362c36333420632d3130342d31342d3333352c37322d3432382c37336c33332c33303668323936633135302d34392c3332302d3131332c3332302d3134372063302d36302d3235392d39322d3237352d313538433232392c3635312c3238332c3633362c3239362c3633347a5b7b202274726169745f74797065223a20224d61696e222c202276616c7565223a20224d3339302e3431372c3733312e343839632d31392e3438342d37332e3539312c37322e342d39352e37322c37312e34322d39352e383534632d39392e3337362d31322e3031372d3233342e3339352c33342e3434362d3332312e3632312c33372e363832632d35342e3236332c322e30312d3134382e3038332d32312e3935372d3232352e3238372d34312e34323963352e37332c39382e3433332c35382e3535382c3430352e3535372c3439352e3532312c3339322e3131316339362e3733332d322e3937372c3135302e322c322e3834312c3137332e3136362c31342e323735633131302e3038362d34302e3335312c3139322e3032312d37382e3935392c3139322e3032312d3130342e343934433737352e3633372c3835352e3937342c3431322e3730352c3831352e3633352c3339302e3431372c3733312e3438397a4d2d34372e3338342c3732392e3538376c31362e352c3333342e34383248313038322e30366c2d372e3439392d3430302e343863302c302d3134332e3939342c34362e3530392d3239332e3938362c34382e303039632d3133382e3237382c312e3338332d3236392e3938352d37332e3530372d3431302e3937392d3130322e303035532d34372e3338342c3732392e3538372d34372e3338342c3732392e3538374d313038392c313031356c2d313135372c356c31392d34373863302c302c34322d31352c3131392d3232206337372d362c3137332d382c3235352c306338322c392c3135392c31322c3232352c3132733138382d31342c3333382d313420733136352c33332c3136352c33334c313038392c313031357a4d313134332e3535372c3737312e353936433834322e3736362c3737342e3433342c3539302e3239342c3939342e36392c3536332e3837312c313031382e35483238312e323737633231392e3431342d32372e3639322c3236392e3238392d3133342e3736322c3237302e37312d3230302e31313663312e352d36382e3939362d3138312e3439312d37362e3439362d3239352e3438342d3131362e393934632d3130372e3036332d33382e3033352c35372e3039362d38392e332c37372e3435352d39352e333935433138362e3832392c3630332e3537312d34372e3338342c3732392e3538372d34372e3338342c3732392e3538376c31342e3330372c3332312e3931336c313137362e3633342c32372e353843313134332e3535372c313037392e30382c313436312e3534312c3736382e3539362c313134332e3535372c3737312e3539367a4d3139362c3930396c2d32372d36306c322d336c2d322d32206c322d316c2d372d336c302c366c2d31342c31366c312c31316c302d396c31332d31316c322c306c322c35206c2d322c34346c332d376c302c336c322d33306c302c3163302c372c322c32312c322c32312063302d302c302d392c302d31346c31332c33344c3139362c3930397a4d3738392e3635312c3631322e363635632d37352e3230352d31332e3232392d3138302e3034352c32392e3138392d3234372e3231352c33322e303738632d36372e3136382c322e3839322d3231342e3930322d35352e3539362d3235342e3938312d35372e3032632d38302e3630392d322e3836312d3230352e3836322c39342e34392d3239322e3637322c3130302e323133632d31352e3235352c312e3030372d33302e3632352d302e3230342d34362e3139312d322e393831763336342e3432356c313039312e3434342d382e333238563638372e363839433936342e3036362c3637382e3832372c3838332e3835352c3632392e32342c3738392e3635312c3631322e3636357a4d3136342c393237203135392c393237203135352c393239203135352c393331203134312c393331203134302c393330203135302c393232203133392c393239203133382c393239203133332c393333203133372c393332203133342c393335203135352c393331203135352c393332203135382c393334203136332c393332203136362c3933304142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d313134322c313031366c2d313138312c343063302c302d36362d3535342d392d35333020633138312c37372c3239392c32362c3436342c33336337372c332c3230372c34352c3338322c313420633138302d33322c3332372c31342c3333302c32324c313134322c313031367a2220643d224d3636382c34303463302c302c3332322c31322c3331322d313520632d31302d32382d3830342d35362c382d3632633330312d322c3233392c33372c3530332c333420633235382d332c3536352d34322c3536392c3163322c32392d3338312c33322d3431372c363120632d32332c31382c3237332c31322c3437302c37633138392d352c3531332d39342c3731342d353220633231322c34342c3138342c34362c3337392c3138633139342d32372c3138382c312c3437352c31633238372c302c313039362c302c313039362c3020762d323063302c302d313130322c302d313137352c30732d3133372d31332d3238342d3133632d3134362c302d3136312c32352d3339332d313620632d3233322d34312d3331352d33312d3432322d3132632d3130372c31382d3235302c36382d3338392c3734732d3433322c32342d3433322c31332063302d31332c3435382d32352c3437332d37316331322d33372d3137322d35342d3338372d333820632d3231352c31362d3339352d31342d3536382d3139632d3137322d342d3632302c372d3632312c343120632d312c33342c3331392c33322c3332312c353163302c392d3539382d31322d3539382d3132482d33367632376834373820433434322c3430332c3535332c3430342c3636382c3430347a222f3e203c616e696d6174654d6f74696f6e20706174683d224d20302030204c202d33373530203430205a22206475723d22323530732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f673e203c70617468206f7061636974793d22302e3235222066696c6c3d22234d3137362c38373363302c302d39322c32352d38392c33382063332c31332c34332c312c35362d38433135372c3839352c3137362c3837332c3137362c3837337a4d3331322e3235362c3631392e323234632d322e3138362d31382e3438362d31302e3434382d32372e3539322d32312e3032372d33312e3235632d312e3238362d302e3131392d322e3534332d302e3230332d332e3737332d302e323436632d38302e3631312d322e3836332d3230352e3836322c39342e3438392d3239322e3637312c3130302e323131632d31352e3235352c312e3030372d33302e3632372d302e3230342d34362e3139332d322e393831763336392e3437394838332e323932433238332e3837312c3838362e3837312c3331382e3236322c3637302e30362c3331322e3235362c3631392e3232347a4d2d36382c313038326c313135372c366c2d31392d35373763302c302d33392d362d3131372d3620732d3130322c382d3138352c3136732d3131382c382d3138332c38732d3138312d32312d3333312d3231732d3238362c34322d3238362c3432204c2d36382c313038327a4d3433312e3734312c3533372e373234203337312e38352c3436372e303936203332312e3538322c3531372e333634203235342e3835392c3434322e333631203136302e31312c3533372e3130394d3138382c3930306c2d31342d32316c2d342c312063302c302c372c31392c372c3230632d302c302d362c312d362c316c2d31382d366c2d322d31376c2d332c31336c2d382d3231206c2d332c326c302c31336c2d34332c31326c2d362c396c2d34332c366c2d362c366c36372c316c392d3020433134322c3932322c3137302c3931332c3138382c3930307a4d2d33392c313031366c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3231312d34302d3337372d3232632d37372c382d3230332c33372d3338302c323520632d3138322d31322d3332372c31342d3333302c32324c2d33392c313031367a4d3234342c353537203233382c343838203234382c343838203233382c343133203239382c333938203239362c333839203432342c343037203430312c343834203339312c343837203338332c3535354d3132382c38393763342c312c382c362c31352c372063382d352c31352d31312c32302d313763302d322c312d352c312d3663302d302c302d302c302d302063302d302c302d302c302d3063322d332c352d342c372d3363302d302c302d312c312d3120632d322d322d382d312d31322c34632d332c352d362c362d362c36632d322c302d332c302d342c3020632d302d302d302d302d302d30632d302d322d332d342d362d346c2d302d326c2d332c316c302c3220632d322c312d332c342d322c3763302c302c302c302c302c30632d342c312d31312c322d31362c3220632d382d302d382c362d382c366c392d32433132352c3839362c3132372c3839362c3132382c3839377a3c7376672076657273696f6e3d22312e31222069643d224c617965725f322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2220783d223070782220793d22307078222077696474683d2231303030707822206865696768743d22313030307078222076696577426f783d22302030203130303020313030302220656e61626c652d6261636b67726f756e643d226e657720302030203130303020313030302220786d6c3a73706163653d227072657365727665223e203c6c696e6561724772616469656e742069643d226d61696e4772616469656e7422206772616469656e74556e6974733d227573657253706163654f6e557365222078313d222d3136322e33393932222079313d223131382e30393934222078323d222d3136322e33393933222079323d22313131372e3931303422206772616469656e745472616e73666f726d3d226d6174726978283120302030202d31203636322e3339393920313131382e3039393129223e203c73746f70206f66667365743d22302e363422207374796c653d2273746f702d636f6c6f723a234d3230392c35313163302d302c33362d382c33362d38207331302d312c31312d317331372d31352c31372d313673302d362c302d366c31392d30762d3668396c312d366834762d312068363776326835763463302c302c31312d312c31312c3073302c382c302c3868323076366c31382c3138683776313076373048323039204c3230392c3531317a4d3733302e3639362c3639352e353231632d31342e36362d36342e3233342c35342e3437392d38332e3534392c35332e3733382d38332e363638632d37342e3737332d31302e3438362d3137362e3336352c33302e3036382d3234312e3939382c33322e383931632d36352e31382c322e3830362d3230362e3231392d35322e3138342d3235312e3133392d35362e3733396331302e3534372c332e3637342c31382e3737372c31322e3737362c32302e3935392c33312e32323363352e3731312c34382e3334322d32352e3131342c3234362e3736382d3230302e3633322c3431302e3231356c3537322e3034382c362e39393268302e323436633135372e3735342d35352e3330332c3333362e3633312d3132362e3337372c3333362e3633312d3136342e33343243313032302e3534392c3830342e3137372c3734372e3436372c3736382e3936382c3733302e3639362c3639352e3532317a4d3133352c393037203136342c393133203136342c393135203137312c393135203134352c393239203131322c393332203134352c393235203136302c393136203135312c393132203134352c393134203134372c3931314d313233312e3034392c3631342e373738632d3130362e312d332e3130392d3237302e3936332c3130322e3730342d3338352e3232332c3130382e393235632d3131342e3235382c362e3232392d3233332e3431382d36352e3335342d3337372e30362d38372e313339632d39392e3934382d31352e3135382d3233392e3238312c33332e34342d3332382e3535322c33362e373531632d38392e3236392c332e3331332d3238352e3630392d36332e3639362d3333382e3837372d36352e333236632d3130372e3133322d332e3237372d31342e38392c3533342e3639382d31342e38392c3533342e3639386c313132302e3030312d32302e363232433930362e3434392c313132322e3036342c313333372e3134372c3631372e3838392c313233312e3034392c3631342e3737387a4d313134302c313031336c2d313138312c343063302c302d33372d3530372c32332d343936633138392c33342c3331352d342c3438322c3133206337372c382c3230352c35312c3339312d3231633137302d36362c3237302c36312c3237332c36394c313134302c313031337a4d3138392c393035203130302c3932312039362c393434203130372c393235203139362c39303922207d2c207b202274726169745f74797065223a202253756e222c202276616c7565223a20224d3536392c37303220632d38312c342d3136372d35312d3237302d3638632d39302d31342d3238322c35312d3339312c36386c2d362c3330316c302c386837353020433834312c3837312c3837342c3638372c3836382c363434632d322d31352d392d32332d31392d3236632d312d302d322d302d332d3020433736392c3631352c3635312c3639382c3536392c3730327aa26469706673582212203f330052506af68832c77f5e07df0efbf225ff3cf26fc62dd9c5d62fd828f77264736f6c63430008070033

Deployed Bytecode

0x6080604052600436106101405760003560e01c80634f6ccce7116100b6578063a22cb4651161006f578063a22cb46514610365578063aaf492a314610385578063b88d4fde1461039a578063c87b56dd146103ba578063e985e9c5146103da578063f2fde38b1461042357600080fd5b80634f6ccce7146102bd5780636352211e146102dd57806370a08231146102fd578063715018a61461031d5780638da5cb5b1461033257806395d89b411461035057600080fd5b806323b872dd1161010857806323b872dd146102155780632f745c591461023557806330ffc9e3146102555780633ccfd60b1461026857806340d097c31461027d57806342842e0e1461029d57600080fd5b806301ffc9a71461014557806306fdde031461017a578063081812fc1461019c578063095ea7b3146101d457806318160ddd146101f6575b600080fd5b34801561015157600080fd5b506101656101603660046138a5565b610443565b60405190151581526020015b60405180910390f35b34801561018657600080fd5b5061018f610454565b60405161017191906141f3565b3480156101a857600080fd5b506101bc6101b73660046138df565b6104e6565b6040516001600160a01b039091168152602001610171565b3480156101e057600080fd5b506101f46101ef36600461387b565b610580565b005b34801561020257600080fd5b506008545b604051908152602001610171565b34801561022157600080fd5b506101f4610230366004613727565b610696565b34801561024157600080fd5b5061020761025036600461387b565b6106c7565b6101f46102633660046138df565b61075d565b34801561027457600080fd5b506101f46108d2565b34801561028957600080fd5b506101f46102983660046136d9565b61092b565b3480156102a957600080fd5b506101f46102b8366004613727565b610973565b3480156102c957600080fd5b506102076102d83660046138df565b61098e565b3480156102e957600080fd5b506101bc6102f83660046138df565b610a21565b34801561030957600080fd5b506102076103183660046136d9565b610a98565b34801561032957600080fd5b506101f4610b1f565b34801561033e57600080fd5b50600a546001600160a01b03166101bc565b34801561035c57600080fd5b5061018f610b55565b34801561037157600080fd5b506101f461038036600461383f565b610b64565b34801561039157600080fd5b506101f4610c29565b3480156103a657600080fd5b506101f46103b5366004613763565b610c6e565b3480156103c657600080fd5b5061018f6103d53660046138df565b610ca6565b3480156103e657600080fd5b506101656103f53660046136f4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561042f57600080fd5b506101f461043e3660046136d9565b611e95565b600061044e82611f36565b92915050565b606060008054610463906144c3565b80601f016020809104026020016040519081016040528092919081815260200182805461048f906144c3565b80156104dc5780601f106104b1576101008083540402835291602001916104dc565b820191906000526020600020905b8154815290600101906020018083116104bf57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166105645760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061058b82610a21565b9050806001600160a01b0316836001600160a01b031614156105f95760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161055b565b336001600160a01b0382161480610615575061061581336103f5565b6106875760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161055b565b6106918383611f5b565b505050565b6106a03382611fc9565b6106bc5760405162461bcd60e51b815260040161055b906142e2565b6106918383836120c0565b60006106d283610a98565b82106107345760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b606482015260840161055b565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b6000811161079c5760405162461bcd60e51b815260206004820152600c60248201526b15dc9bdb99c8185b5bdd5b9d60a21b604482015260640161055b565b601e8111156108005760405162461bcd60e51b815260206004820152602a60248201527f4d617820746f6b656e7320706572207472616e73616374696f6e206e756d62656044820152691c88195e18d95959195960b21b606482015260840161055b565b61135661081682610810600b5490565b9061226b565b11156108345760405162461bcd60e51b815260040161055b90614258565b600c543490610843908361227e565b11156108915760405162461bcd60e51b815260206004820152601b60248201527f45746865722076616c75652073656e7420697320746f6f206c6f770000000000604482015260640161055b565b60005b818110156108ce576108ae336108a9600b5490565b61228a565b6108bc600b80546001019055565b806108c6816144fe565b915050610894565b5050565b600a546001600160a01b031633146108fc5760405162461bcd60e51b815260040161055b906142ad565b6040514790339082156108fc029083906000818181858888f193505050501580156108ce573d6000803e3d6000fd5b600a546001600160a01b031633146109555760405162461bcd60e51b815260040161055b906142ad565b610962816108a9600b5490565b610970600b80546001019055565b50565b61069183838360405180602001604052806000815250610c6e565b600061099960085490565b82106109fc5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b606482015260840161055b565b60088281548110610a0f57610a0f61456f565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b03168061044e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161055b565b60006001600160a01b038216610b035760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161055b565b506001600160a01b031660009081526003602052604090205490565b600a546001600160a01b03163314610b495760405162461bcd60e51b815260040161055b906142ad565b610b5360006122a4565b565b606060018054610463906144c3565b6001600160a01b038216331415610bbd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161055b565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6101f4610c35600b5490565b1115610c535760405162461bcd60e51b815260040161055b90614258565b610c60336108a9600b5490565b610b53600b80546001019055565b610c783383611fc9565b610c945760405162461bcd60e51b815260040161055b906142e2565b610ca0848484846122f6565b50505050565b6060610cb06135b6565b610cb86135d5565b610cc06135fc565b610cc86135fc565b610cd06135fc565b610cd8613616565b610ce0613631565b610ce8613650565b610cf0613650565b600080610d23610cff8e612329565b604051602001610d0f919061418a565b604051602081830303815290604052612427565b90506005610d32600a8361434b565b610d3c9190614519565b610d47906001614333565b85526021610d576103e88361434b565b610d619190614519565b610d6c906001614333565b60208601526004610d7f6127108361434b565b610d899190614519565b610d94906001614333565b60408601526002610da76127108361434b565b610db19190614519565b610dbc906001614333565b60608601526004610dd0620186a08361434b565b610dda9190614519565b610de5906001614333565b60808601526004610dfa633b9aca008361434b565b610e049190614519565b610e0f906001614333565b60a08601526005610e256402540be4008361434b565b610e2f9190614519565b610e3a906001614333565b60c08601526005610e4f6305f5e1008361434b565b610e599190614519565b610e64906001614333565b60e08601526040805161014081019091526101098082526157ba602083013984526040805160c081019091526088808252614785602083013984600160200201819052506040518060800160405280605f81526020016148a9605f9139604080860191909152805160a08101909152607280825261480d602083013960608501526040805160c081019091526087808252614f5a602083013960808086019190915260408051918201905260418082526154816020830139835260408051608081019091526058808252615c75602083013983600160200201819052506040518060c00160405280608881526020016150ec60889139604080850191909152805160c08101909152608d80825261566e60208301396060808501919091526040805191820190526027808252615e6b6020830139608084015260408051610140810190915261010b808252614fe1602083013989526040805160a0810190915260688082526145b2602083013989600160200201819052506040518061016001604052806101318152602001615ccd61013191396040808b0191909152805160e0810190915260a2808252614cf8602083013960608a015260408051610180810190915261015c808252615b19602083013988526040805160c081019091526092808252615eb8602083013988600160200201819052506040518061018001604052806101418152602001614bb761014191396040808a019190915280516101808101909152610149808252614e116020830139606089015260408051610120810190915260f28082526154c2602083013987526040805160a08101909152606f808252614b2560208301396020888101919091526040805180830182526000808252828b0191909152815180840183529081526060808b01919091527d3f87e2204da90013704fa4ffebfafff2a140ba0000ba0000ffc64fffff9e8e527ddd74929a3a93560094ffd28afffeebdd74929a3a93560094ff9191fffeeb8e8401527de45f00ae3000780000ff7700ffff9ee47946ae3c23780000ff9757ffff9e918e01919091527ded5f16ca300ba60000ff771cffff9ed55f178230462f0075ff7700ffff9e908d01527dd6c4b7b395888f6559e3cfbdfffeebedb688ca7d56a64324ffd3a1fffeeb60808d01527d527ace653d9a7800664898e8d6fffbd2713ca5382578000ee88d48ffecd660a08d01527d64d6a432836d0031367dffc0ffff9ee4b478ae5a6f780066ffe17dffffff60c08d01527dd954478c2a463f0045ff6947fff9bfd2a75a7754671d0073ffd154fff9bf60e08d01527dd79815864c0a360000ffbe19ffedb0d92a228c15333f0045ff3419ffda616101008d01527d81838d404664000a3ba1a1a1f7f7f78096c14d4b7e1a003b9abbe3f7f7f76101208d01527dd302027c0101240000ff0303ffcb21c5ce92626c67000a3bf6ffa8fffdf26101408d01527dcce3eb66acc2007599ffffff8bb6c7d846088923113b001aff5703ffd3426101608d01527dcca98866565c000330ffd29efff7e8b64ed15e2776060019e261fffff2d96101808d01527d8a8a8a454545000000adadadffffff74bd713a6e52001f3391e581f2ff7a6101a08d01527d3b00002200000a0000470000a3000024003912001c0000002d0047523ea36101c08d01527d6863d863328a5e003c6b7cff59005000373a006062008a8a002226008a836101e08d01526eead56a7f5e542a0042ffec6efff4c76102008d015285015161136b90600190614469565b61137690600561444a565b91506113d3630100000061138b600a85614519565b6113999063010000006143a2565b8d6113a5600a8761434b565b601181106113b5576113b561456f565b60200201516113c4919061434b565b6113ce9190614519565b612458565b8a5260208501516113e690600190614469565b6113f190600561444a565b6113fc906001614333565b9150611411630100000061138b600a85614519565b6020808c019190915285015161142990600190614469565b61143490600561444a565b61143f906002614333565b9150611454630100000061138b600a85614519565b60408b0152602085015161146a90600190614469565b61147590600561444a565b611480906003614333565b9150611495630100000061138b600a85614519565b60608b015260208501516114ab90600190614469565b6114b690600561444a565b6114c1906004614333565b91506114d6630100000061138b600a85614519565b60808b01526040805161020081019091526101cd8082526158c360208301398652604080516060810190915260288082526146cc602083013986600160200201819052506040518060c001604052806084815260200161461a60849139604087015261156060028660075b602002015161155190600261444a565b61155b9190614469565b612577565b6040516020016115709190613efe565b60408051808303601f190181529181526060808901929092528051918201905260288082526146cc602083013960808701526115af6002866007611541565b6040516020016115bf9190613fc6565b60408051601f1981840301815291815260a0880191909152805160208082018352600080835260c08a01929092528251808201845282815260e08a0152825180820184528281526101008a0152825180820184528281526101208a0152825180820184528281526101408a0152825180820184528281526101608a0152825180820184528281526101808a0152825180820184529182526101a0890191909152815180830183528181527f3c673e203c70617468206f7061636974793d22302e3131222066696c6c3d2223818301526101c0890152815161022081019092526101f080835290614935908301396101e087015260408051610280810190915261025f808252615222602083013961020087015260a08501516116e090612665565b6040516020016116f09190613c55565b60408051808303601f19018152919052610220870152606085015161171490612732565b6040516020016117249190613c9e565b60408051808303601f19018152919052610240870152845161174590612790565b6040516020016117559190613e52565b60408051808303601f19018152919052610260870152608085015161177990612e97565b6040516020016117899190613c55565b60408051808303601f1901815291815261028088019190915285015189906117b390600190614469565b600481106117c3576117c361456f565b60200201516040516020016117d89190613d2e565b60408051808303601f190181529181526102a0880191909152805160608101909152602a8082526146f460208301396102c08701526040850151889061182090600190614469565b600481106118305761183061456f565b60200201516040516020016118459190613b08565b60408051808303601f190181529181526102e0880191909152850151879061186f90600190614469565b6004811061187f5761187f61456f565b60200201516040516020016118949190613c00565b60408051808303601f1901815291905261030087015260c085015183906118bd90600190614469565b600681106118cd576118cd61456f565b60200201516040516020016118e29190613bab565b60408051808303601f1901815291905261032087015260c0850151849061190b90600190614469565b6006811061191b5761191b61456f565b60200201516040516020016119309190613ceb565b60408051808303601f19018152918152610340880191909152865160208c810151818a01518e8501518b860151955160009661196f9695909101613997565b60408051601f198184030181529190529050808b6000602002015188600360200201518d600060200201518a600460200201518f600160200201516040516020016119bf96959493929190613a02565b60408051808303601f190181529082905260a08901518d5160c08b01519294506119f0938593908290602001613997565b60408051601f1981840301815291905290508087600760200201518c6001602002015189600860200201518e60006020020151604051602001611a37959493929190613997565b60408051601f1981840301815291905290508087600960200201518c6000602002015189600a60200201518e60016020020151604051602001611a7e959493929190613997565b60408051808303601f19018152908290526101608901518d516101808b0151929450611ab1938593908290602001613997565b60408051601f1981840301815291905290508087600d60200201518c6001602002015189600e60200201518e60006020020151604051602001611af8959493929190613997565b60408051601f1981840301815291905290508087600f60200201518c6000602002015189601060200201518e60046020020151604051602001611b3f959493929190613997565b60408051601f1981840301815291905290508087601160200201518c6004602002015189601260200201518e60036020020151604051602001611b86959493929190613997565b60408051601f1981840301815291905290508087601360200201518c6003602002015189601460200201518e60016020020151604051602001611bcd959493929190613997565b60408051601f1981840301815291905290508087601560200201518c6001602002015189601660200201518e60026020020151604051602001611c14959493929190613997565b60408051808303601f190181528282526102e08a0151918e01516103008b0151919450611c4993859392908290602001613997565b60408051808303601f190181528282526103208a0151918e01516103408b0151919450611c7c9385939290602001613940565b6040516020818303038152906040529050611c9561366a565b604051806060016040528060238152602001614b94602391398152611cc18760005b6020020151612329565b81600160200201819052506040518060600160405280602a815260200161487f602a91396040820152611cf5876001611cb7565b606080830191909152604080519182019052602e80825261469e60208301396080820152611d24876006611cb7565b60a08201526040805160608101909152602d808252614908602083013960c0820152611d51876005611cb7565b60e082015260408051606081019091526026808252615e926020830139610100820152611d7f876007611cb7565b610120820152604080518082018252600481526322207d5d60e01b602080830191909152610140840191909152825181840151838501516060860151608087015160a08801519651600097611dd697909101613a02565b60408051808303601f190181529082905260c084015160e0850151610100860151610120870151610140880151949650611e1595879590602001613a02565b60405160208183030381529060405290506000611e5a82611e3586612f1f565b604051602001611e4692919061404b565b604051602081830303815290604052612f1f565b905080604051602001611e6d9190614145565b6040516020818303038152906040529350839f50505050505050505050505050505050919050565b600a546001600160a01b03163314611ebf5760405162461bcd60e51b815260040161055b906142ad565b6001600160a01b038116611f245760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161055b565b610970816122a4565b80546001019055565b60006001600160e01b0319821663780e9d6360e01b148061044e575061044e82613085565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f9082610a21565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166120425760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161055b565b600061204d83610a21565b9050806001600160a01b0316846001600160a01b031614806120885750836001600160a01b031661207d846104e6565b6001600160a01b0316145b806120b857506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120d382610a21565b6001600160a01b03161461213b5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b606482015260840161055b565b6001600160a01b03821661219d5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161055b565b6121a88383836130d5565b6121b3600082611f5b565b6001600160a01b03831660009081526003602052604081208054600192906121dc908490614469565b90915550506001600160a01b038216600090815260036020526040812080546001929061220a908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122778284614333565b9392505050565b6000612277828461444a565b6108ce8282604051806020016040528060008152506130e0565b600a80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6123018484846120c0565b61230d84848484613113565b610ca05760405162461bcd60e51b815260040161055b90614206565b60608161234d5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156123775780612361816144fe565b91506123709050600a8361434b565b9150612351565b60008167ffffffffffffffff81111561239257612392614585565b6040519080825280601f01601f1916602001820160405280156123bc576020820181803683370190505b5090505b84156120b8576123d1600183614469565b91506123de600a86614519565b6123e9906030614333565b60f81b8183815181106123fe576123fe61456f565b60200101906001600160f81b031916908160001a905350612420600a8661434b565b94506123c0565b60008160405160200161243a9190613924565b60408051601f19818403018152919052805160209091012092915050565b60608161248157505060408051808201909152600681526503030303030360d41b602082015290565b6040805180820190915260068082526503030303030360d41b6020830152905b811561227757600a6124b4601086614519565b101561250b576124c5601085614519565b6124d0906030614333565b60f81b816124df600185614469565b815181106124ef576124ef61456f565b60200101906001600160f81b031916908160001a905350612558565b612516601085614519565b612521906037614333565b60f81b81612530600185614469565b815181106125405761254061456f565b60200101906001600160f81b031916908160001a9053505b61256360108561434b565b93508161256f816144ac565b9250506124a1565b60607d66c3ec35814cf53a8d1d8f8f2b573412cb485cf3ae933a4389431f09c33b670906539c38c8f192600884106125cd57836008146125c4576125bf633b9aca008261434b565b6125c6565b805b91506125f7565b83156125f7576125de84600361444a565b6125ea906103e86143a2565b6125f4908361434b565b91505b600061261b6103e861260c620f42408661434b565b6126169190614519565b612329565b61262b6103e861260c818761434b565b61263a6126166103e887614519565b60405160200161264c93929190613a81565b60408051601f1981840301815291905295945050505050565b606061266f6135fc565b6040518060800160405280604e8152602001615620604e9139815260408051808201909152601f81527f4d3139312c3535366c3231392d326c2d39392d3131374c3139312c3535367a006020820152816001602002018190525060405180608001604052806050815260200161576a60509139604080830191909152805160c081019091526089808252615a9060208301398160035b602002015280612716600185614469565b600481106127265761272661456f565b60200201519392505050565b606061273c613685565b6040518060a00160405280606c81526020016155b4606c913981526040805160a081019091526077808252614d9a6020830139602082015280612780600185614469565b600281106127265761272661456f565b606061279a61369e565b761cb86ed9ab466c98faedcf668c7598539b324435cb562081527f3521989a09445313522889b48867113631146226c622489b788a2d926c1b5b276020808301919091527f09a91484d058561363113d32149b2162426d221889b90d5b28862d486cda866260408301527f4e218b521c34150d44d486a26ce22a09a91444da4433889b51544d906426cc5260608301526d2124d836b64d2cb3320d84dc86cd60808301527f5320ad2a1c5320c52a1cd320b56a195720a56a1ad720b5aa195f20adea1b5f276101608301527f5434a6416ad433a6415ad4399e415ad432a6409ad436a6415a5434a6413a54376101808301527f0276a8674c8276a8674c8276a8634c82d6a8534c8336a86f3c8335a8733c83156101a08301527f625904ad50da5904ad50de3905ab50ce59056b50e259066d50ce79026f50d6796101c08301527b0c5aa195f209e2a19df20ce6a14df20c66a1b4f20b62a1acf20b5ea16101e08301527f36310c5b1159a0a06426c433135311504db87226d433136c29444dc5aa1a63276102a08301527f36a2a09b10c84d0485213522909b51584d4c44f948516cc51909b8886226e0356102c08301527f46426ca41989b80d9a08c4316a4376d03413521a09b288a826a451136710ca226102e08301527f4432136814b641b89b60a5a0886f113702489b515c4d4c4516a4336da424b6226103008301527f09b6889f988989905226e436682510c5a90ddb40d04d486826ce22a09a91444d6103208301527f09b10a4310a4290a5690a4290a4290a560985226a45213642489a91244db44526103408301527c010c5aa1a63264c8496c622a49a0ace2cc46c1b4b068862d486426c4296103608301527f4b20adaa1a4b20c5aa1bcb209dea1c4b20adea1bcb20bdea1c4b20c5ea18cf276103e083015260009081908190819081907f54378e412b54358e412b54368e412b54388e415b542996412b543296411b543490879060200201527f0237a8629c8278a86a9c8298a86c9c82d7a8691c82b7a8651c8297a86b1c82f66104208701527f5b1805e360c539063350d939067150a53905ef50e73805af50c738046f50db386104408701527f5aa1c5b00adaa18df00b5ea1be300ae2a18e700c5ea1be300966a1ce300b46c16104608701527f6016b5438ae011b5432b6017ad429b6014ad433b6017ad434b6019ad434b60176104808701527f06d5c02f7a86b5c0337a8675c0137a86b5c0336a8536c02f6a8735c02d6a86b56104a08701527f5ed50e27805ad50d298027150e698027150c6b8052f50e6b804ef50e6b804ef56104c08701527f4f208cac1b4f204cac14d700ae6a18d700b62a19d3009dea1953009dea19cf006104e087015268014c54379e414cd4376105008701527f48496a45213411125a90c9b2125a91484dc8a426c453136511504d8dea1a63076105208701527f44291352290922909c090522905224852b48a226c84913662ac44d885226c44c6105408701527f05226a433136214b622934150cc4d9864d886226c851136e2a09b90d04d4864d6105608701527f06cda86226dc3113661989b40cc4d04858148581242912d218892188921489716105808701527f4da90e26db852dbc429136510c44d024326c4586d222909b7149b265c31136b16105a08701527f0695c1922b444d985226c8358b411a5434ae0e0846f50d31835c316e0536de426105c0870152620846956105e0870152604080516101f4808252610220820190925260009160208201818036833750505060208801516000975094506001925090505b600a8211612ddd578682612cc360018c614469565b612cce90600a61444a565b612cd89190614333565b60328110612ce857612ce861456f565b6020020151612cf657612ddd565b8682612d0360018c614469565b612d0e90600a61444a565b612d189190614333565b60328110612d2857612d2861456f565b60200201519350600094505b60328511612dcb5783612d4657612dcb565b612d51602085614519565b9250612d5e60208561434b565b93506080612d6c84826143a2565b8851612d78919061434b565b612d829190614519565b60f81b8187612d90816144fe565b985081518110612da257612da261456f565b60200101906001600160f81b031916908160001a90535084612dc3816144fe565b955050612d34565b81612dd5816144fe565b925050612cae565b60008667ffffffffffffffff811115612df857612df8614585565b6040519080825280601f01601f191660200182016040528015612e22576020820181803683370190505b509050600095505b86861015612e8a57818681518110612e4457612e4461456f565b602001015160f81c60f81b818781518110612e6157612e6161456f565b60200101906001600160f81b031916908160001a90535085612e82816144fe565b965050612e2a565b9998505050505050505050565b6060612ea16135fc565b6040518060a001604052806067815260200161471e6067913981526040805160a08101909152606d808252615dfe602083013981600160200201819052506040518060a00160405280606f81526020016156fb606f9139604080830191909152805160a08101909152606e8082526151b46020830139816003612705565b805160609080612f3f575050604080516020810190915260008152919050565b60006003612f4e836002614333565b612f58919061434b565b612f6390600461444a565b90506000612f72826020614333565b67ffffffffffffffff811115612f8a57612f8a614585565b6040519080825280601f01601f191660200182016040528015612fb4576020820181803683370190505b5090506000604051806060016040528060408152602001615174604091399050600181016020830160005b86811015613040576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612fdf565b50600386066001811461305a576002811461306b57613077565b613d3d60f01b600119830152613077565b603d60f81b6000198301525b505050918152949350505050565b60006001600160e01b031982166380ac58cd60e01b14806130b657506001600160e01b03198216635b5e139f60e01b145b8061044e57506301ffc9a760e01b6001600160e01b031983161461044e565b610691838383613220565b6130ea83836132d8565b6130f76000848484613113565b6106915760405162461bcd60e51b815260040161055b90614206565b60006001600160a01b0384163b1561321557604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906131579033908990889088906004016141b6565b602060405180830381600087803b15801561317157600080fd5b505af19250505080156131a1575060408051601f3d908101601f1916820190925261319e918101906138c2565b60015b6131fb573d8080156131cf576040519150601f19603f3d011682016040523d82523d6000602084013e6131d4565b606091505b5080516131f35760405162461bcd60e51b815260040161055b90614206565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506120b8565b506001949350505050565b6001600160a01b03831661327b5761327681600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b61329e565b816001600160a01b0316836001600160a01b03161461329e5761329e8382613426565b6001600160a01b0382166132b557610691816134c3565b826001600160a01b0316826001600160a01b031614610691576106918282613572565b6001600160a01b03821661332e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161055b565b6000818152600260205260409020546001600160a01b0316156133935760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161055b565b61339f600083836130d5565b6001600160a01b03821660009081526003602052604081208054600192906133c8908490614333565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000600161343384610a98565b61343d9190614469565b600083815260076020526040902054909150808214613490576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906134d590600190614469565b600083815260096020526040812054600880549394509092849081106134fd576134fd61456f565b90600052602060002001549050806008838154811061351e5761351e61456f565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061355657613556614559565b6001900381819060005260206000200160009055905550505050565b600061357d83610a98565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6040518061022001604052806011906020820280368337509192915050565b6040518060a001604052806005905b60608152602001906001900390816135e45790505090565b6040805160808101909152606081526003602082016135e4565b60408051610360810190915260608152601a602082016135e4565b604051806101800160405280600c906020820280368337509192915050565b6040805160c08101909152606081526005602082016135e4565b60408051610160810190915260608152600a602082016135e4565b60408051808201909152606081526001602082016135e4565b6040518061064001604052806032906020820280368337509192915050565b80356001600160a01b03811681146136d457600080fd5b919050565b6000602082840312156136eb57600080fd5b612277826136bd565b6000806040838503121561370757600080fd5b613710836136bd565b915061371e602084016136bd565b90509250929050565b60008060006060848603121561373c57600080fd5b613745846136bd565b9250613753602085016136bd565b9150604084013590509250925092565b6000806000806080858703121561377957600080fd5b613782856136bd565b9350613790602086016136bd565b925060408501359150606085013567ffffffffffffffff808211156137b457600080fd5b818701915087601f8301126137c857600080fd5b8135818111156137da576137da614585565b604051601f8201601f19908116603f0116810190838211818310171561380257613802614585565b816040528281528a602084870101111561381b57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561385257600080fd5b61385b836136bd565b91506020830135801515811461387057600080fd5b809150509250929050565b6000806040838503121561388e57600080fd5b613897836136bd565b946020939093013593505050565b6000602082840312156138b757600080fd5b81356122778161459b565b6000602082840312156138d457600080fd5b81516122778161459b565b6000602082840312156138f157600080fd5b5035919050565b60008151808452613910816020860160208601614480565b601f01601f19169290920160200192915050565b60008251613936818460208701614480565b9190910192915050565b60008551613952818460208a01614480565b855190830190613966818360208a01614480565b8551910190613979818360208901614480565b845191019061398c818360208801614480565b019695505050505050565b600086516139a9818460208b01614480565b8651908301906139bd818360208b01614480565b86519101906139d0818360208a01614480565b85519101906139e3818360208901614480565b84519101906139f6818360208801614480565b01979650505050505050565b600087516020613a158285838d01614480565b885191840191613a288184848d01614480565b8851920191613a3a8184848c01614480565b8751920191613a4c8184848b01614480565b8651920191613a5e8184848a01614480565b8551920191613a708184848901614480565b919091019998505050505050505050565b6331bc1e9160e11b81528351600090613aa1816004850160208901614480565b65111031bc9e9160d11b6004918401918201528451613ac781600a840160208901614480565b641110391e9160d91b600a92909101918201528351613aed81600f840160208801614480565b601160f91b600f929091019182015260100195945050505050565b7f222f3e203c2f6c696e6561724772616469656e743e203c70617468206f70616381527f6974793d22302e3335222066696c6c3d2275726c282373616e64477261646965602082015267373a149110321e9160c11b604082015260008251613b77816048850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e3335222066696c6c3d22236048939091019283015250606801919050565b641110321e9160d91b81528151600090613bcc816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e34222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c21816005850160208701614480565b7f222f3e203c70617468206f7061636974793d22302e31222066696c6c3d2223006005939091019283015250602401919050565b641110321e9160d91b81528151600090613c76816005850160208701614480565b70222f3e203c706174682066696c6c3d222360781b6005939091019283015250601601919050565b641110321e9160d91b81528151600090613cbf816005850160208701614480565b74222f3e203c673e203c706174682066696c6c3d222360581b6005939091019283015250601a01919050565b641110321e9160d91b81528151600090613d0c816005850160208701614480565b6a011179f101e17b9bb339f160ad1b6005939091019283015250601001919050565b641110321e9160d91b81528151600090613d4f816005850160208701614480565b7f222f3e203c6c696e6561724772616469656e742069643d2273616e644772616460059390910192830152507f69656e7422206772616469656e74556e6974733d227573657253706163654f6e60258201527f557365222078313d222d31343234222079313d22363538222078323d222d343560458201527f36222079323d2236353822206772616469656e745472616e73666f726d3d226d60658201527f6174726978283120302030203120313332342e37393938203135382e3139393260858201527f29223e203c73746f70206f66667365743d223022207374796c653d2273746f7060a5820152672d636f6c6f723a2360c01b60c582015260cd01919050565b641110321e9160d91b81528151600090613e73816005850160208701614480565b7f222f3e203c616e696d6174654d6f74696f6e20706174683d226d20302030206860059390910192830152507f202d3530303022206475723d2232353030732220726570656174436f756e743d60258201527f22696e646566696e69746522202f3e203c2f673e203c706174682066696c6c3d604582015261222360f01b6065820152606701919050565b7f222063783d223434222063793d223832332220723d223939222f3e203c72616481527f69616c4772616469656e742069643d2273756e4772616469656e742220000000602082015260008251613f5c81603d850160208701614480565b7f206772616469656e74556e6974733d227573657253706163654f6e557365223e603d9390910192830152507f203c73746f70206f66667365743d22302e3722207374796c653d2273746f702d605d82015266636f6c6f723a2360c81b607d820152608401919050565b7f222f3e203c2f72616469616c4772616469656e743e203c636972636c65206f7081527f61636974793d22302e38222066696c6c3d2275726c282373756e4772616469656020820152640373a1491160dd1b604082015260008251614032816045850160208701614480565b61179f60f11b6045939091019283015250604701919050565b7f7b226e616d65223a20224f6e436861696e2053616e6473222c2022646573637281527f697074696f6e223a202242656175746966756c2076696577732c20636f6d706c60208201527f6574656c792067656e657261746564204f6e436861696e222c226174747269626040820152653aba32b9911d60d11b6060820152600083516140de816066850160208801614480565b7f2c2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b6260669184019182015265185cd94d8d0b60d21b6086820152835161412a81608c840160208801614480565b61227d60f01b608c9290910191820152608e01949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161417d81601d850160208701614480565b91909101601d0192915050565b6314d85b9960e21b8152600082516141a9816004850160208701614480565b9190910160040192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906141e9908301846138f8565b9695505050505050565b60208152600061227760208301846138f8565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526035908201527f546f6b656e73206e756d62657220746f206d696e742065786365656473206e756040820152746d626572206f66207075626c696320746f6b656e7360581b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600082198211156143465761434661452d565b500190565b60008261435a5761435a614543565b500490565b600181815b8085111561439a5781600019048211156143805761438061452d565b8085161561438d57918102915b93841c9390800290614364565b509250929050565b600061227783836000826143b85750600161044e565b816143c55750600061044e565b81600181146143db57600281146143e557614401565b600191505061044e565b60ff8411156143f6576143f661452d565b50506001821b61044e565b5060208310610133831016604e8410600b8410161715614424575081810a61044e565b61442e838361435f565b80600019048211156144425761444261452d565b029392505050565b60008160001904831182151516156144645761446461452d565b500290565b60008282101561447b5761447b61452d565b500390565b60005b8381101561449b578181015183820152602001614483565b83811115610ca05750506000910152565b6000816144bb576144bb61452d565b506000190190565b600181811c908216806144d757607f821691505b602082108114156144f857634e487b7160e01b600052602260045260246000fd5b50919050565b60006000198214156145125761451261452d565b5060010190565b60008261452857614528614543565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461097057600080fdfe4d2d3133322c3730376339332d312c3332382d38392c3433312d373220633130322c31372c3138382c37322c3237302c36386338312d342c3139392d38372c3237352d3835733236382c3134322c3236382c3134322076323534482d39384c2d3133322c3730377a222f3e203c2f6c696e6561724772616469656e743e203c7265637420783d22302e3030312220793d22302e313839222066696c6c3d2275726c28236d61696e4772616469656e7429222077696474683d223130303022206865696768743d2231303030222f3e203c636972636c65206f7061636974793d22302e31222066696c6c3d222322207d2c207b202274726169745f74797065223a20224e656172204f626a656374222c202276616c7565223a2022222f3e203c73746f70206f66667365743d223122207374796c653d2273746f702d636f6c6f723a23222f3e203c73746f70206f66667365743d22302e3822207374796c653d2273746f702d636f6c6f723a234d2d33392c313031336c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3235302d32332d3431362d35632d37372c382d3134382c32392d3332342d3232532d36312c3537342d36312c363134204c2d33392c313031337a4d3137372c393033203231342c383634203138362c383838203137372c383732203138312c383932203136372c393034203136302c383839203136382c383830203135382c383835203134302c383432203135322c383738203133342c383734203135342c383834203136342c393135203137312c393135203137352c393035203139302c3930334d3130322c3932346334322c302c37392d31332c39362d3332206c2d312d31306c2d31392d366c2d392c346c2d362d366c2d32302d31316c2d31312c336c2d312c33376c2d382c356c2d362d32206c2d382c326c2d352c3137433130302c3932342c3130312c3932342c3130322c3932347a22207d2c207b202274726169745f74797065223a202250616c65747465222c202276616c7565223a20224d3137332c3932346c2d322d396c2d382d346c2d352d39206c2d302c31316c2d372c336c2d302c336c2d31362c31336c322c336c362d306c31302d306c322d326c332c316c372d31206c312d326c342d316c31302c334c3137332c3932347a22207d2c207b202274726169745f74797065223a2022466172204f626a656374222c202276616c7565223a20222220643d224d3636382c34323363302c302c3331332d302c3330332d323820632d31302d32382d3339372d34382c31352d3436633330312c322c3139362c34362c3436302c343320633235382d332c3438342d36302c3438352d313763312c34332d3239302c32342d3239302c3530733238382c392c3437382c313220633138392c332c3334312d38332c3533352d3236633139342c35362c3332322c33322c3531372c3520633139342d32372c3134302c302c3432372c30633238372c302c313138302c302c313138302c30762d3331483336303763302c302d3133372d31312d3238332d313020632d3134362c302d3136322c33332d3339342d37632d3233322d34312d3331322d34332d3432302d323420632d3130372c31382d3235352c36382d3339352c3734732d3339372c31382d3339382c37632d312d31302c3434372d32362c3434362d363520632d312d33382d3137362d34322d3339312d3235632d3231352c31362d3339352d31342d3536382d313920632d3137322d342d3632362d382d3632372c3235733332332c32352c3332322c3530632d302c392d3539332c332d3539332c33482d33367632372068343738433434322c3432312c3535332c3432332c3636382c3432337a222f3e203c70617468206f7061636974793d22302e3131222066696c6c3d22234d3239362c36333420632d3130342d31342d3333352c37322d3432382c37336c33332c33303668323936633135302d34392c3332302d3131332c3332302d3134372063302d36302d3235392d39322d3237352d313538433232392c3635312c3238332c3633362c3239362c3633347a5b7b202274726169745f74797065223a20224d61696e222c202276616c7565223a20224d3339302e3431372c3733312e343839632d31392e3438342d37332e3539312c37322e342d39352e37322c37312e34322d39352e383534632d39392e3337362d31322e3031372d3233342e3339352c33342e3434362d3332312e3632312c33372e363832632d35342e3236332c322e30312d3134382e3038332d32312e3935372d3232352e3238372d34312e34323963352e37332c39382e3433332c35382e3535382c3430352e3535372c3439352e3532312c3339322e3131316339362e3733332d322e3937372c3135302e322c322e3834312c3137332e3136362c31342e323735633131302e3038362d34302e3335312c3139322e3032312d37382e3935392c3139322e3032312d3130342e343934433737352e3633372c3835352e3937342c3431322e3730352c3831352e3633352c3339302e3431372c3733312e3438397a4d2d34372e3338342c3732392e3538376c31362e352c3333342e34383248313038322e30366c2d372e3439392d3430302e343863302c302d3134332e3939342c34362e3530392d3239332e3938362c34382e303039632d3133382e3237382c312e3338332d3236392e3938352d37332e3530372d3431302e3937392d3130322e303035532d34372e3338342c3732392e3538372d34372e3338342c3732392e3538374d313038392c313031356c2d313135372c356c31392d34373863302c302c34322d31352c3131392d3232206337372d362c3137332d382c3235352c306338322c392c3135392c31322c3232352c3132733138382d31342c3333382d313420733136352c33332c3136352c33334c313038392c313031357a4d313134332e3535372c3737312e353936433834322e3736362c3737342e3433342c3539302e3239342c3939342e36392c3536332e3837312c313031382e35483238312e323737633231392e3431342d32372e3639322c3236392e3238392d3133342e3736322c3237302e37312d3230302e31313663312e352d36382e3939362d3138312e3439312d37362e3439362d3239352e3438342d3131362e393934632d3130372e3036332d33382e3033352c35372e3039362d38392e332c37372e3435352d39352e333935433138362e3832392c3630332e3537312d34372e3338342c3732392e3538372d34372e3338342c3732392e3538376c31342e3330372c3332312e3931336c313137362e3633342c32372e353843313134332e3535372c313037392e30382c313436312e3534312c3736382e3539362c313134332e3535372c3737312e3539367a4d3139362c3930396c2d32372d36306c322d336c2d322d32206c322d316c2d372d336c302c366c2d31342c31366c312c31316c302d396c31332d31316c322c306c322c35206c2d322c34346c332d376c302c336c322d33306c302c3163302c372c322c32312c322c32312063302d302c302d392c302d31346c31332c33344c3139362c3930397a4d3738392e3635312c3631322e363635632d37352e3230352d31332e3232392d3138302e3034352c32392e3138392d3234372e3231352c33322e303738632d36372e3136382c322e3839322d3231342e3930322d35352e3539362d3235342e3938312d35372e3032632d38302e3630392d322e3836312d3230352e3836322c39342e34392d3239322e3637322c3130302e323133632d31352e3235352c312e3030372d33302e3632352d302e3230342d34362e3139312d322e393831763336342e3432356c313039312e3434342d382e333238563638372e363839433936342e3036362c3637382e3832372c3838332e3835352c3632392e32342c3738392e3635312c3631322e3636357a4d3136342c393237203135392c393237203135352c393239203135352c393331203134312c393331203134302c393330203135302c393232203133392c393239203133382c393239203133332c393333203133372c393332203133342c393335203135352c393331203135352c393332203135382c393334203136332c393332203136362c3933304142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f4d313134322c313031366c2d313138312c343063302c302d36362d3535342d392d35333020633138312c37372c3239392c32362c3436342c33336337372c332c3230372c34352c3338322c313420633138302d33322c3332372c31342c3333302c32324c313134322c313031367a2220643d224d3636382c34303463302c302c3332322c31322c3331322d313520632d31302d32382d3830342d35362c382d3632633330312d322c3233392c33372c3530332c333420633235382d332c3536352d34322c3536392c3163322c32392d3338312c33322d3431372c363120632d32332c31382c3237332c31322c3437302c37633138392d352c3531332d39342c3731342d353220633231322c34342c3138342c34362c3337392c3138633139342d32372c3138382c312c3437352c31633238372c302c313039362c302c313039362c3020762d323063302c302d313130322c302d313137352c30732d3133372d31332d3238342d3133632d3134362c302d3136312c32352d3339332d313620632d3233322d34312d3331352d33312d3432322d3132632d3130372c31382d3235302c36382d3338392c3734732d3433322c32342d3433322c31332063302d31332c3435382d32352c3437332d37316331322d33372d3137322d35342d3338372d333820632d3231352c31362d3339352d31342d3536382d3139632d3137322d342d3632302c372d3632312c343120632d312c33342c3331392c33322c3332312c353163302c392d3539382d31322d3539382d3132482d33367632376834373820433434322c3430332c3535332c3430342c3636382c3430347a222f3e203c616e696d6174654d6f74696f6e20706174683d224d20302030204c202d33373530203430205a22206475723d22323530732220726570656174436f756e743d22696e646566696e69746522202f3e203c2f673e203c70617468206f7061636974793d22302e3235222066696c6c3d22234d3137362c38373363302c302d39322c32352d38392c33382063332c31332c34332c312c35362d38433135372c3839352c3137362c3837332c3137362c3837337a4d3331322e3235362c3631392e323234632d322e3138362d31382e3438362d31302e3434382d32372e3539322d32312e3032372d33312e3235632d312e3238362d302e3131392d322e3534332d302e3230332d332e3737332d302e323436632d38302e3631312d322e3836332d3230352e3836322c39342e3438392d3239322e3637312c3130302e323131632d31352e3235352c312e3030372d33302e3632372d302e3230342d34362e3139332d322e393831763336392e3437394838332e323932433238332e3837312c3838362e3837312c3331382e3236322c3637302e30362c3331322e3235362c3631392e3232347a4d2d36382c313038326c313135372c366c2d31392d35373763302c302d33392d362d3131372d3620732d3130322c382d3138352c3136732d3131382c382d3138332c38732d3138312d32312d3333312d3231732d3238362c34322d3238362c3432204c2d36382c313038327a4d3433312e3734312c3533372e373234203337312e38352c3436372e303936203332312e3538322c3531372e333634203235342e3835392c3434322e333631203136302e31312c3533372e3130394d3138382c3930306c2d31342d32316c2d342c312063302c302c372c31392c372c3230632d302c302d362c312d362c316c2d31382d366c2d322d31376c2d332c31336c2d382d3231206c2d332c326c302c31336c2d34332c31326c2d362c396c2d34332c366c2d362c366c36372c316c392d3020433134322c3932322c3137302c3931332c3138382c3930307a4d2d33392c313031366c313138312c343063302c302d31382d3530322d37372d34383520632d3138352c35322d3231312d34302d3337372d3232632d37372c382d3230332c33372d3338302c323520632d3138322d31322d3332372c31342d3333302c32324c2d33392c313031367a4d3234342c353537203233382c343838203234382c343838203233382c343133203239382c333938203239362c333839203432342c343037203430312c343834203339312c343837203338332c3535354d3132382c38393763342c312c382c362c31352c372063382d352c31352d31312c32302d313763302d322c312d352c312d3663302d302c302d302c302d302063302d302c302d302c302d3063322d332c352d342c372d3363302d302c302d312c312d3120632d322d322d382d312d31322c34632d332c352d362c362d362c36632d322c302d332c302d342c3020632d302d302d302d302d302d30632d302d322d332d342d362d346c2d302d326c2d332c316c302c3220632d322c312d332c342d322c3763302c302c302c302c302c30632d342c312d31312c322d31362c3220632d382d302d382c362d382c366c392d32433132352c3839362c3132372c3839362c3132382c3839377a3c7376672076657273696f6e3d22312e31222069643d224c617965725f322220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f7376672220786d6c6e733a786c696e6b3d22687474703a2f2f7777772e77332e6f72672f313939392f786c696e6b2220783d223070782220793d22307078222077696474683d2231303030707822206865696768743d22313030307078222076696577426f783d22302030203130303020313030302220656e61626c652d6261636b67726f756e643d226e657720302030203130303020313030302220786d6c3a73706163653d227072657365727665223e203c6c696e6561724772616469656e742069643d226d61696e4772616469656e7422206772616469656e74556e6974733d227573657253706163654f6e557365222078313d222d3136322e33393932222079313d223131382e30393934222078323d222d3136322e33393933222079323d22313131372e3931303422206772616469656e745472616e73666f726d3d226d6174726978283120302030202d31203636322e3339393920313131382e3039393129223e203c73746f70206f66667365743d22302e363422207374796c653d2273746f702d636f6c6f723a234d3230392c35313163302d302c33362d382c33362d38207331302d312c31312d317331372d31352c31372d313673302d362c302d366c31392d30762d3668396c312d366834762d312068363776326835763463302c302c31312d312c31312c3073302c382c302c3868323076366c31382c3138683776313076373048323039204c3230392c3531317a4d3733302e3639362c3639352e353231632d31342e36362d36342e3233342c35342e3437392d38332e3534392c35332e3733382d38332e363638632d37342e3737332d31302e3438362d3137362e3336352c33302e3036382d3234312e3939382c33322e383931632d36352e31382c322e3830362d3230362e3231392d35322e3138342d3235312e3133392d35362e3733396331302e3534372c332e3637342c31382e3737372c31322e3737362c32302e3935392c33312e32323363352e3731312c34382e3334322d32352e3131342c3234362e3736382d3230302e3633322c3431302e3231356c3537322e3034382c362e39393268302e323436633135372e3735342d35352e3330332c3333362e3633312d3132362e3337372c3333362e3633312d3136342e33343243313032302e3534392c3830342e3137372c3734372e3436372c3736382e3936382c3733302e3639362c3639352e3532317a4d3133352c393037203136342c393133203136342c393135203137312c393135203134352c393239203131322c393332203134352c393235203136302c393136203135312c393132203134352c393134203134372c3931314d313233312e3034392c3631342e373738632d3130362e312d332e3130392d3237302e3936332c3130322e3730342d3338352e3232332c3130382e393235632d3131342e3235382c362e3232392d3233332e3431382d36352e3335342d3337372e30362d38372e313339632d39392e3934382d31352e3135382d3233392e3238312c33332e34342d3332382e3535322c33362e373531632d38392e3236392c332e3331332d3238352e3630392d36332e3639362d3333382e3837372d36352e333236632d3130372e3133322d332e3237372d31342e38392c3533342e3639382d31342e38392c3533342e3639386c313132302e3030312d32302e363232433930362e3434392c313132322e3036342c313333372e3134372c3631372e3838392c313233312e3034392c3631342e3737387a4d313134302c313031336c2d313138312c343063302c302d33372d3530372c32332d343936633138392c33342c3331352d342c3438322c3133206337372c382c3230352c35312c3339312d3231633137302d36362c3237302c36312c3237332c36394c313134302c313031337a4d3138392c393035203130302c3932312039362c393434203130372c393235203139362c39303922207d2c207b202274726169745f74797065223a202253756e222c202276616c7565223a20224d3536392c37303220632d38312c342d3136372d35312d3237302d3638632d39302d31342d3238322c35312d3339312c36386c2d362c3330316c302c386837353020433834312c3837312c3837342c3638372c3836382c363434632d322d31352d392d32332d31392d3236632d312d302d322d302d332d3020433736392c3631352c3635312c3639382c3536392c3730327aa26469706673582212203f330052506af68832c77f5e07df0efbf225ff3cf26fc62dd9c5d62fd828f77264736f6c63430008070033

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

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