ETH Price: $3,509.44 (+2.78%)
Gas: 4 Gwei

Token

SCRAWL (SCRAWL)
 

Overview

Max Total Supply

117 SCRAWL

Holders

72

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
mongoon.eth
Balance
1 SCRAWL
0x5b5b71687e7cb013ae35ac9928dbd5393ea36c63
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Scrawl

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion
File 1 of 6 : Scrawl.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

import "./AnonymiceLibrary.sol";
import "solmate/tokens/ERC721.sol";
import "openzeppelin-contracts/access/Ownable.sol";
import "openzeppelin-contracts/utils/cryptography/MerkleProof.sol";

interface IScrawlArt {
    function scrawlArtCode() external view returns (string memory);
}

contract Scrawl is ERC721, Ownable {
    /*
 ▄▀▀▀▀▄  ▄▀▄▄▄▄   ▄▀▀▄▀▀▀▄  ▄▀▀█▄   ▄▀▀▄    ▄▀▀▄  ▄▀▀▀▀▄                                                       
█ █   ▐ █ █    ▌ █   █   █ ▐ ▄▀ ▀▄ █   █    ▐  █ █    █                                                        
   ▀▄   ▐ █      ▐  █▀▀█▀    █▄▄▄█ ▐  █        █ ▐    █                                                        
▀▄   █    █       ▄▀    █   ▄▀   █   █   ▄    █      █                                                         
 █▀▀▀    ▄▀▄▄▄▄▀ █     █   █   ▄▀     ▀▄▀ ▀▄ ▄▀    ▄▀▄▄▄▄▄▄▀                                                   
 ▐      █     ▐  ▐     ▐   ▐   ▐            ▀      █                                                           
        ▐                                          ▐                                                           
 ▄▀▀█▄▄   ▄▀▀▄ ▀▀▄      ▄▀▀▄▀▀▀▄  ▄▀▀█▀▄   ▄▀▀▄  ▄▀▄  ▄▀▀█▄▄▄▄  ▄▀▀▀▀▄   ▄▀▀▄    ▄▀▀▄  ▄▀▀█▄   ▄▀▀▄ ▀▄  ▄▀▀▄ █ 
▐ ▄▀   █ █   ▀▄ ▄▀     █   █   █ █   █  █ █    █   █ ▐  ▄▀   ▐ █    █   █   █    ▐  █ ▐ ▄▀ ▀▄ █  █ █ █ █  █ ▄▀ 
  █▄▄▄▀  ▐     █       ▐  █▀▀▀▀  ▐   █  ▐ ▐     ▀▄▀    █▄▄▄▄▄  ▐    █   ▐  █        █   █▄▄▄█ ▐  █  ▀█ ▐  █▀▄  
  █   █        █          █          █         ▄▀ █    █    ▌      █      █   ▄    █   ▄▀   █   █   █    █   █ 
 ▄▀▄▄▄▀      ▄▀         ▄▀        ▄▀▀▀▀▀▄     █  ▄▀   ▄▀▄▄▄▄     ▄▀▄▄▄▄▄▄▀ ▀▄▀ ▀▄ ▄▀  █   ▄▀  ▄▀   █   ▄▀   █  
█    ▐       █         █         █       █  ▄▀  ▄▀    █    ▐     █               ▀    ▐   ▐   █    ▐   █    ▐  
▐            ▐         ▐         ▐       ▐ █    ▐     ▐          ▐                            ▐        ▐       
*/
    using AnonymiceLibrary for uint8;

    struct Trait {
        string traitName;
        string traitType;
    }

    struct HashNeeds {
        uint16 startHash;
        uint16 startNonce;
    }

    // address for p5 code stored in separate contract
    address public scrawlArt;

    //Mappings
    mapping(uint256 => Trait[]) public traitTypes;
    mapping(address => uint256) private lastWrite;

    //Mint Checks
    mapping(address => bool) addressCircSaleMinted;
    mapping(address => bool) addressFreelistMinted;
    mapping(address => bool) addressAllowlistMinted;
    uint256 public totalSupply = 0;

    //uint256s
    uint256 public constant MAX_SUPPLY = 420;
    uint256 public constant CIRCOLORS_PRESALE_COST = 0.0256 ether;
    uint256 public constant GENERAL_MINT_COST = 0.0365 ether;

    //public mint start timestamp
    uint256 public SALE_START;

    bool initStart = false;

    mapping(uint256 => HashNeeds) tokenIdToHashNeeds;
    uint16 SEED_NONCE = 0;

    //minting flag
    bool griffMinted = false;
    bool public MINTING_LIVE = false;

    //uint arrays
    uint16[][7] TIERS;

    //p5js url
    string p5jsUrl =
        "https%3A%2F%2Fcdnjs.cloudflare.com%2Fajax%2Flibs%2Fp5.js%2F1.4.0%2Fp5.js";
    string p5jsIntegrity =
        "sha256-maU2GxaUCz5WChkAGR40nt9sbWRPEfF8qo%2FprxhoKPQ%3D";
    string animationUrl =
        "https://circolors.mypinata.cloud/ipfs/QmayAdMcP5QpWRcjf8W8hkcWLipLEMcNcm1XatTwLBP1zG?x=";
    string imageUrl = "https://scrawl-by-pixelwank.s3.amazonaws.com/output/";

    bytes32 constant circPresaleRoot =
        0xf18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f62;
    bytes32 constant freelistRoot =
        0x246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd8;

    bytes32 constant generalMintlistRoot =
        0xd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c2;

    constructor(address _scrawlArt) payable ERC721("SCRAWL", "SCRAWL") {
        scrawlArt = _scrawlArt;
        //Declare all the rarity tiers

        //Palettes
        TIERS[0] = [
            250,
            500,
            500,
            500,
            500,
            750,
            500,
            250,
            500,
            500,
            500,
            250,
            600,
            750,
            500,
            500,
            500,
            250,
            500,
            500,
            400
        ];
        //Bg
        TIERS[1] = [5500, 3500, 700, 300];
        //Depth
        TIERS[2] = [1000, 3500, 5500];
        //Passes
        TIERS[3] = [4200, 3300, 2000, 500];
        //Tidy
        TIERS[4] = [5000, 5000];
        //Shape
        TIERS[5] = [7500, 500, 700, 1300];
        //Border
        TIERS[6] = [2500, 2000, 500, 5000];
    }

    //prevents someone calling read functions the same block they mint
    modifier disallowIfStateIsChanging() {
        require(
            owner() == msg.sender || lastWrite[msg.sender] < block.number,
            "not so fast!"
        );
        _;
    }

    /*
 __    __     __     __   __     ______   __     __   __     ______    
/\ "-./  \   /\ \   /\ "-.\ \   /\__  _\ /\ \   /\ "-.\ \   /\  ___\   
\ \ \-./\ \  \ \ \  \ \ \-.  \  \/_/\ \/ \ \ \  \ \ \-.  \  \ \ \__ \  
 \ \_\ \ \_\  \ \_\  \ \_\\"\_\    \ \_\  \ \_\  \ \_\\"\_\  \ \_____\ 
  \/_/  \/_/   \/_/   \/_/ \/_/     \/_/   \/_/   \/_/ \/_/   \/_____/ 
                                                                                                                                                                                                                                               
   */

    /**
     * @dev Converts a digit from 0 - 10000 into its corresponding rarity based on the given rarity tier.
     * @param _randinput The input from 0 - 10000 to use for rarity gen.
     * @param _rarityTier The tier to use.
     */
    function rarityGen(uint256 _randinput, uint8 _rarityTier)
        internal
        view
        returns (uint8)
    {
        uint16 currentLowerBound = 0;

        uint256 length = TIERS[_rarityTier].length;
        for (uint8 i = 0; i < length; i++) {
            uint16 thisPercentage = TIERS[_rarityTier][i];
            if (
                _randinput >= currentLowerBound &&
                _randinput < currentLowerBound + thisPercentage
            ) return i;
            currentLowerBound = currentLowerBound + thisPercentage;
        }

        revert();
    }

    /**
     * @param _a The address to be used within the hash.
     */
    function hash(address _a) internal view returns (uint16) {
        uint16 _randinput = uint16(
            uint256(
                keccak256(
                    abi.encodePacked(block.timestamp, block.difficulty, _a)
                )
            ) % 10000
        );

        return _randinput;
    }

    function buildHash(uint256 _t) internal view returns (string memory) {
        // This will generate a 8 character string.
        string memory currentHash = "";
        uint256 rInput = tokenIdToHashNeeds[_t].startHash;
        uint256 _nonce = tokenIdToHashNeeds[_t].startNonce;

        for (uint8 i = 0; i < 7; i++) {
            ++_nonce;
            uint16 _randinput = uint16(
                uint256(keccak256(abi.encodePacked(rInput, _t, _nonce))) % 10000
            );

            if (i == 0) {
                uint8 rar = rarityGen(_randinput, i);
                if (rar > 9) {
                    currentHash = string(
                        abi.encodePacked(currentHash, rar.toString())
                    );
                } else {
                    currentHash = string(
                        abi.encodePacked(currentHash, "0", rar.toString())
                    );
                }
            } else {
                currentHash = string(
                    abi.encodePacked(
                        currentHash,
                        rarityGen(_randinput, i).toString()
                    )
                );
            }
        }
        return currentHash;
    }

    /**
     * @dev Mint internal, this is to avoid code duplication.
     */
    function mintInternal() internal {
        require(
            MINTING_LIVE == true || msg.sender == owner(),
            "Minting not live"
        );
        require(initStart, "Minting not begun");
        require(block.timestamp < SALE_START + 72 hours, "Minting over");

        uint256 thisTokenId = totalSupply;

        require(thisTokenId < MAX_SUPPLY, "Minted out");

        tokenIdToHashNeeds[thisTokenId] = HashNeeds(
            hash(msg.sender),
            SEED_NONCE
        );

        lastWrite[msg.sender] = block.number;
        SEED_NONCE += 8;

        _mint(msg.sender, thisTokenId);
        ++totalSupply;
    }

    function mintGriff() external {
        require(!griffMinted, "You already minted knobhead");
        require(msg.sender == 0xdb4782d463628cc5b1de8f1220f755BA3bA4728E);

        uint256 firstId = totalSupply;
        require(firstId + 5 < MAX_SUPPLY, "Minted out");

        for (uint256 i = 0; i < 5; i++) {
            tokenIdToHashNeeds[firstId + i] = HashNeeds(
                hash(msg.sender),
                SEED_NONCE
            );

            SEED_NONCE += 8;

            _mint(msg.sender, firstId + i);
        }
        totalSupply += 5;
        griffMinted = true;
    }

    /**
     * @dev Mints new tokens.
     */
    function mintCircolorsPresale(
        address account,
        bytes32[] calldata merkleProof
    ) external payable {
        // Check address is on the merkle root
        bytes32 node = keccak256(abi.encodePacked(account));
        require(
            MerkleProof.verify(merkleProof, circPresaleRoot, node),
            "Not on Circolors Presale list"
        );
        require(account == msg.sender, "Self mint only");
        require(msg.value == CIRCOLORS_PRESALE_COST, "Mint is 0.0256eth");
        require(
            addressCircSaleMinted[msg.sender] != true,
            "Address already minted presale"
        );

        addressCircSaleMinted[msg.sender] = true;
        return mintInternal();
    }

    function mintFreelist(address account, bytes32[] calldata merkleProof)
        external
        payable
    {
        bytes32 node = keccak256(abi.encodePacked(account));
        require(
            MerkleProof.verify(merkleProof, freelistRoot, node),
            "Not on Free mint list"
        );
        require(account == msg.sender, "Self mint only");
        require(
            addressFreelistMinted[msg.sender] != true,
            "Address already free minted"
        );

        addressFreelistMinted[msg.sender] = true;
        return mintInternal();
    }

    function mintAllowlist(address account, bytes32[] calldata merkleProof)
        external
        payable
    {
        bytes32 node = keccak256(abi.encodePacked(account));
        require(
            MerkleProof.verify(merkleProof, generalMintlistRoot, node),
            "Not on Allowlist"
        );
        require(account == msg.sender, "Self mint only");
        require(msg.value == GENERAL_MINT_COST, "Mint is 0.0365eth");
        require(
            addressAllowlistMinted[msg.sender] != true,
            "Address already minted allow list"
        );
        require(
            block.timestamp > SALE_START + 24 hours,
            "Allowlist mint not started yet"
        );

        addressAllowlistMinted[msg.sender] = true;
        return mintInternal();
    }

    function mintPublic() external payable {
        require(msg.value == GENERAL_MINT_COST, "Mint is 0.0365eth");
        require(
            block.timestamp > SALE_START + 48 hours,
            "Public mint not started"
        );
        return mintInternal();
    }

    /*
 ______     ______     ______     _____     __     __   __     ______    
/\  == \   /\  ___\   /\  __ \   /\  __-.  /\ \   /\ "-.\ \   /\  ___\   
\ \  __<   \ \  __\   \ \  __ \  \ \ \/\ \ \ \ \  \ \ \-.  \  \ \ \__ \  
 \ \_\ \_\  \ \_____\  \ \_\ \_\  \ \____-  \ \_\  \ \_\\"\_\  \ \_____\ 
  \/_/ /_/   \/_____/   \/_/\/_/   \/____/   \/_/   \/_/ \/_/   \/_____/                                                                    
                                                                                           
*/
    function allowlistStart() external view returns (uint256) {
        require(initStart, "Mint start not initiated yet");
        return SALE_START + 24 hours;
    }

    function generalSaleStart() external view returns (uint256) {
        require(initStart, "Mint start not initiated yet");
        return SALE_START + 48 hours;
    }

    function mintDeadline() public view returns (uint256) {
        require(initStart, "Mint start not initiated yet");
        return SALE_START + 72 hours;
    }

    /**
     * @dev Hash to HTML function
     */
    function hashToHTML(string memory _hash, uint256 _tokenId)
        external
        view
        disallowIfStateIsChanging
        returns (string memory)
    {
        string memory htmlString = string(
            abi.encodePacked(
                "data:text/html,%3Chtml%3E%3Chead%3E%3Cscript%20src%3D%22",
                p5jsUrl,
                "%22%20integrity%3D%22",
                p5jsIntegrity,
                "%22%20crossorigin%3D%22anonymous%22%3E%0A%3C%2Fscript%3E%0A%3Cstyle%3E%0Abody%20%7B%0A%20%20margin%3A%200%3B%0A%20%20padding%3A%200%3B%0A%20%20background%3A%20%23000%3B%0A%20%20overflow%3A%20hidden%3B%0A%7D%0A%0A%23fs%20%7B%0A%20%20position%3A%20fixed%3B%0A%20%20top%3A%200%3B%0A%20%20right%3A%200%3B%0A%20%20bottom%3A%200%3B%0A%20%20left%3A%200%3B%0A%20%20background-color%3A%20black%3B%0A%20%20display%3A%20flex%3B%0A%20%20justify-content%3A%20center%3B%0A%20%20align-items%3A%20center%3B%0A%7D%0A%0A%23fs%20canvas%20%7B%0A%20%20object-fit%3A%20contain%3B%0A%20%20max-height%3A%20100%25%3B%0A%20%20max-width%3A%20100%25%3B%0A%7D%0A%3C%2Fstyle%3E%3C%2Fhead%3E%3Cbody%3E%3Cdiv%20id%3D%22fs%22%3E%3C%2Fdiv%3E%3Cscript%3Evar%20tI%3D",
                AnonymiceLibrary.toString(_tokenId),
                "%3Bvar%20h%3D%22",
                _hash,
                "%22%3B"
            )
        );

        string memory artCode = IScrawlArt(scrawlArt).scrawlArtCode();

        htmlString = string(abi.encodePacked(htmlString, artCode));

        return htmlString;
    }

    /**
     * @dev Hash to metadata function
     */
    function hashToMetadata(string memory _hash)
        public
        view
        disallowIfStateIsChanging
        returns (string memory)
    {
        string memory metadataString;

        uint8 paletteTraitIndex = AnonymiceLibrary.parseInt(
            AnonymiceLibrary.substring(_hash, 0, 2)
        );

        metadataString = string(
            abi.encodePacked(
                metadataString,
                '{"trait_type":"',
                traitTypes[0][paletteTraitIndex].traitType,
                '","value":"',
                traitTypes[0][paletteTraitIndex].traitName,
                '"},'
            )
        );

        for (uint8 i = 2; i < 7; i++) {
            uint8 thisTraitIndex = AnonymiceLibrary.parseInt(
                AnonymiceLibrary.substring(_hash, i, i + 1)
            );

            metadataString = string(
                abi.encodePacked(
                    metadataString,
                    '{"trait_type":"',
                    traitTypes[i][thisTraitIndex].traitType,
                    '","value":"',
                    traitTypes[i][thisTraitIndex].traitName,
                    '"}'
                )
            );

            if (i != 6)
                metadataString = string(abi.encodePacked(metadataString, ","));
        }

        return string(abi.encodePacked("[", metadataString, "]"));
    }

    /**
     * @dev Returns the image and metadata for a token Id
     * @param _tokenId The tokenId to return the image and metadata for.
     */
    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(_tokenId < totalSupply, "non existant id");

        string memory tokenHash = _tokenIdToHash(_tokenId);

        string
            memory description = '", "description": "420 SCRAWL pieces by pixelwank x Circolors. Traits generated on chain & metadata, images mirrored on chain permanently.",';

        string memory encodedTokenId = AnonymiceLibrary.encode(
            bytes(string(abi.encodePacked(AnonymiceLibrary.toString(_tokenId))))
        );
        string memory encodedHash = AnonymiceLibrary.encode(
            bytes(string(abi.encodePacked(tokenHash)))
        );

        return
            string(
                abi.encodePacked(
                    "data:application/json;base64,",
                    AnonymiceLibrary.encode(
                        bytes(
                            string(
                                abi.encodePacked(
                                    '{"name": "SCRAWL #',
                                    AnonymiceLibrary.toString(_tokenId),
                                    description,
                                    '"animation_url":"',
                                    animationUrl,
                                    encodedTokenId,
                                    "&t=",
                                    encodedHash,
                                    '","image":"',
                                    imageUrl,
                                    AnonymiceLibrary.toString(_tokenId),
                                    '.png","attributes":',
                                    hashToMetadata(tokenHash),
                                    "}"
                                )
                            )
                        )
                    )
                )
            );
    }

    /**
     * @dev Returns a hash for a given tokenId
     * @param _tokenId The tokenId to return the hash for.
     */
    function _tokenIdToHash(uint256 _tokenId)
        public
        view
        disallowIfStateIsChanging
        returns (string memory)
    {
        require(_tokenId < totalSupply, "non existant id");
        string memory tokenHash = buildHash(_tokenId);

        return tokenHash;
    }

    /*
 ______     __     __     __   __     ______     ______    
/\  __ \   /\ \  _ \ \   /\ "-.\ \   /\  ___\   /\  == \   
\ \ \/\ \  \ \ \/ ".\ \  \ \ \-.  \  \ \  __\   \ \  __<   
 \ \_____\  \ \__/".~\_\  \ \_\\"\_\  \ \_____\  \ \_\ \_\ 
  \/_____/   \/_/   \/_/   \/_/ \/_/   \/_____/   \/_/ /_/ 
                                                           
    /**
     * @dev Add a trait type
     * @param _traitTypeIndex The trait type index
     * @param traits Array of traits to add
     */

    function addTraitType(uint256 _traitTypeIndex, Trait[] calldata traits)
        external
        payable
        onlyOwner
    {
        for (uint256 i = 0; i < traits.length; i++) {
            traitTypes[_traitTypeIndex].push(
                Trait(traits[i].traitName, traits[i].traitType)
            );
        }

        return;
    }

    function initStartTimes() external onlyOwner {
        require(!initStart, "mint time already started");
        SALE_START = block.timestamp;
        MINTING_LIVE = true;
        initStart = true;
    }

    function flipMintingSwitch() external payable onlyOwner {
        MINTING_LIVE = !MINTING_LIVE;
    }

    /**
     * @dev Sets the p5js url
     * @param _p5jsUrl The address of the p5js file hosted on CDN
     */

    function setJsAddress(string memory _p5jsUrl) external payable onlyOwner {
        p5jsUrl = _p5jsUrl;
    }

    /**
     * @dev Sets the p5js resource integrity
     * @param _p5jsIntegrity The hash of the p5js file (to protect w subresource integrity)
     */

    function setJsIntegrity(string memory _p5jsIntegrity)
        external
        payable
        onlyOwner
    {
        p5jsIntegrity = _p5jsIntegrity;
    }

    /**
     * @dev Sets the base image url
     * @param _imageUrl The base url for image field
     */

    function setImageUrl(string memory _imageUrl) external payable onlyOwner {
        imageUrl = _imageUrl;
    }

    function setAnimationUrl(string memory _animationUrl)
        external
        payable
        onlyOwner
    {
        animationUrl = _animationUrl;
    }

    function withdraw() external payable onlyOwner {
        uint256 sixty = (address(this).balance / 100) * 60;
        uint256 twentyFive = (address(this).balance / 100) * 25;
        uint256 ten = (address(this).balance / 100) * 10;
        uint256 five = (address(this).balance / 100) * 5;
        (bool sentT, ) = payable(
            address(0xE4260Df86f5261A41D19c2066f1Eb2Eb4F009e84)
        ).call{value: twentyFive}("");
        require(sentT, "Failed to send");
        (bool sentI, ) = payable(
            address(0x4533d1F65906368ebfd61259dAee561DF3f3559D)
        ).call{value: ten}("");
        require(sentI, "Failed to send");
        (bool sentC, ) = payable(
            address(0x888f8AA938dbb18b28bdD111fa4A0D3B8e10C871)
        ).call{value: five}("");
        require(sentC, "Failed to send");
        (bool sentG, ) = payable(
            address(0xdb4782d463628cc5b1de8f1220f755BA3bA4728E)
        ).call{value: sixty}("");
        require(sentG, "Failed to send");
    }
}

File 2 of 6 : AnonymiceLibrary.sol
pragma solidity ^0.8.0;

library AnonymiceLibrary {
    string internal constant TABLE =
        "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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

        // load the table into memory
        string memory table = TABLE;

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

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

        assembly {
            // set the actual output length
            mstore(result, encodedLen)

            // prepare the lookup table
            let tablePtr := add(table, 1)

            // input ptr
            let dataPtr := data
            let endPtr := add(dataPtr, mload(data))

            // result ptr, jump over length
            let resultPtr := add(result, 32)

            // run over the input, 3 bytes at a time
            for {

            } lt(dataPtr, endPtr) {

            } {
                dataPtr := add(dataPtr, 3)

                // read 3 bytes
                let input := mload(dataPtr)

                // write 4 characters
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(18, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(12, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(shr(6, input), 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
                mstore(
                    resultPtr,
                    shl(248, mload(add(tablePtr, and(input, 0x3F))))
                )
                resultPtr := add(resultPtr, 1)
            }

            // padding with '='
            switch mod(mload(data), 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }
        }

        return result;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    function parseInt(string memory _a)
        internal
        pure
        returns (uint8 _parsedInt)
    {
        bytes memory bresult = bytes(_a);
        uint8 mint = 0;
        for (uint8 i = 0; i < bresult.length; i++) {
            if (
                (uint8(uint8(bresult[i])) >= 48) &&
                (uint8(uint8(bresult[i])) <= 57)
            ) {
                mint *= 10;
                mint += uint8(bresult[i]) - 48;
            }
        }
        return mint;
    }

    function substring(
        string memory str,
        uint256 startIndex,
        uint256 endIndex
    ) internal pure returns (string memory) {
        bytes memory strBytes = bytes(str);
        bytes memory result = new bytes(endIndex - startIndex);
        for (uint256 i = startIndex; i < endIndex; i++) {
            result[i - startIndex] = strBytes[i];
        }
        return string(result);
    }

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

File 3 of 6 : ERC721.sol
// SPDX-License-Identifier: AGPL-3.0-only
pragma solidity >=0.8.0;

/// @notice Modern, minimalist, and gas efficient ERC-721 implementation.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721 {
    /*//////////////////////////////////////////////////////////////
                                 EVENTS
    //////////////////////////////////////////////////////////////*/

    event Transfer(address indexed from, address indexed to, uint256 indexed id);

    event Approval(address indexed owner, address indexed spender, uint256 indexed id);

    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /*//////////////////////////////////////////////////////////////
                         METADATA STORAGE/LOGIC
    //////////////////////////////////////////////////////////////*/

    string public name;

    string public symbol;

    function tokenURI(uint256 id) public view virtual returns (string memory);

    /*//////////////////////////////////////////////////////////////
                      ERC721 BALANCE/OWNER STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) internal _ownerOf;

    mapping(address => uint256) internal _balanceOf;

    function ownerOf(uint256 id) public view virtual returns (address owner) {
        require((owner = _ownerOf[id]) != address(0), "NOT_MINTED");
    }

    function balanceOf(address owner) public view virtual returns (uint256) {
        require(owner != address(0), "ZERO_ADDRESS");

        return _balanceOf[owner];
    }

    /*//////////////////////////////////////////////////////////////
                         ERC721 APPROVAL STORAGE
    //////////////////////////////////////////////////////////////*/

    mapping(uint256 => address) public getApproved;

    mapping(address => mapping(address => bool)) public isApprovedForAll;

    /*//////////////////////////////////////////////////////////////
                               CONSTRUCTOR
    //////////////////////////////////////////////////////////////*/

    constructor(string memory _name, string memory _symbol) {
        name = _name;
        symbol = _symbol;
    }

    /*//////////////////////////////////////////////////////////////
                              ERC721 LOGIC
    //////////////////////////////////////////////////////////////*/

    function approve(address spender, uint256 id) public virtual {
        address owner = _ownerOf[id];

        require(msg.sender == owner || isApprovedForAll[owner][msg.sender], "NOT_AUTHORIZED");

        getApproved[id] = spender;

        emit Approval(owner, spender, id);
    }

    function setApprovalForAll(address operator, bool approved) public virtual {
        isApprovedForAll[msg.sender][operator] = approved;

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

    function transferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        require(from == _ownerOf[id], "WRONG_FROM");

        require(to != address(0), "INVALID_RECIPIENT");

        require(
            msg.sender == from || isApprovedForAll[from][msg.sender] || msg.sender == getApproved[id],
            "NOT_AUTHORIZED"
        );

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        unchecked {
            _balanceOf[from]--;

            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

        delete getApproved[id];

        emit Transfer(from, to, id);
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        bytes calldata data
    ) public virtual {
        transferFrom(from, to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, from, id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    /*//////////////////////////////////////////////////////////////
                              ERC165 LOGIC
    //////////////////////////////////////////////////////////////*/

    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return
            interfaceId == 0x01ffc9a7 || // ERC165 Interface ID for ERC165
            interfaceId == 0x80ac58cd || // ERC165 Interface ID for ERC721
            interfaceId == 0x5b5e139f; // ERC165 Interface ID for ERC721Metadata
    }

    /*//////////////////////////////////////////////////////////////
                        INTERNAL MINT/BURN LOGIC
    //////////////////////////////////////////////////////////////*/

    function _mint(address to, uint256 id) internal virtual {
        require(to != address(0), "INVALID_RECIPIENT");

        require(_ownerOf[id] == address(0), "ALREADY_MINTED");

        // Counter overflow is incredibly unrealistic.
        unchecked {
            _balanceOf[to]++;
        }

        _ownerOf[id] = to;

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

    function _burn(uint256 id) internal virtual {
        address owner = _ownerOf[id];

        require(owner != address(0), "NOT_MINTED");

        // Ownership check above ensures no underflow.
        unchecked {
            _balanceOf[owner]--;
        }

        delete _ownerOf[id];

        delete getApproved[id];

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

    /*//////////////////////////////////////////////////////////////
                        INTERNAL SAFE MINT LOGIC
    //////////////////////////////////////////////////////////////*/

    function _safeMint(address to, uint256 id) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, "") ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }

    function _safeMint(
        address to,
        uint256 id,
        bytes memory data
    ) internal virtual {
        _mint(to, id);

        require(
            to.code.length == 0 ||
                ERC721TokenReceiver(to).onERC721Received(msg.sender, address(0), id, data) ==
                ERC721TokenReceiver.onERC721Received.selector,
            "UNSAFE_RECIPIENT"
        );
    }
}

/// @notice A generic interface for a contract which properly accepts ERC721 tokens.
/// @author Solmate (https://github.com/transmissions11/solmate/blob/main/src/tokens/ERC721.sol)
abstract contract ERC721TokenReceiver {
    function onERC721Received(
        address,
        address,
        uint256,
        bytes calldata
    ) external virtual returns (bytes4) {
        return ERC721TokenReceiver.onERC721Received.selector;
    }
}

File 4 of 6 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

File 5 of 6 : MerkleProof.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The tree and the proofs can be generated using our
 * https://github.com/OpenZeppelin/merkle-tree[JavaScript library].
 * You will find a quickstart guide in the readme.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 * OpenZeppelin's JavaScript library generates merkle trees that are safe
 * against this attack out of the box.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be simultaneously proven to be a part of a merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and sibling nodes in `proof`. The reconstruction
     * proceeds by incrementally reconstructing all inner nodes by combining a leaf/inner node with either another
     * leaf/inner node or a proof sibling node, depending on whether each `proofFlags` item is true or false
     * respectively.
     *
     * CAUTION: Not all merkle trees admit multiproofs. To use multiproofs, it is sufficient to ensure that: 1) the tree
     * is complete (but not necessarily perfect), 2) the leaves to be proven are in the opposite order they are in the
     * tree (i.e., as seen from right to left starting at the deepest layer and continuing at the next layer).
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}.
     *
     * CAUTION: Not all merkle trees admit multiproofs. See {processMultiProof} for details.
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

File 6 of 6 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

Settings
{
  "remappings": [
    "ds-test/=lib/forge-std/lib/ds-test/src/",
    "erc4626-tests/=lib/openzeppelin-contracts/lib/erc4626-tests/",
    "forge-std/=lib/forge-std/src/",
    "openzeppelin-contracts/=lib/openzeppelin-contracts/contracts/",
    "solmate/=lib/solmate/src/",
    "src/=src/",
    "test/=test/",
    "script/=script/"
  ],
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "metadata": {
    "bytecodeHash": "ipfs"
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "devdoc",
        "userdoc",
        "metadata",
        "abi"
      ]
    }
  },
  "evmVersion": "london",
  "libraries": {}
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_scrawlArt","type":"address"}],"stateMutability":"payable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"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":"id","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CIRCOLORS_PRESALE_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GENERAL_MINT_COST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTING_LIVE","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SALE_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"_tokenIdToHash","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_traitTypeIndex","type":"uint256"},{"components":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"internalType":"struct Scrawl.Trait[]","name":"traits","type":"tuple[]"}],"name":"addTraitType","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"allowlistStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipMintingSwitch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"generalSaleStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"hashToHTML","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"hashToMetadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"initStartTimes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintAllowlist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintCircolorsPresale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintDeadline","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"bytes32[]","name":"merkleProof","type":"bytes32[]"}],"name":"mintFreelist","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintGriff","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"owner","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"scrawlArt","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_animationUrl","type":"string"}],"name":"setAnimationUrl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_imageUrl","type":"string"}],"name":"setImageUrl","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsUrl","type":"string"}],"name":"setJsAddress","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"string","name":"_p5jsIntegrity","type":"string"}],"name":"setJsIntegrity","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"traitTypes","outputs":[{"internalType":"string","name":"traitName","type":"string"},{"internalType":"string","name":"traitType","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6000600d55600f805460ff191690556011805463ffffffff1916905561010060405260486080818152906200454160a03980516200004691601991602090910190620003e6565b506040518060600160405280603781526020016200450a6037913980516200007791601a91602090910190620003e6565b50604051806080016040528060578152602001620045bd605791398051620000a891601b91602090910190620003e6565b5060405180606001604052806034815260200162004589603491398051620000d991601c91602090910190620003e6565b506040516200461438038062004614833981016040819052620000fc9162000532565b60408051808201825260068082526514d0d49055d360d21b6020808401828152855180870190965292855284015281519192916200013d91600091620003e6565b50805162000153906001906020840190620003e6565b505050620001706200016a6200039060201b60201c565b62000394565b600780546001600160a01b0319166001600160a01b038316179055604080516102a08101825260fa8082526101f46020830181905292820183905260608201839052608082018390526102ee60a0830181905260c0830184905260e0830182905261010083018490526101208301849052610140830184905261016083018290526102586101808401526101a08301526101c082018390526101e08201839052610200820183905261022082015261024081018290526102608101919091526101906102808201526200024890601290601562000475565b506040805160808101825261157c8152610dac60208201526102bc9181019190915261012c60608201526200028290601390600462000475565b50604080516060810182526103e88152610dac602082015261157c91810191909152620002b490601490600362000475565b50604080516080810182526110688152610ce460208201526107d0918101919091526101f46060820152620002ee90601590600462000475565b506040805180820190915261138880825260208201526200031490601690600262000475565b5060408051608081018252611d4c81526101f460208201526102bc9181019190915261051460608201526200034e90601790600462000475565b50604080516080810182526109c481526107d060208201526101f49181019190915261138860608201526200038890601890600462000475565b5050620005a0565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b828054620003f49062000564565b90600052602060002090601f01602090048101928262000418576000855562000463565b82601f106200043357805160ff191683800117855562000463565b8280016001018555821562000463579182015b828111156200046357825182559160200191906001019062000446565b50620004719291506200051b565b5090565b82805482825590600052602060002090600f01601090048101928215620004635791602002820160005b83821115620004e157835183826101000a81548161ffff021916908361ffff16021790555092602001926002016020816001010492830192600103026200049f565b8015620005115782816101000a81549061ffff0219169055600201602081600101049283019260010302620004e1565b5050620004719291505b5b808211156200047157600081556001016200051c565b6000602082840312156200054557600080fd5b81516001600160a01b03811681146200055d57600080fd5b9392505050565b600181811c908216806200057957607f821691505b6020821081036200059a57634e487b7160e01b600052602260045260246000fd5b50919050565b613f5a80620005b06000396000f3fe60806040526004361061025a5760003560e01c80636352211e11610144578063a22cb465116100b6578063d4e780861161007a578063d4e780861461067d578063d9d2628314610692578063e985e9c5146106a5578063f2fde38b146106e0578063f3c81d2a14610700578063f8fb13271461070857600080fd5b8063a22cb465146105f5578063ab81e06214610615578063b88d4fde14610628578063c680691914610648578063c87b56dd1461065d57600080fd5b806372f90ac11161010857806372f90ac11461056957806377b7098b1461058a5780638c874ebd146105a55780638da5cb5b146105ad57806395d89b41146105cb57806395e3f129146105e057600080fd5b80636352211e146104e157806366ba114e1461050157806366e338701461051457806370a0823114610534578063715018a61461055457600080fd5b806322673030116101dd57806332cb6b0c116101a157806332cb6b0c14610460578063349d2748146104765780633cc1251f146104895780633ccfd60b1461049e57806342842e0e146104a657806342d33d25146104c657600080fd5b806322673030146103d657806323b872dd146103ec57806328e56c5e1461040c5780632abff1f21461041f5780632fb098d21461043257600080fd5b8063095ea7b311610224578063095ea7b3146103485780630a3d4cc41461036a57806313fb44bf1461038a57806318160ddd1461039d57806319a260c9146103c157600080fd5b80625ea3071461025f5780626564fd1461029557806301ffc9a7146102cd57806306fdde03146102fd578063081812fc14610312575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612de2565b61071b565b60405161028c9190612e53565b60405180910390f35b3480156102a157600080fd5b506007546102b5906001600160a01b031681565b6040516001600160a01b03909116815260200161028c565b3480156102d957600080fd5b506102ed6102e8366004612e7c565b6107cf565b604051901515815260200161028c565b34801561030957600080fd5b5061027f610821565b34801561031e57600080fd5b506102b561032d366004612de2565b6004602052600090815260409020546001600160a01b031681565b34801561035457600080fd5b50610368610363366004612eb0565b6108af565b005b34801561037657600080fd5b5061027f610385366004612f9d565b610991565b610368610398366004612fe1565b610ab8565b3480156103a957600080fd5b506103b3600d5481565b60405190815260200161028c565b3480156103cd57600080fd5b50610368610ad7565b3480156103e257600080fd5b506103b3600e5481565b3480156103f857600080fd5b50610368610407366004613015565b610b58565b61036861041a366004612fe1565b610d1f565b61036861042d366004612fe1565b610d3a565b34801561043e57600080fd5b5061045261044d366004613051565b610d55565b60405161028c929190613073565b34801561046c57600080fd5b506103b36101a481565b6103686104843660046130ec565b610ea6565b34801561049557600080fd5b506103b361100c565b610368611046565b3480156104b257600080fd5b506103686104c1366004613015565b6112b1565b3480156104d257600080fd5b506103b3665af3107a40000081565b3480156104ed57600080fd5b506102b56104fc366004612de2565b6113a4565b61036861050f366004613137565b6113f6565b34801561052057600080fd5b5061027f61052f366004612fe1565b6115cf565b34801561054057600080fd5b506103b361054f366004613170565b611823565b34801561056057600080fd5b50610368611886565b34801561057557600080fd5b506011546102ed906301000000900460ff1681565b34801561059657600080fd5b506103b36681ac8e7e4d400081565b61036861189a565b3480156105b957600080fd5b506006546001600160a01b03166102b5565b3480156105d757600080fd5b5061027f61194a565b3480156105ec57600080fd5b50610368611957565b34801561060157600080fd5b5061036861061036600461318b565b611b1c565b610368610623366004613137565b611b88565b34801561063457600080fd5b506103686106433660046131c7565b611dbc565b34801561065457600080fd5b506103b3611ea4565b34801561066957600080fd5b5061027f610678366004612de2565b611ed9565b34801561068957600080fd5b506103b3611ffa565b6103686106a0366004612fe1565b61202f565b3480156106b157600080fd5b506102ed6106c0366004613261565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106ec57600080fd5b506103686106fb366004613170565b61204a565b6103686120c3565b610368610716366004613137565b6120ec565b6060336107306006546001600160a01b031690565b6001600160a01b0316148061075357503360009081526009602052604090205443115b6107785760405162461bcd60e51b815260040161076f90613294565b60405180910390fd5b600d5482106107bb5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b60006107c683612273565b9150505b919050565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461082e906132ba565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906132ba565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806108f857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109355760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060336109a66006546001600160a01b031690565b6001600160a01b031614806109c957503360009081526009602052604090205443115b6109e55760405162461bcd60e51b815260040161076f90613294565b60006019601a6109f4856123ee565b86604051602001610a0894939291906133a9565b60408051601f19818403018152828252600754631980070560e11b845291519093506000926001600160a01b03909216916333000e0a91600480830192869291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a8a91908101906137f7565b90508181604051602001610a9f929190613864565b60408051808303601f1901815291905295945050505050565b610ac06124f6565b8051610ad390601a906020840190612d49565b5050565b610adf6124f6565b600f5460ff1615610b325760405162461bcd60e51b815260206004820152601960248201527f6d696e742074696d6520616c7265616479207374617274656400000000000000604482015260640161076f565b42600e556011805463ff00000019166301000000179055600f805460ff19166001179055565b6000818152600260205260409020546001600160a01b03848116911614610bae5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161076f565b6001600160a01b038216610bf85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b336001600160a01b0384161480610c3257506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610c5357506000818152600460205260409020546001600160a01b031633145b610c905760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d276124f6565b8051610ad390601b906020840190612d49565b610d426124f6565b8051610ad390601c906020840190612d49565b60086020528160005260406000208181548110610d7157600080fd5b906000526020600020906002020160009150915050806000018054610d95906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc1906132ba565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b505050505090806001018054610e23906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906132ba565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905082565b610eae6124f6565b60005b8181101561100557600860008581526020019081526020016000206040518060400160405280858585818110610ee957610ee9613893565b9050602002810190610efb91906138a9565b610f0590806138c9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001858585818110610f5157610f51613893565b9050602002810190610f6391906138a9565b610f719060208101906138c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018101855593815260209081902083518051949560020290910193610fd6935084929190910190612d49565b506020828101518051610fef9260018501920190612d49565b5050508080610ffd90613925565b915050610eb1565b505b505050565b600f5460009060ff166110315760405162461bcd60e51b815260040161076f9061393e565b600e546110419062015180613975565b905090565b61104e6124f6565b600061105b6064476139a3565b61106690603c6139b7565b905060006110756064476139a3565b6110809060196139b7565b9050600061108f6064476139a3565b61109a90600a6139b7565b905060006110a96064476139a3565b6110b49060056139b7565b60405190915060009073e4260df86f5261a41d19c2066f1eb2eb4f009e849085908381818185875af1925050503d806000811461110d576040519150601f19603f3d011682016040523d82523d6000602084013e611112565b606091505b50509050806111335760405162461bcd60e51b815260040161076f906139d6565b604051600090734533d1f65906368ebfd61259daee561df3f3559d9085908381818185875af1925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50509050806111af5760405162461bcd60e51b815260040161076f906139d6565b60405160009073888f8aa938dbb18b28bdd111fa4a0d3b8e10c8719085908381818185875af1925050503d8060008114611205576040519150601f19603f3d011682016040523d82523d6000602084013e61120a565b606091505b505090508061122b5760405162461bcd60e51b815260040161076f906139d6565b60405160009073db4782d463628cc5b1de8f1220f755ba3ba4728e9089908381818185875af1925050503d8060008114611281576040519150601f19603f3d011682016040523d82523d6000602084013e611286565b606091505b50509050806112a75760405162461bcd60e51b815260040161076f906139d6565b5050505050505050565b6112bc838383610b58565b6001600160a01b0382163b15806113655750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611335573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135991906139fe565b6001600160e01b031916145b6110075760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b6000818152600260205260409020546001600160a01b0316806107ca5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161076f565b6040516001600160601b0319606085901b16602082015260009060340160405160208183030381529060405280519060200120905061148b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507ff18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f6292508591506125509050565b6114d75760405162461bcd60e51b815260206004820152601d60248201527f4e6f74206f6e20436972636f6c6f72732050726573616c65206c697374000000604482015260640161076f565b6001600160a01b03841633146114ff5760405162461bcd60e51b815260040161076f90613a1b565b665af3107a40000034146115495760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60646a6ccae8d607b1b604482015260640161076f565b336000908152600a602052604090205460ff1615156001036115ad5760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320616c7265616479206d696e7465642070726573616c650000604482015260640161076f565b336000908152600a60205260409020805460ff19166001179055611005612566565b6060336115e46006546001600160a01b031690565b6001600160a01b0316148061160757503360009081526009602052604090205443115b6116235760405162461bcd60e51b815260040161076f90613294565b6060600061163c6116378560006002612754565b612820565b6000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054919250839160ff841690811061168057611680613893565b9060005260206000209060020201600101600860008081526020019081526020016000208360ff16815481106116b8576116b8613893565b90600052602060002090600202016000016040516020016116db93929190613a43565b60408051601f19818403018152919052915060025b60078160ff1610156117f957600061171c6116378760ff8516611714866001613ab1565b60ff16612754565b905083600860008460ff1681526020019081526020016000208260ff168154811061174957611749613893565b9060005260206000209060020201600101600860008560ff1681526020019081526020016000208360ff168154811061178457611784613893565b90600052602060002090600202016000016040516020016117a793929190613ad6565b60405160208183030381529060405293508160ff166006146117e657836040516020016117d49190613b43565b60405160208183030381529060405293505b50806117f181613b68565b9150506116f0565b508160405160200161180b9190613b87565b60405160208183030381529060405292505050919050565b60006001600160a01b03821661186a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161076f565b506001600160a01b031660009081526003602052604090205490565b61188e6124f6565b61189860006128de565b565b6681ac8e7e4d400034146118e45760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b600e546118f4906202a300613975565b42116119425760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74206e6f742073746172746564000000000000000000604482015260640161076f565b611898612566565b6001805461082e906132ba565b60115462010000900460ff16156119b05760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c7265616479206d696e746564206b6e6f62686561640000000000604482015260640161076f565b73db4782d463628cc5b1de8f1220f755ba3ba4728e33146119d057600080fd5b600d546101a46119e1826005613975565b10611a1b5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60005b6005811015611aef576040518060400160405280611a3b33612930565b61ffff90811682526011541660209091015260106000611a5b8486613975565b8152602080820192909252604001600090812083518154949093015161ffff908116620100000263ffffffff199095169381169390931793909317909255601180546008939192611aae91859116613bbb565b92506101000a81548161ffff021916908361ffff160217905550611add338284611ad89190613975565b61298c565b80611ae781613925565b915050611a1e565b506005600d6000828254611b039190613975565b90915550506011805462ff000019166201000017905550565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050611c1d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507fd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c292508591506125509050565b611c5c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081bdb88105b1b1bdddb1a5cdd60821b604482015260640161076f565b6001600160a01b0384163314611c845760405162461bcd60e51b815260040161076f90613a1b565b6681ac8e7e4d40003414611cce5760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b336000908152600c602052604090205460ff161515600103611d3c5760405162461bcd60e51b815260206004820152602160248201527f4164647265737320616c7265616479206d696e74656420616c6c6f77206c69736044820152601d60fa1b606482015260840161076f565b600e54611d4c9062015180613975565b4211611d9a5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f776c697374206d696e74206e6f742073746172746564207965740000604482015260640161076f565b336000908152600c60205260409020805460ff19166001179055611005612566565b611dc7858585610b58565b6001600160a01b0384163b1580611e5e5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611e0f9033908a90899089908990600401613bd8565b6020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906139fe565b6001600160e01b031916145b611e9d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b5050505050565b600f5460009060ff16611ec95760405162461bcd60e51b815260040161076f9061393e565b600e54611041906202a300613975565b6060600d548210611f1e5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b6000611f298361071b565b905060006040518060c00160405280608c8152602001613e99608c913990506000611f7a611f56866123ee565b604051602001611f669190613c2c565b604051602081830303815290604052612a97565b90506000611f9284604051602001611f669190613c2c565b9050611fd0611fa0876123ee565b84601b8585601c611fb08d6123ee565b611fb98c6115cf565b604051602001611f66989796959493929190613c3e565b604051602001611fe09190613d60565b604051602081830303815290604052945050505050919050565b600f5460009060ff1661201f5760405162461bcd60e51b815260040161076f9061393e565b600e54611041906203f480613975565b6120376124f6565b8051610ad3906019906020840190612d49565b6120526124f6565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6120c0816128de565b50565b6120cb6124f6565b6011805463ff00000019811663010000009182900460ff1615909102179055565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506121818383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd892508591506125509050565b6121c55760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdb88119c9959481b5a5b9d081b1a5cdd605a1b604482015260640161076f565b6001600160a01b03841633146121ed5760405162461bcd60e51b815260040161076f90613a1b565b336000908152600b602052604090205460ff1615156001036122515760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320616c72656164792066726565206d696e7465640000000000604482015260640161076f565b336000908152600b60205260409020805460ff19166001179055611005612566565b6040805160208082018352600080835284815260109091529182205460609261ffff8083169262010000900416905b60078160ff1610156123e4576122b782613925565b604080516020810186905290810188905260608101829052909250600090612710906080016040516020818303038152906040528051906020012060001c6122ff9190613da5565b90508160ff1660000361239457600061231c8261ffff1684612bfd565b905060098160ff16111561235e57856123378260ff166123ee565b604051602001612348929190613864565b604051602081830303815290604052955061238e565b8561236b8260ff166123ee565b60405160200161237c929190613db9565b60405160208183030381529060405295505b506123d1565b846123ae6123a68361ffff1685612bfd565b60ff166123ee565b6040516020016123bf929190613864565b60405160208183030381529060405294505b50806123dc81613b68565b9150506122a2565b5091949350505050565b6060816000036124155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561243f578061242981613925565b91506124389050600a836139a3565b9150612419565b6000816001600160401b0381111561245957612459612eda565b6040519080825280601f01601f191660200182016040528015612483576020820181803683370190505b5090505b84156124ee57612498600183613df5565b91506124a5600a86613da5565b6124b0906030613975565b60f81b8183815181106124c5576124c5613893565b60200101906001600160f81b031916908160001a9053506124e7600a866139a3565b9450612487565b949350505050565b6006546001600160a01b031633146118985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60008261255d8584612cd2565b14949350505050565b6011546301000000900460ff1615156001148061258d57506006546001600160a01b031633145b6125cc5760405162461bcd60e51b815260206004820152601060248201526f4d696e74696e67206e6f74206c69766560801b604482015260640161076f565b600f5460ff166126125760405162461bcd60e51b815260206004820152601160248201527026b4b73a34b733903737ba103132b3bab760791b604482015260640161076f565b600e54612622906203f480613975565b421061265f5760405162461bcd60e51b815260206004820152600c60248201526b26b4b73a34b7339037bb32b960a11b604482015260640161076f565b600d546101a481106126a05760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60405180604001604052806126b433612930565b61ffff9081168252601180548216602093840152600085815260108452604080822086518154978701518616620100000263ffffffff19909816908616179690961790955533815260099093529282204390558254600893929161271a91859116613bbb565b92506101000a81548161ffff021916908361ffff16021790555061273e338261298c565b600d6000815461274d90613925565b9091555050565b60608360006127638585613df5565b6001600160401b0381111561277a5761277a612eda565b6040519080825280601f01601f1916602001820160405280156127a4576020820181803683370190505b509050845b84811015612816578281815181106127c3576127c3613893565b01602001516001600160f81b031916826127dd8884613df5565b815181106127ed576127ed613893565b60200101906001600160f81b031916908160001a9053508061280e81613925565b9150506127a9565b5095945050505050565b60008181805b82518160ff1610156128d6576030838260ff168151811061284957612849613893565b016020015160f81c1080159061287c57506039838260ff168151811061287157612871613893565b016020015160f81c11155b156128c45761288c600a83613e0c565b91506030838260ff16815181106128a5576128a5613893565b01602001516128b7919060f81c613e35565b6128c19083613ab1565b91505b806128ce81613b68565b915050612826565b509392505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061271042448560405160200161296993929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c6107c69190613da5565b6001600160a01b0382166129d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b6000818152600260205260409020546001600160a01b031615612a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161076f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608151600003612ab657505060408051602081019091526000815290565b6000604051806060016040528060408152602001613e596040913990506000600384516002612ae59190613975565b612aef91906139a3565b612afa9060046139b7565b90506000612b09826020613975565b6001600160401b03811115612b2057612b20612eda565b6040519080825280601f01601f191660200182016040528015612b4a576020820181803683370190505b509050818152600183018586518101602084015b81831015612bb85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612b5e565b600389510660018114612bd25760028114612be357612bef565b613d3d60f01b600119830152612bef565b603d60f81b6000198301525b509398975050505050505050565b60008080601260ff851660078110612c1757612c17613893565b0154905060005b818160ff161015612ccc57600060128660ff1660078110612c4157612c41613893565b018260ff1681548110612c5657612c56613893565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508361ffff168710158015612c9c5750612c958185613bbb565b61ffff1687105b15612cac5750925061081b915050565b612cb68185613bbb565b9350508080612cc490613b68565b915050612c1e565b50600080fd5b600081815b84518110156128d657612d0382868381518110612cf657612cf6613893565b6020026020010151612d17565b915080612d0f81613925565b915050612cd7565b6000818310612d33576000828152602084905260409020612d42565b60008381526020839052604090205b9392505050565b828054612d55906132ba565b90600052602060002090601f016020900481019282612d775760008555612dbd565b82601f10612d9057805160ff1916838001178555612dbd565b82800160010185558215612dbd579182015b82811115612dbd578251825591602001919060010190612da2565b50612dc9929150612dcd565b5090565b5b80821115612dc95760008155600101612dce565b600060208284031215612df457600080fd5b5035919050565b60005b83811015612e16578181015183820152602001612dfe565b838111156110055750506000910152565b60008151808452612e3f816020860160208601612dfb565b601f01601f19169290920160200192915050565b602081526000612d426020830184612e27565b6001600160e01b0319811681146120c057600080fd5b600060208284031215612e8e57600080fd5b8135612d4281612e66565b80356001600160a01b03811681146107ca57600080fd5b60008060408385031215612ec357600080fd5b612ecc83612e99565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1857612f18612eda565b604052919050565b60006001600160401b03821115612f3957612f39612eda565b50601f01601f191660200190565b600082601f830112612f5857600080fd5b8135612f6b612f6682612f20565b612ef0565b818152846020838601011115612f8057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612fb057600080fd5b82356001600160401b03811115612fc657600080fd5b612fd285828601612f47565b95602094909401359450505050565b600060208284031215612ff357600080fd5b81356001600160401b0381111561300957600080fd5b6124ee84828501612f47565b60008060006060848603121561302a57600080fd5b61303384612e99565b925061304160208501612e99565b9150604084013590509250925092565b6000806040838503121561306457600080fd5b50508035926020909101359150565b6040815260006130866040830185612e27565b82810360208401526130988185612e27565b95945050505050565b60008083601f8401126130b357600080fd5b5081356001600160401b038111156130ca57600080fd5b6020830191508360208260051b85010111156130e557600080fd5b9250929050565b60008060006040848603121561310157600080fd5b8335925060208401356001600160401b0381111561311e57600080fd5b61312a868287016130a1565b9497909650939450505050565b60008060006040848603121561314c57600080fd5b61315584612e99565b925060208401356001600160401b0381111561311e57600080fd5b60006020828403121561318257600080fd5b612d4282612e99565b6000806040838503121561319e57600080fd5b6131a783612e99565b9150602083013580151581146131bc57600080fd5b809150509250929050565b6000806000806000608086880312156131df57600080fd5b6131e886612e99565b94506131f660208701612e99565b93506040860135925060608601356001600160401b038082111561321957600080fd5b818801915088601f83011261322d57600080fd5b81358181111561323c57600080fd5b89602082850101111561324e57600080fd5b9699959850939650602001949392505050565b6000806040838503121561327457600080fd5b61327d83612e99565b915061328b60208401612e99565b90509250929050565b6020808252600c908201526b6e6f7420736f20666173742160a01b604082015260600190565b600181811c908216806132ce57607f821691505b6020821081036132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061330e57607f831692505b6020808410820361332f57634e487b7160e01b600052602260045260246000fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6000815161339f818560208601612dfb565b9290920192915050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f25334525334373637269707425323073726325334425323200000000000000006020820152600061340160388301876132f4565b7412991912991834b73a32b3b934ba3c9299a212991960591b815261342960158201876132f4565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253041253343253246736372697074253345253041253343737460208201527f796c65253345253041626f64792532302537422530412532302532306d61726760408201527f696e2533412532303025334225304125323025323070616464696e672533412560608201527f3230302533422530412532302532306261636b67726f756e642533412532302560808201527f32333030302533422530412532302532306f766572666c6f772533412532306860a08201527f696464656e25334225304125374425304125304125323366732532302537422560c08201527f3041253230253230706f736974696f6e2533412532306669786564253342253060e08201527f41253230253230746f70253341253230302533422530412532302532307269676101008201527f687425334125323030253342253041253230253230626f74746f6d25334125326101208201527f30302533422530412532302532306c65667425334125323030253342253041256101408201527f32302532306261636b67726f756e642d636f6c6f72253341253230626c61636b6101608201527f253342253041253230253230646973706c6179253341253230666c65782533426101808201527f2530412532302532306a7573746966792d636f6e74656e7425334125323063656101a08201527f6e746572253342253041253230253230616c69676e2d6974656d7325334125326101c08201527f3063656e746572253342253041253744253041253041253233667325323063616101e08201527f6e7661732532302537422530412532302532306f626a6563742d6669742533416102008201527f253230636f6e7461696e2533422530412532302532306d61782d6865696768746102208201527f2533412532303130302532352533422530412532302532306d61782d776964746102408201527f68253341253230313030253235253342253041253744253041253343253246736102608201527f74796c6525334525334325324668656164253345253343626f647925334525336102808201527f43646976253230696425334425323266732532322533452533432532466469766102a08201527f25334525334373637269707425334576617225323074492533440000000000006102c08201526137ec6137da6137d46137b86102da85018961338d565b6f1299a13b30b9129918341299a212991960811b815260100190565b8661338d565b651299191299a160d11b815260060190565b979650505050505050565b60006020828403121561380957600080fd5b81516001600160401b0381111561381f57600080fd5b8201601f8101841361383057600080fd5b805161383e612f6682612f20565b81815285602083850101111561385357600080fd5b613098826020830160208601612dfb565b60008351613876818460208801612dfb565b83519083019061388a818360208801612dfb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126138bf57600080fd5b9190910192915050565b6000808335601e198436030181126138e057600080fd5b8301803591506001600160401b038211156138fa57600080fd5b6020019150368190038213156130e557600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139375761393761390f565b5060010190565b6020808252601c908201527f4d696e74207374617274206e6f7420696e697469617465642079657400000000604082015260600190565b600082198211156139885761398861390f565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826139b2576139b261398d565b500490565b60008160001904831182151516156139d1576139d161390f565b500290565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b600060208284031215613a1057600080fd5b8151612d4281612e66565b6020808252600e908201526d53656c66206d696e74206f6e6c7960901b604082015260600190565b60008451613a55818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613a7b600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613a9b600b8201856132f4565b62089f4b60ea1b81526003019695505050505050565b600060ff821660ff84168060ff03821115613ace57613ace61390f565b019392505050565b60008451613ae8818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0e600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613b2e600b8201856132f4565b61227d60f01b81526002019695505050505050565b60008251613b55818460208701612dfb565b600b60fa1b920191825250600101919050565b600060ff821660ff8103613b7e57613b7e61390f565b60010192915050565b605b60f81b815260008251613ba3816001850160208701612dfb565b605d60f81b6001939091019283015250600201919050565b600061ffff80831681851680830382111561388a5761388a61390f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600082516138bf818460208701612dfb565b717b226e616d65223a202253435241574c202360701b81528851600090613c6c816012850160208e01612dfb565b895190830190613c83816012840160208e01612dfb565b701130b734b6b0ba34b7b72fbab936111d1160791b60129290910191820152613caf602382018a6132f4565b90508751613cc1818360208c01612dfb565b6226743d60e81b91019081528651613ce0816003840160208b01612dfb565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613d06600e8201876132f4565b90508451613d18818360208901612dfb565b721738373391161130ba3a3934b13aba32b9911d60691b9101908152613d51613d44601383018661338d565b607d60f81b815260010190565b9b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613d9881601d850160208701612dfb565b91909101601d0192915050565b600082613db457613db461398d565b500690565b60008351613dcb818460208801612dfb565b600360fc1b9083019081528351613de9816001840160208801612dfb565b01600101949350505050565b600082821015613e0757613e0761390f565b500390565b600060ff821660ff84168160ff0481118215151615613e2d57613e2d61390f565b029392505050565b600060ff821660ff841680821015613e4f57613e4f61390f565b9003939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223432302053435241574c2070696563657320627920706978656c77616e6b207820436972636f6c6f72732e205472616974732067656e657261746564206f6e20636861696e2026206d657461646174612c20696d61676573206d6972726f726564206f6e20636861696e207065726d616e656e746c792e222ca26469706673582212205d4e88c2a22a2a72e6e0a732424b12885553e121d9d6fc60b32fdc819a56110d64736f6c634300080d00337368613235362d6d61553247786155437a355743686b41475234306e7439736257525045664638716f253246707278686f4b5051253344687474707325334125324625324663646e6a732e636c6f7564666c6172652e636f6d253246616a61782532466c69627325324670352e6a73253246312e342e3025324670352e6a7368747470733a2f2f73637261776c2d62792d706978656c77616e6b2e73332e616d617a6f6e6177732e636f6d2f6f75747075742f68747470733a2f2f636972636f6c6f72732e6d7970696e6174612e636c6f75642f697066732f516d617941644d63503551705752636a66385738686b63574c69704c454d634e636d3158617454774c4250317a473f783d00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72

Deployed Bytecode

0x60806040526004361061025a5760003560e01c80636352211e11610144578063a22cb465116100b6578063d4e780861161007a578063d4e780861461067d578063d9d2628314610692578063e985e9c5146106a5578063f2fde38b146106e0578063f3c81d2a14610700578063f8fb13271461070857600080fd5b8063a22cb465146105f5578063ab81e06214610615578063b88d4fde14610628578063c680691914610648578063c87b56dd1461065d57600080fd5b806372f90ac11161010857806372f90ac11461056957806377b7098b1461058a5780638c874ebd146105a55780638da5cb5b146105ad57806395d89b41146105cb57806395e3f129146105e057600080fd5b80636352211e146104e157806366ba114e1461050157806366e338701461051457806370a0823114610534578063715018a61461055457600080fd5b806322673030116101dd57806332cb6b0c116101a157806332cb6b0c14610460578063349d2748146104765780633cc1251f146104895780633ccfd60b1461049e57806342842e0e146104a657806342d33d25146104c657600080fd5b806322673030146103d657806323b872dd146103ec57806328e56c5e1461040c5780632abff1f21461041f5780632fb098d21461043257600080fd5b8063095ea7b311610224578063095ea7b3146103485780630a3d4cc41461036a57806313fb44bf1461038a57806318160ddd1461039d57806319a260c9146103c157600080fd5b80625ea3071461025f5780626564fd1461029557806301ffc9a7146102cd57806306fdde03146102fd578063081812fc14610312575b600080fd5b34801561026b57600080fd5b5061027f61027a366004612de2565b61071b565b60405161028c9190612e53565b60405180910390f35b3480156102a157600080fd5b506007546102b5906001600160a01b031681565b6040516001600160a01b03909116815260200161028c565b3480156102d957600080fd5b506102ed6102e8366004612e7c565b6107cf565b604051901515815260200161028c565b34801561030957600080fd5b5061027f610821565b34801561031e57600080fd5b506102b561032d366004612de2565b6004602052600090815260409020546001600160a01b031681565b34801561035457600080fd5b50610368610363366004612eb0565b6108af565b005b34801561037657600080fd5b5061027f610385366004612f9d565b610991565b610368610398366004612fe1565b610ab8565b3480156103a957600080fd5b506103b3600d5481565b60405190815260200161028c565b3480156103cd57600080fd5b50610368610ad7565b3480156103e257600080fd5b506103b3600e5481565b3480156103f857600080fd5b50610368610407366004613015565b610b58565b61036861041a366004612fe1565b610d1f565b61036861042d366004612fe1565b610d3a565b34801561043e57600080fd5b5061045261044d366004613051565b610d55565b60405161028c929190613073565b34801561046c57600080fd5b506103b36101a481565b6103686104843660046130ec565b610ea6565b34801561049557600080fd5b506103b361100c565b610368611046565b3480156104b257600080fd5b506103686104c1366004613015565b6112b1565b3480156104d257600080fd5b506103b3665af3107a40000081565b3480156104ed57600080fd5b506102b56104fc366004612de2565b6113a4565b61036861050f366004613137565b6113f6565b34801561052057600080fd5b5061027f61052f366004612fe1565b6115cf565b34801561054057600080fd5b506103b361054f366004613170565b611823565b34801561056057600080fd5b50610368611886565b34801561057557600080fd5b506011546102ed906301000000900460ff1681565b34801561059657600080fd5b506103b36681ac8e7e4d400081565b61036861189a565b3480156105b957600080fd5b506006546001600160a01b03166102b5565b3480156105d757600080fd5b5061027f61194a565b3480156105ec57600080fd5b50610368611957565b34801561060157600080fd5b5061036861061036600461318b565b611b1c565b610368610623366004613137565b611b88565b34801561063457600080fd5b506103686106433660046131c7565b611dbc565b34801561065457600080fd5b506103b3611ea4565b34801561066957600080fd5b5061027f610678366004612de2565b611ed9565b34801561068957600080fd5b506103b3611ffa565b6103686106a0366004612fe1565b61202f565b3480156106b157600080fd5b506102ed6106c0366004613261565b600560209081526000928352604080842090915290825290205460ff1681565b3480156106ec57600080fd5b506103686106fb366004613170565b61204a565b6103686120c3565b610368610716366004613137565b6120ec565b6060336107306006546001600160a01b031690565b6001600160a01b0316148061075357503360009081526009602052604090205443115b6107785760405162461bcd60e51b815260040161076f90613294565b60405180910390fd5b600d5482106107bb5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b60006107c683612273565b9150505b919050565b60006301ffc9a760e01b6001600160e01b03198316148061080057506380ac58cd60e01b6001600160e01b03198316145b8061081b5750635b5e139f60e01b6001600160e01b03198316145b92915050565b6000805461082e906132ba565b80601f016020809104026020016040519081016040528092919081815260200182805461085a906132ba565b80156108a75780601f1061087c576101008083540402835291602001916108a7565b820191906000526020600020905b81548152906001019060200180831161088a57829003601f168201915b505050505081565b6000818152600260205260409020546001600160a01b0316338114806108f857506001600160a01b038116600090815260056020908152604080832033845290915290205460ff165b6109355760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b60008281526004602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6060336109a66006546001600160a01b031690565b6001600160a01b031614806109c957503360009081526009602052604090205443115b6109e55760405162461bcd60e51b815260040161076f90613294565b60006019601a6109f4856123ee565b86604051602001610a0894939291906133a9565b60408051601f19818403018152828252600754631980070560e11b845291519093506000926001600160a01b03909216916333000e0a91600480830192869291908290030181865afa158015610a62573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610a8a91908101906137f7565b90508181604051602001610a9f929190613864565b60408051808303601f1901815291905295945050505050565b610ac06124f6565b8051610ad390601a906020840190612d49565b5050565b610adf6124f6565b600f5460ff1615610b325760405162461bcd60e51b815260206004820152601960248201527f6d696e742074696d6520616c7265616479207374617274656400000000000000604482015260640161076f565b42600e556011805463ff00000019166301000000179055600f805460ff19166001179055565b6000818152600260205260409020546001600160a01b03848116911614610bae5760405162461bcd60e51b815260206004820152600a60248201526957524f4e475f46524f4d60b01b604482015260640161076f565b6001600160a01b038216610bf85760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b336001600160a01b0384161480610c3257506001600160a01b038316600090815260056020908152604080832033845290915290205460ff165b80610c5357506000818152600460205260409020546001600160a01b031633145b610c905760405162461bcd60e51b815260206004820152600e60248201526d1393d517d055551213d49256915160921b604482015260640161076f565b6001600160a01b0380841660008181526003602090815260408083208054600019019055938616808352848320805460010190558583526002825284832080546001600160a01b03199081168317909155600490925284832080549092169091559251849392917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b610d276124f6565b8051610ad390601b906020840190612d49565b610d426124f6565b8051610ad390601c906020840190612d49565b60086020528160005260406000208181548110610d7157600080fd5b906000526020600020906002020160009150915050806000018054610d95906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610dc1906132ba565b8015610e0e5780601f10610de357610100808354040283529160200191610e0e565b820191906000526020600020905b815481529060010190602001808311610df157829003601f168201915b505050505090806001018054610e23906132ba565b80601f0160208091040260200160405190810160405280929190818152602001828054610e4f906132ba565b8015610e9c5780601f10610e7157610100808354040283529160200191610e9c565b820191906000526020600020905b815481529060010190602001808311610e7f57829003601f168201915b5050505050905082565b610eae6124f6565b60005b8181101561100557600860008581526020019081526020016000206040518060400160405280858585818110610ee957610ee9613893565b9050602002810190610efb91906138a9565b610f0590806138c9565b8080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250505090825250602001858585818110610f5157610f51613893565b9050602002810190610f6391906138a9565b610f719060208101906138c9565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920182905250939094525050835460018101855593815260209081902083518051949560020290910193610fd6935084929190910190612d49565b506020828101518051610fef9260018501920190612d49565b5050508080610ffd90613925565b915050610eb1565b505b505050565b600f5460009060ff166110315760405162461bcd60e51b815260040161076f9061393e565b600e546110419062015180613975565b905090565b61104e6124f6565b600061105b6064476139a3565b61106690603c6139b7565b905060006110756064476139a3565b6110809060196139b7565b9050600061108f6064476139a3565b61109a90600a6139b7565b905060006110a96064476139a3565b6110b49060056139b7565b60405190915060009073e4260df86f5261a41d19c2066f1eb2eb4f009e849085908381818185875af1925050503d806000811461110d576040519150601f19603f3d011682016040523d82523d6000602084013e611112565b606091505b50509050806111335760405162461bcd60e51b815260040161076f906139d6565b604051600090734533d1f65906368ebfd61259daee561df3f3559d9085908381818185875af1925050503d8060008114611189576040519150601f19603f3d011682016040523d82523d6000602084013e61118e565b606091505b50509050806111af5760405162461bcd60e51b815260040161076f906139d6565b60405160009073888f8aa938dbb18b28bdd111fa4a0d3b8e10c8719085908381818185875af1925050503d8060008114611205576040519150601f19603f3d011682016040523d82523d6000602084013e61120a565b606091505b505090508061122b5760405162461bcd60e51b815260040161076f906139d6565b60405160009073db4782d463628cc5b1de8f1220f755ba3ba4728e9089908381818185875af1925050503d8060008114611281576040519150601f19603f3d011682016040523d82523d6000602084013e611286565b606091505b50509050806112a75760405162461bcd60e51b815260040161076f906139d6565b5050505050505050565b6112bc838383610b58565b6001600160a01b0382163b15806113655750604051630a85bd0160e11b8082523360048301526001600160a01b03858116602484015260448301849052608060648401526000608484015290919084169063150b7a029060a4016020604051808303816000875af1158015611335573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061135991906139fe565b6001600160e01b031916145b6110075760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b6000818152600260205260409020546001600160a01b0316806107ca5760405162461bcd60e51b815260206004820152600a6024820152691393d517d3525395115160b21b604482015260640161076f565b6040516001600160601b0319606085901b16602082015260009060340160405160208183030381529060405280519060200120905061148b8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507ff18f21c0b9aa112dbdf6c6406635178df7d86e476a18de7d24941ddd8f3b1f6292508591506125509050565b6114d75760405162461bcd60e51b815260206004820152601d60248201527f4e6f74206f6e20436972636f6c6f72732050726573616c65206c697374000000604482015260640161076f565b6001600160a01b03841633146114ff5760405162461bcd60e51b815260040161076f90613a1b565b665af3107a40000034146115495760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60646a6ccae8d607b1b604482015260640161076f565b336000908152600a602052604090205460ff1615156001036115ad5760405162461bcd60e51b815260206004820152601e60248201527f4164647265737320616c7265616479206d696e7465642070726573616c650000604482015260640161076f565b336000908152600a60205260409020805460ff19166001179055611005612566565b6060336115e46006546001600160a01b031690565b6001600160a01b0316148061160757503360009081526009602052604090205443115b6116235760405162461bcd60e51b815260040161076f90613294565b6060600061163c6116378560006002612754565b612820565b6000805260086020527f5eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c78054919250839160ff841690811061168057611680613893565b9060005260206000209060020201600101600860008081526020019081526020016000208360ff16815481106116b8576116b8613893565b90600052602060002090600202016000016040516020016116db93929190613a43565b60408051601f19818403018152919052915060025b60078160ff1610156117f957600061171c6116378760ff8516611714866001613ab1565b60ff16612754565b905083600860008460ff1681526020019081526020016000208260ff168154811061174957611749613893565b9060005260206000209060020201600101600860008560ff1681526020019081526020016000208360ff168154811061178457611784613893565b90600052602060002090600202016000016040516020016117a793929190613ad6565b60405160208183030381529060405293508160ff166006146117e657836040516020016117d49190613b43565b60405160208183030381529060405293505b50806117f181613b68565b9150506116f0565b508160405160200161180b9190613b87565b60405160208183030381529060405292505050919050565b60006001600160a01b03821661186a5760405162461bcd60e51b815260206004820152600c60248201526b5a45524f5f4144445245535360a01b604482015260640161076f565b506001600160a01b031660009081526003602052604090205490565b61188e6124f6565b61189860006128de565b565b6681ac8e7e4d400034146118e45760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b600e546118f4906202a300613975565b42116119425760405162461bcd60e51b815260206004820152601760248201527f5075626c6963206d696e74206e6f742073746172746564000000000000000000604482015260640161076f565b611898612566565b6001805461082e906132ba565b60115462010000900460ff16156119b05760405162461bcd60e51b815260206004820152601b60248201527f596f7520616c7265616479206d696e746564206b6e6f62686561640000000000604482015260640161076f565b73db4782d463628cc5b1de8f1220f755ba3ba4728e33146119d057600080fd5b600d546101a46119e1826005613975565b10611a1b5760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60005b6005811015611aef576040518060400160405280611a3b33612930565b61ffff90811682526011541660209091015260106000611a5b8486613975565b8152602080820192909252604001600090812083518154949093015161ffff908116620100000263ffffffff199095169381169390931793909317909255601180546008939192611aae91859116613bbb565b92506101000a81548161ffff021916908361ffff160217905550611add338284611ad89190613975565b61298c565b80611ae781613925565b915050611a1e565b506005600d6000828254611b039190613975565b90915550506011805462ff000019166201000017905550565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6040516001600160601b0319606085901b166020820152600090603401604051602081830303815290604052805190602001209050611c1d8383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507fd5a3f650c9366b35260f7de176ca096cd5c16fbf149981b7423a743c91b9b1c292508591506125509050565b611c5c5760405162461bcd60e51b815260206004820152601060248201526f139bdd081bdb88105b1b1bdddb1a5cdd60821b604482015260640161076f565b6001600160a01b0384163314611c845760405162461bcd60e51b815260040161076f90613a1b565b6681ac8e7e4d40003414611cce5760405162461bcd60e51b815260206004820152601160248201527009ad2dce840d2e640605c60666c6acae8d607b1b604482015260640161076f565b336000908152600c602052604090205460ff161515600103611d3c5760405162461bcd60e51b815260206004820152602160248201527f4164647265737320616c7265616479206d696e74656420616c6c6f77206c69736044820152601d60fa1b606482015260840161076f565b600e54611d4c9062015180613975565b4211611d9a5760405162461bcd60e51b815260206004820152601e60248201527f416c6c6f776c697374206d696e74206e6f742073746172746564207965740000604482015260640161076f565b336000908152600c60205260409020805460ff19166001179055611005612566565b611dc7858585610b58565b6001600160a01b0384163b1580611e5e5750604051630a85bd0160e11b808252906001600160a01b0386169063150b7a0290611e0f9033908a90899089908990600401613bd8565b6020604051808303816000875af1158015611e2e573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611e5291906139fe565b6001600160e01b031916145b611e9d5760405162461bcd60e51b815260206004820152601060248201526f155394d0519157d49150d2541251539560821b604482015260640161076f565b5050505050565b600f5460009060ff16611ec95760405162461bcd60e51b815260040161076f9061393e565b600e54611041906202a300613975565b6060600d548210611f1e5760405162461bcd60e51b815260206004820152600f60248201526e1b9bdb88195e1a5cdd185b9d081a59608a1b604482015260640161076f565b6000611f298361071b565b905060006040518060c00160405280608c8152602001613e99608c913990506000611f7a611f56866123ee565b604051602001611f669190613c2c565b604051602081830303815290604052612a97565b90506000611f9284604051602001611f669190613c2c565b9050611fd0611fa0876123ee565b84601b8585601c611fb08d6123ee565b611fb98c6115cf565b604051602001611f66989796959493929190613c3e565b604051602001611fe09190613d60565b604051602081830303815290604052945050505050919050565b600f5460009060ff1661201f5760405162461bcd60e51b815260040161076f9061393e565b600e54611041906203f480613975565b6120376124f6565b8051610ad3906019906020840190612d49565b6120526124f6565b6001600160a01b0381166120b75760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161076f565b6120c0816128de565b50565b6120cb6124f6565b6011805463ff00000019811663010000009182900460ff1615909102179055565b6040516001600160601b0319606085901b1660208201526000906034016040516020818303038152906040528051906020012090506121818383808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152507f246124155c5b50bc956d45abf72f661ba98b7fbb9605e223bed8c75b6580fcd892508591506125509050565b6121c55760405162461bcd60e51b8152602060048201526015602482015274139bdd081bdb88119c9959481b5a5b9d081b1a5cdd605a1b604482015260640161076f565b6001600160a01b03841633146121ed5760405162461bcd60e51b815260040161076f90613a1b565b336000908152600b602052604090205460ff1615156001036122515760405162461bcd60e51b815260206004820152601b60248201527f4164647265737320616c72656164792066726565206d696e7465640000000000604482015260640161076f565b336000908152600b60205260409020805460ff19166001179055611005612566565b6040805160208082018352600080835284815260109091529182205460609261ffff8083169262010000900416905b60078160ff1610156123e4576122b782613925565b604080516020810186905290810188905260608101829052909250600090612710906080016040516020818303038152906040528051906020012060001c6122ff9190613da5565b90508160ff1660000361239457600061231c8261ffff1684612bfd565b905060098160ff16111561235e57856123378260ff166123ee565b604051602001612348929190613864565b604051602081830303815290604052955061238e565b8561236b8260ff166123ee565b60405160200161237c929190613db9565b60405160208183030381529060405295505b506123d1565b846123ae6123a68361ffff1685612bfd565b60ff166123ee565b6040516020016123bf929190613864565b60405160208183030381529060405294505b50806123dc81613b68565b9150506122a2565b5091949350505050565b6060816000036124155750506040805180820190915260018152600360fc1b602082015290565b8160005b811561243f578061242981613925565b91506124389050600a836139a3565b9150612419565b6000816001600160401b0381111561245957612459612eda565b6040519080825280601f01601f191660200182016040528015612483576020820181803683370190505b5090505b84156124ee57612498600183613df5565b91506124a5600a86613da5565b6124b0906030613975565b60f81b8183815181106124c5576124c5613893565b60200101906001600160f81b031916908160001a9053506124e7600a866139a3565b9450612487565b949350505050565b6006546001600160a01b031633146118985760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161076f565b60008261255d8584612cd2565b14949350505050565b6011546301000000900460ff1615156001148061258d57506006546001600160a01b031633145b6125cc5760405162461bcd60e51b815260206004820152601060248201526f4d696e74696e67206e6f74206c69766560801b604482015260640161076f565b600f5460ff166126125760405162461bcd60e51b815260206004820152601160248201527026b4b73a34b733903737ba103132b3bab760791b604482015260640161076f565b600e54612622906203f480613975565b421061265f5760405162461bcd60e51b815260206004820152600c60248201526b26b4b73a34b7339037bb32b960a11b604482015260640161076f565b600d546101a481106126a05760405162461bcd60e51b815260206004820152600a602482015269135a5b9d1959081bdd5d60b21b604482015260640161076f565b60405180604001604052806126b433612930565b61ffff9081168252601180548216602093840152600085815260108452604080822086518154978701518616620100000263ffffffff19909816908616179690961790955533815260099093529282204390558254600893929161271a91859116613bbb565b92506101000a81548161ffff021916908361ffff16021790555061273e338261298c565b600d6000815461274d90613925565b9091555050565b60608360006127638585613df5565b6001600160401b0381111561277a5761277a612eda565b6040519080825280601f01601f1916602001820160405280156127a4576020820181803683370190505b509050845b84811015612816578281815181106127c3576127c3613893565b01602001516001600160f81b031916826127dd8884613df5565b815181106127ed576127ed613893565b60200101906001600160f81b031916908160001a9053508061280e81613925565b9150506127a9565b5095945050505050565b60008181805b82518160ff1610156128d6576030838260ff168151811061284957612849613893565b016020015160f81c1080159061287c57506039838260ff168151811061287157612871613893565b016020015160f81c11155b156128c45761288c600a83613e0c565b91506030838260ff16815181106128a5576128a5613893565b01602001516128b7919060f81c613e35565b6128c19083613ab1565b91505b806128ce81613b68565b915050612826565b509392505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60008061271042448560405160200161296993929190928352602083019190915260601b6001600160601b031916604082015260540190565b6040516020818303038152906040528051906020012060001c6107c69190613da5565b6001600160a01b0382166129d65760405162461bcd60e51b81526020600482015260116024820152701253959053125117d49150d25412515395607a1b604482015260640161076f565b6000818152600260205260409020546001600160a01b031615612a2c5760405162461bcd60e51b815260206004820152600e60248201526d1053149150511657d3525395115160921b604482015260640161076f565b6001600160a01b038216600081815260036020908152604080832080546001019055848352600290915280822080546001600160a01b0319168417905551839291907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60608151600003612ab657505060408051602081019091526000815290565b6000604051806060016040528060408152602001613e596040913990506000600384516002612ae59190613975565b612aef91906139a3565b612afa9060046139b7565b90506000612b09826020613975565b6001600160401b03811115612b2057612b20612eda565b6040519080825280601f01601f191660200182016040528015612b4a576020820181803683370190505b509050818152600183018586518101602084015b81831015612bb85760039283018051603f601282901c811687015160f890811b8552600c83901c8216880151811b6001860152600683901c8216880151811b60028601529116860151901b93820193909352600401612b5e565b600389510660018114612bd25760028114612be357612bef565b613d3d60f01b600119830152612bef565b603d60f81b6000198301525b509398975050505050505050565b60008080601260ff851660078110612c1757612c17613893565b0154905060005b818160ff161015612ccc57600060128660ff1660078110612c4157612c41613893565b018260ff1681548110612c5657612c56613893565b90600052602060002090601091828204019190066002029054906101000a900461ffff1690508361ffff168710158015612c9c5750612c958185613bbb565b61ffff1687105b15612cac5750925061081b915050565b612cb68185613bbb565b9350508080612cc490613b68565b915050612c1e565b50600080fd5b600081815b84518110156128d657612d0382868381518110612cf657612cf6613893565b6020026020010151612d17565b915080612d0f81613925565b915050612cd7565b6000818310612d33576000828152602084905260409020612d42565b60008381526020839052604090205b9392505050565b828054612d55906132ba565b90600052602060002090601f016020900481019282612d775760008555612dbd565b82601f10612d9057805160ff1916838001178555612dbd565b82800160010185558215612dbd579182015b82811115612dbd578251825591602001919060010190612da2565b50612dc9929150612dcd565b5090565b5b80821115612dc95760008155600101612dce565b600060208284031215612df457600080fd5b5035919050565b60005b83811015612e16578181015183820152602001612dfe565b838111156110055750506000910152565b60008151808452612e3f816020860160208601612dfb565b601f01601f19169290920160200192915050565b602081526000612d426020830184612e27565b6001600160e01b0319811681146120c057600080fd5b600060208284031215612e8e57600080fd5b8135612d4281612e66565b80356001600160a01b03811681146107ca57600080fd5b60008060408385031215612ec357600080fd5b612ecc83612e99565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715612f1857612f18612eda565b604052919050565b60006001600160401b03821115612f3957612f39612eda565b50601f01601f191660200190565b600082601f830112612f5857600080fd5b8135612f6b612f6682612f20565b612ef0565b818152846020838601011115612f8057600080fd5b816020850160208301376000918101602001919091529392505050565b60008060408385031215612fb057600080fd5b82356001600160401b03811115612fc657600080fd5b612fd285828601612f47565b95602094909401359450505050565b600060208284031215612ff357600080fd5b81356001600160401b0381111561300957600080fd5b6124ee84828501612f47565b60008060006060848603121561302a57600080fd5b61303384612e99565b925061304160208501612e99565b9150604084013590509250925092565b6000806040838503121561306457600080fd5b50508035926020909101359150565b6040815260006130866040830185612e27565b82810360208401526130988185612e27565b95945050505050565b60008083601f8401126130b357600080fd5b5081356001600160401b038111156130ca57600080fd5b6020830191508360208260051b85010111156130e557600080fd5b9250929050565b60008060006040848603121561310157600080fd5b8335925060208401356001600160401b0381111561311e57600080fd5b61312a868287016130a1565b9497909650939450505050565b60008060006040848603121561314c57600080fd5b61315584612e99565b925060208401356001600160401b0381111561311e57600080fd5b60006020828403121561318257600080fd5b612d4282612e99565b6000806040838503121561319e57600080fd5b6131a783612e99565b9150602083013580151581146131bc57600080fd5b809150509250929050565b6000806000806000608086880312156131df57600080fd5b6131e886612e99565b94506131f660208701612e99565b93506040860135925060608601356001600160401b038082111561321957600080fd5b818801915088601f83011261322d57600080fd5b81358181111561323c57600080fd5b89602082850101111561324e57600080fd5b9699959850939650602001949392505050565b6000806040838503121561327457600080fd5b61327d83612e99565b915061328b60208401612e99565b90509250929050565b6020808252600c908201526b6e6f7420736f20666173742160a01b604082015260600190565b600181811c908216806132ce57607f821691505b6020821081036132ee57634e487b7160e01b600052602260045260246000fd5b50919050565b8054600090600181811c908083168061330e57607f831692505b6020808410820361332f57634e487b7160e01b600052602260045260246000fd5b818015613343576001811461335457613381565b60ff19861689528489019650613381565b60008881526020902060005b868110156133795781548b820152908501908301613360565b505084890196505b50505050505092915050565b6000815161339f818560208601612dfb565b9290920192915050565b7f646174613a746578742f68746d6c2c25334368746d6c2533452533436865616481527f25334525334373637269707425323073726325334425323200000000000000006020820152600061340160388301876132f4565b7412991912991834b73a32b3b934ba3c9299a212991960591b815261342960158201876132f4565b90507f25323225323063726f73736f726967696e253344253232616e6f6e796d6f757381527f253232253345253041253343253246736372697074253345253041253343737460208201527f796c65253345253041626f64792532302537422530412532302532306d61726760408201527f696e2533412532303025334225304125323025323070616464696e672533412560608201527f3230302533422530412532302532306261636b67726f756e642533412532302560808201527f32333030302533422530412532302532306f766572666c6f772533412532306860a08201527f696464656e25334225304125374425304125304125323366732532302537422560c08201527f3041253230253230706f736974696f6e2533412532306669786564253342253060e08201527f41253230253230746f70253341253230302533422530412532302532307269676101008201527f687425334125323030253342253041253230253230626f74746f6d25334125326101208201527f30302533422530412532302532306c65667425334125323030253342253041256101408201527f32302532306261636b67726f756e642d636f6c6f72253341253230626c61636b6101608201527f253342253041253230253230646973706c6179253341253230666c65782533426101808201527f2530412532302532306a7573746966792d636f6e74656e7425334125323063656101a08201527f6e746572253342253041253230253230616c69676e2d6974656d7325334125326101c08201527f3063656e746572253342253041253744253041253041253233667325323063616101e08201527f6e7661732532302537422530412532302532306f626a6563742d6669742533416102008201527f253230636f6e7461696e2533422530412532302532306d61782d6865696768746102208201527f2533412532303130302532352533422530412532302532306d61782d776964746102408201527f68253341253230313030253235253342253041253744253041253343253246736102608201527f74796c6525334525334325324668656164253345253343626f647925334525336102808201527f43646976253230696425334425323266732532322533452533432532466469766102a08201527f25334525334373637269707425334576617225323074492533440000000000006102c08201526137ec6137da6137d46137b86102da85018961338d565b6f1299a13b30b9129918341299a212991960811b815260100190565b8661338d565b651299191299a160d11b815260060190565b979650505050505050565b60006020828403121561380957600080fd5b81516001600160401b0381111561381f57600080fd5b8201601f8101841361383057600080fd5b805161383e612f6682612f20565b81815285602083850101111561385357600080fd5b613098826020830160208601612dfb565b60008351613876818460208801612dfb565b83519083019061388a818360208801612dfb565b01949350505050565b634e487b7160e01b600052603260045260246000fd5b60008235603e198336030181126138bf57600080fd5b9190910192915050565b6000808335601e198436030181126138e057600080fd5b8301803591506001600160401b038211156138fa57600080fd5b6020019150368190038213156130e557600080fd5b634e487b7160e01b600052601160045260246000fd5b6000600182016139375761393761390f565b5060010190565b6020808252601c908201527f4d696e74207374617274206e6f7420696e697469617465642079657400000000604082015260600190565b600082198211156139885761398861390f565b500190565b634e487b7160e01b600052601260045260246000fd5b6000826139b2576139b261398d565b500490565b60008160001904831182151516156139d1576139d161390f565b500290565b6020808252600e908201526d11985a5b1959081d1bc81cd95b9960921b604082015260600190565b600060208284031215613a1057600080fd5b8151612d4281612e66565b6020808252600e908201526d53656c66206d696e74206f6e6c7960901b604082015260600190565b60008451613a55818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613a7b600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613a9b600b8201856132f4565b62089f4b60ea1b81526003019695505050505050565b600060ff821660ff84168060ff03821115613ace57613ace61390f565b019392505050565b60008451613ae8818460208901612dfb565b6e3d913a3930b4ba2fba3cb832911d1160891b908301908152613b0e600f8201866132f4565b6a1116113b30b63ab2911d1160a91b81529050613b2e600b8201856132f4565b61227d60f01b81526002019695505050505050565b60008251613b55818460208701612dfb565b600b60fa1b920191825250600101919050565b600060ff821660ff8103613b7e57613b7e61390f565b60010192915050565b605b60f81b815260008251613ba3816001850160208701612dfb565b605d60f81b6001939091019283015250600201919050565b600061ffff80831681851680830382111561388a5761388a61390f565b6001600160a01b038681168252851660208201526040810184905260806060820181905281018290526000828460a0840137600060a0848401015260a0601f19601f85011683010190509695505050505050565b600082516138bf818460208701612dfb565b717b226e616d65223a202253435241574c202360701b81528851600090613c6c816012850160208e01612dfb565b895190830190613c83816012840160208e01612dfb565b701130b734b6b0ba34b7b72fbab936111d1160791b60129290910191820152613caf602382018a6132f4565b90508751613cc1818360208c01612dfb565b6226743d60e81b91019081528651613ce0816003840160208b01612dfb565b6a11161134b6b0b3b2911d1160a91b60039290910191820152613d06600e8201876132f4565b90508451613d18818360208901612dfb565b721738373391161130ba3a3934b13aba32b9911d60691b9101908152613d51613d44601383018661338d565b607d60f81b815260010190565b9b9a5050505050505050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613d9881601d850160208701612dfb565b91909101601d0192915050565b600082613db457613db461398d565b500690565b60008351613dcb818460208801612dfb565b600360fc1b9083019081528351613de9816001840160208801612dfb565b01600101949350505050565b600082821015613e0757613e0761390f565b500390565b600060ff821660ff84168160ff0481118215151615613e2d57613e2d61390f565b029392505050565b600060ff821660ff841680821015613e4f57613e4f61390f565b9003939250505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f222c20226465736372697074696f6e223a20223432302053435241574c2070696563657320627920706978656c77616e6b207820436972636f6c6f72732e205472616974732067656e657261746564206f6e20636861696e2026206d657461646174612c20696d61676573206d6972726f726564206f6e20636861696e207065726d616e656e746c792e222ca26469706673582212205d4e88c2a22a2a72e6e0a732424b12885553e121d9d6fc60b32fdc819a56110d64736f6c634300080d0033

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

00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72

-----Decoded View---------------
Arg [0] : _scrawlArt (address): 0x17F0533E27c5D42E0132aB969B9bF1bd34B60e72

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000017f0533e27c5d42e0132ab969b9bf1bd34b60e72


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.