Token PEPi

Overview [ERC-20]

Price
$0.00 @ 0.000000 Eth
Fully Diluted Market Cap
Max Total Supply:
13,370 PEPI

Holders:
846

Transfers:
-

Loading
[ Download CSV Export ]
Loading
[ Download CSV Export ]
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
Pepi

Compiler Version
v0.8.25+commit.b61c2a91

Optimization Enabled:
Yes with 200 runs

Other Settings:
paris EvmVersion
File 1 of 8 : IERC20Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.20;

import {IERC20} from "../IERC20.sol";

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

File 2 of 8 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the value of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves a `value` amount of tokens from the caller's account to `to`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address to, uint256 value) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets a `value` amount of tokens as the allowance of `spender` over the
     * caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 value) external returns (bool);

    /**
     * @dev Moves a `value` amount of tokens from `from` to `to` using the
     * allowance mechanism. `value` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address from, address to, uint256 value) external returns (bool);
}

File 3 of 8 : Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

File 4 of 8 : Generator.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;



import "./lib/Ownable.sol";



uint constant levelsCount = 6;

uint constant bcgroundsCount = 6;

uint8 constant pixelsCount = 32;

uint constant seedLevel2 = 11;

uint constant seedLevel3 = 22;

uint constant seedLevel4 = 33;

uint constant seedLevel5 = 44;

uint constant seedLevel6 = 56;

string constant description = "A collection of PEPis, an inscriptions ERC-20i collection. 6 different levels from egg mass to a fully grown Pepe. Which one is yours?$PEPI is a unique, fully on-chain art project built on the innovative new ERC-20i format with inscription metadata. Each portion of tokens resembles a seed that generates unique 32x32 dynamic images of Pepe stored on-chain, depending on the wallet's token balance.";

string constant web = "https://pepe-erc20i.vip/";



struct ItemData {

    uint lvl; // starts 1

    string background;

    uint body; // number or 0

    string bodyColor;

    uint cloth; // number or 0

    uint eyes; // number or 0

    uint mouth; // number or 0

    uint accessory; // number or 0

    uint hat; // number or 0

    uint ears; // number or 0

}



struct Rect {

    uint8 x;

    uint8 y;

    uint8 width;

    uint8 height;

}



struct RectColored {

    uint8 x;

    uint8 y;

    uint8 width;

    uint8 height;

    uint24 color;

}



struct FileData {

    uint lvl;

    uint file;

    Rect[] rects;

}



struct FileDataColored {

    uint lvl;

    uint file;

    RectColored[] rects;

}



struct ColorsData {

    string[] lvl0;

    string[] lvl1;

    string[] lvl2;

    string[] lvl3;

    string[] lvl4;

}



struct SeedData {

    uint seed;

    uint seed2;

    uint extra;

}



struct Rand {

    uint seed;

    uint seed2;

    uint extra;

    uint nonce;

    uint nonce2;

}



library RandLib {

    function next(Rand memory rnd) internal pure returns (uint) {

        return

            uint(

                keccak256(

                    abi.encodePacked(rnd.seed + rnd.nonce++ - 1, rnd.extra)

                )

            );

    }



    function next2(Rand memory rnd) internal pure returns (uint) {

        return uint(keccak256(abi.encodePacked(rnd.seed2 + rnd.nonce2++ - 1)));

    }



    function random_value(uint nonce) internal view returns (uint) {

        return

            uint256(

                keccak256(

                    abi.encodePacked(

                        block.timestamp,

                        msg.sender,

                        nonce,

                        block.number

                    )

                )

            );

    }



    function lvl(Rand memory rnd) internal pure returns (uint) {

        if (rnd.seed < seedLevel2) return 0;

        if (rnd.seed < seedLevel3) return 1;

        if (rnd.seed < seedLevel4) return 2;

        if (rnd.seed < seedLevel5) return 3;

        if (rnd.seed < seedLevel6) return 4;

        return 5;

    }



    function random(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (string memory) {

        return data[randomIndex(data, rnd)];

    }



    function random2(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (string memory) {

        return data[randomIndex2(data, rnd)];

    }



    function randomIndex(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (uint) {

        return next(rnd) % data.length;

    }



    function randomIndex2(

        string[] memory data,

        Rand memory rnd

    ) internal pure returns (uint) {

        return next2(rnd) % data.length;

    }

}



library ColorConvert {

    function toSvgColor(uint24 value) internal pure returns (string memory) {

        return string(abi.encodePacked("#", toHex(value)));

    }



    function toHex(uint24 value) internal pure returns (bytes memory) {

        bytes memory buffer = new bytes(6);

        for (uint i = 0; i < 3; ++i) {

            buffer[5 - i * 2] = hexChar(uint8(value) & 0x0f);

            buffer[4 - i * 2] = hexChar((uint8(value) >> 4) & 0x0f);

            value >>= 8;

        }

        return buffer;

    }



    function hexChar(uint8 value) internal pure returns (bytes1) {

        if (value < 10) return bytes1(uint8(48 + (uint(value) % 10)));

        return bytes1(uint8(65 + uint256((value - 10) % 6)));

    }

}



library LayersLib {

    function setLayers(

        mapping(uint => mapping(uint => Rect[])) storage rects,

        FileData[] calldata data,

        uint8[levelsCount] storage counts

    ) internal {

        for (uint i = 0; i < data.length; ++i) {

            setFile(rects, data[i], counts);

        }

    }



    function setLayers(

        mapping(uint => mapping(uint => RectColored[])) storage rects,

        FileDataColored[] calldata data,

        uint8[levelsCount] storage counts

    ) internal {

        for (uint i = 0; i < data.length; ++i) {

            setFile(rects, data[i], counts);

        }

    }



    function setFile(

        mapping(uint => mapping(uint => Rect[])) storage rects,

        FileData calldata input,

        uint8[levelsCount] storage counts

    ) internal {

        Rect[] storage storageFile = rects[input.lvl - 1][input.file - 1];

        if (storageFile.length > 0) delete rects[input.lvl - 1][input.file - 1];

        else ++counts[input.lvl - 1];

        for (uint i = 0; i < input.rects.length; ++i) {

            storageFile.push(input.rects[i]);

        }

    }



    function setFile(

        mapping(uint => mapping(uint => RectColored[])) storage rects,

        FileDataColored calldata input,

        uint8[levelsCount] storage counts

    ) internal {

        RectColored[] storage storageFile = rects[input.lvl - 1][

            input.file - 1

        ];

        if (storageFile.length > 0) delete rects[input.lvl - 1][input.file - 1];

        else ++counts[input.lvl - 1];

        for (uint i = 0; i < input.rects.length; ++i) {

            storageFile.push(input.rects[i]);

        }

    }



    function getLvl(

        mapping(uint => mapping(uint => Rect[])) storage rects,

        uint lvl

    ) internal view returns (mapping(uint => Rect[]) storage) {

        return rects[lvl];

    }



    function to_lvl_1(uint l) internal pure returns (uint) {

        if (l > 0) --l;

        return l;

    }

}



library Converter {

    function toString(uint value) internal pure returns (string memory) {

        if (value == 0) {

            return "0";

        }

        uint temp = value;

        uint 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);

    }

}



library RectLib {

    using RectLib for Rect;

    using RectLib for RectColored;

    using RandLib for Rand;

    using RandLib for string[];

    using Converter for uint8;

    using ColorConvert for uint24;



    function toSvg(

        Rect memory r,

        string memory color

    ) internal pure returns (string memory) {

        return

            string(

                abi.encodePacked(

                    "<rect x='",

                    r.x.toString(),

                    "' y='",

                    r.y.toString(),

                    "' width='",

                    r.width.toString(),

                    "' height='",

                    r.height.toString(),

                    "' fill='",

                    color,

                    "'/>"

                )

            );

    }



    function toSvg(RectColored memory r) internal pure returns (string memory) {

        return

            string(

                abi.encodePacked(

                    "<rect x='",

                    r.x.toString(),

                    "' y='",

                    r.y.toString(),

                    "' width='",

                    r.width.toString(),

                    "' height='",

                    r.height.toString(),

                    "' fill='",

                    r.color.toSvgColor(),

                    "'/>"

                )

            );

    }



    function toSvg(

        Rect[] storage rects,

        string[] storage colors,

        Rand memory rnd

    ) internal view returns (string memory) {

        string memory res;

        for (uint i = 0; i < rects.length; ++i) {

            res = string(

                abi.encodePacked(res, rects[i].toSvg(colors.random(rnd)))

            );

        }

        return res;

    }



    function toSvg(

        Rect[] storage rects,

        string memory color

    ) internal view returns (string memory) {

        string memory res;

        for (uint i = 0; i < rects.length; ++i) {

            res = string(abi.encodePacked(res, rects[i].toSvg(color)));

        }

        return res;

    }



    function toSvg(

        RectColored[] storage rects

    ) internal view returns (string memory) {

        string memory res;

        for (uint i = 0; i < rects.length; ++i) {

            res = string(abi.encodePacked(res, rects[i].toSvg()));

        }

        return res;

    }

}



contract Generator is Ownable {

    using LayersLib for mapping(uint => mapping(uint => Rect[]));

    using LayersLib for mapping(uint => mapping(uint => RectColored[]));

    using LayersLib for mapping(uint => string[]);

    using LayersLib for uint;

    using RectLib for Rect;

    using RectLib for Rect[];

    using RectLib for RectColored;

    using RectLib for RectColored[];

    using RandLib for Rand;

    using RandLib for string[];

    using Converter for uint;

    using Converter for uint8;

    using ColorConvert for uint24;



    uint8[levelsCount] bodyLevelCounts;

    uint8[levelsCount] clothLevelCounts;

    uint8[levelsCount] eyesLevelCounts;

    uint8[levelsCount] mouthLevelCounts;

    uint8[levelsCount] accessoryLevelCounts;

    uint8[levelsCount] hatLevelCounts;

    uint8[levelsCount] earsLevelCounts;



    mapping(uint => mapping(uint => Rect[])) bodies;

    mapping(uint => mapping(uint => RectColored[])) cloths;

    mapping(uint => mapping(uint => RectColored[])) eyes;

    mapping(uint => mapping(uint => RectColored[])) mouths;

    mapping(uint => mapping(uint => RectColored[])) accessories;

    mapping(uint => mapping(uint => RectColored[])) hats;

    mapping(uint => mapping(uint => RectColored[])) ears;



    string[] private backgroundColors = [

        "#c37100",

        "#db4161",

        "#9aeb00",

        "#9241f3",

        "#5182ff",

        "#a2a2a2",

        "#fff392"

    ];



    string[] private skin_colors = [

        // Greens

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        "#538234",

        "#49a269",

        "#67d487",

        "#4b9540",

        // Browns and Yellows

        "#794100",

        "#8a8a00",

        "#b6a41d",

        "#dcc724",

        // Blues

        "#4192c3",

        "#61a2ff",

        "#61d3e3",

        "#a271ff",

        // Reds, Oranges, and Pinks

        "#d44f06",

        "#cf458c",

        "#d4a37c",

        "#FFC0CB",

        "#800080",

        "#8F00FF"

    ];



    constructor() {}



    function setBodies(FileData[] calldata data) external onlyOwner {

        bodies.setLayers(data, bodyLevelCounts);

    }



    function setCloths(FileDataColored[] calldata data) external onlyOwner {

        cloths.setLayers(data, clothLevelCounts);

    }



    function setEyes(FileDataColored[] calldata data) external onlyOwner {

        eyes.setLayers(data, eyesLevelCounts);

    }



    function setMouths(FileDataColored[] calldata data) external onlyOwner {

        mouths.setLayers(data, mouthLevelCounts);

    }



    function setAccessories(

        FileDataColored[] calldata data

    ) external onlyOwner {

        accessories.setLayers(data, accessoryLevelCounts);

    }



    function setHats(FileDataColored[] calldata data) external onlyOwner {

        hats.setLayers(data, hatLevelCounts);

    }



    function setEars(FileDataColored[] calldata data) external onlyOwner {

        ears.setLayers(data, earsLevelCounts);

    }



    // DATA



    function getItemData(

        SeedData calldata seed_data

    ) external view returns (ItemData memory) {

        Rand memory rnd = Rand(

            seed_data.seed,

            seed_data.seed2,

            seed_data.extra,

            0,

            0

        );

        ItemData memory data;

        data.lvl = rnd.lvl() + 1;

        setBcGround(data, rnd);

        setBody(data, rnd);

        setCloth(data, rnd);

        setEyes(data, rnd);

        setMouth(data, rnd);

        setAccessory(data, rnd);

        setHat(data, rnd);

        setEars(data, rnd);



        // limits

        if (data.lvl == 1) {

            if (data.mouth == 9) {

                if (data.accessory >= 7 && data.accessory <= 9)

                    data.accessory = 0;

            }

            if (data.eyes == 5) {

                if ((data.accessory >= 10 && data.accessory <= 13))

                    data.accessory = 0;

            }

        }

        if (data.lvl == 2) {

            if (data.hat >= 25 && data.hat <= 28) data.ears = 0;

        }

        if (data.lvl == 3) {

            if (data.mouth == 9) {

                if (data.accessory == 1 || data.accessory == 2)

                    data.accessory = 0;

            }

            if (data.eyes == 5) {

                if (

                    data.accessory == 3 ||

                    data.accessory == 6 ||

                    (data.accessory >= 15 && data.accessory <= 20)

                ) data.accessory = 0;

            }

            if (data.hat >= 44 && data.hat <= 47) data.ears = 0;

        }

        if (data.lvl == 4) {

            if (data.eyes == 5) {

                if (

                    data.accessory == 1 ||

                    data.accessory == 5 ||

                    (data.accessory >= 8 && data.accessory <= 13) ||

                    (data.accessory >= 14 && data.accessory <= 19) ||

                    (data.accessory >= 20 && data.accessory <= 25)

                ) data.accessory = 0;

            }

            if (data.accessory == 5) {

                if (

                    data.eyes == 5 ||

                    data.accessory == 9 ||

                    data.accessory == 10

                ) data.eyes = 0;

            }

            if (data.hat >= 54 && data.hat <= 57) data.ears = 0;

        }

        if (data.lvl == 5) {

            if (data.mouth == 9) {

                if (

                    data.accessory == 44 ||

                    (data.accessory >= 20 && data.accessory <= 25)

                ) data.accessory = 0;

            }

            if (data.eyes == 5) {

                if (

                    (data.accessory >= 8 && data.accessory <= 13) ||

                    (data.accessory >= 14 && data.accessory <= 19) ||

                    (data.accessory >= 26 && data.accessory <= 31) ||

                    (data.accessory >= 32 && data.accessory <= 37)

                ) data.accessory = 0;

            }

            if (data.hat == 49) {

                if (

                    data.accessory == 2 ||

                    data.accessory == 5 ||

                    data.accessory == 6 ||

                    data.accessory == 44 ||

                    (data.accessory >= 20 && data.accessory <= 25) ||

                    (data.accessory >= 38 && data.accessory <= 43)

                ) data.accessory = 0;

            }

            if (data.hat >= 70 && data.hat <= 73) data.ears = 0;

        }

        if (data.lvl == 6) {

            if (data.mouth == 6) {

                if (

                    (data.accessory >= 63 && data.accessory <= 65) ||

                    (data.accessory >= 69 && data.accessory <= 71)

                ) data.accessory = 0;

            }

            if (data.mouth == 9) {

                if (

                    data.accessory == 3 ||

                    data.accessory == 48 ||

                    data.accessory == 55 ||

                    (data.accessory >= 30 && data.accessory <= 35) ||

                    (data.accessory >= 36 && data.accessory <= 41) ||

                    (data.accessory >= 49 && data.accessory <= 54) ||

                    (data.accessory >= 57 && data.accessory <= 59) ||

                    (data.accessory >= 63 && data.accessory <= 65) ||

                    (data.accessory >= 69 && data.accessory <= 71) ||

                    (data.accessory >= 75 && data.accessory <= 77)

                ) data.accessory = 0;

            }

            if (data.mouth == 10) {

                if (

                    (data.accessory >= 69 && data.accessory <= 71) ||

                    (data.accessory >= 75 && data.accessory <= 77)

                ) data.accessory = 0;

            }

            if (data.eyes == 5) {

                if (

                    data.accessory == 17 ||

                    (data.accessory >= 5 && data.accessory <= 10) ||

                    (data.accessory >= 11 && data.accessory <= 16) ||

                    (data.accessory >= 18 && data.accessory <= 23) ||

                    (data.accessory >= 42 && data.accessory <= 47) ||

                    (data.accessory >= 72 && data.accessory <= 74) ||

                    (data.accessory >= 69 && data.accessory <= 71) ||

                    (data.accessory >= 63 && data.accessory <= 65)

                ) data.accessory = 0;

            }

            if (data.hat == 50) {

                if (

                    data.accessory == 2 ||

                    data.accessory == 17 ||

                    data.accessory == 48 ||

                    data.accessory == 55 ||

                    (data.accessory >= 24 && data.accessory <= 29) ||

                    (data.accessory >= 30 && data.accessory <= 35) ||

                    (data.accessory >= 36 && data.accessory <= 41)

                ) data.accessory = 0;

            }

            if (data.hat >= 72 && data.hat <= 72) data.ears = 0;

        }

        if (data.eyes == 12) {

            if (data.lvl == 2) {

                if (data.accessory >= 10 && data.accessory <= 13)

                    data.accessory = 0;

            }

            if (data.lvl == 3) {

                if (

                    data.accessory >= 6 ||

                    (data.accessory >= 15 && data.accessory <= 20)

                ) data.accessory = 0;

            }

            if (data.lvl == 4) {

                if (

                    data.accessory >= 5 ||

                    (data.accessory >= 8 && data.accessory <= 19)

                ) data.accessory = 0;

            }

            if (data.lvl == 5) {

                if (

                    (data.accessory >= 26 && data.accessory <= 31) ||

                    (data.accessory >= 14 && data.accessory <= 19)

                ) data.accessory = 0;

            }

            if (data.lvl == 6) {

                if (

                    (data.accessory >= 11 && data.accessory <= 23) ||

                    (data.accessory >= 42 && data.accessory <= 47)

                ) data.accessory = 0;

            }

        }



        return data;

    }



    function setBcGround(ItemData memory data, Rand memory rnd) private view {

        data.background = backgroundColors.random2(rnd);

    }



    function setBody(ItemData memory data, Rand memory rnd) private view {

        uint count = bodyLevelCounts[data.lvl - 1];

        if (count == 0) return;

        data.body = 1 + (rnd.next() % count);

        data.bodyColor = skin_colors.random2(rnd);

    }



    function setCloth(ItemData memory data, Rand memory rnd) private view {

        uint count = clothLevelCounts[data.lvl - 1];

        if (count == 0) return;

        if (!(rnd.next() % 100 < 60)) return;

        data.cloth = 1 + (rnd.next() % count);

    }



    function setEyes(ItemData memory data, Rand memory rnd) private view {

        uint count = eyesLevelCounts[data.lvl - 1];

        if (count == 0) return;

        data.eyes = 1 + (rnd.next() % count);

    }



    function setMouth(ItemData memory data, Rand memory rnd) private view {

        uint count = mouthLevelCounts[data.lvl - 1];

        if (count == 0) return;

        data.mouth = 1 + (rnd.next() % count);

    }



    function setAccessory(ItemData memory data, Rand memory rnd) private view {

        uint count = accessoryLevelCounts[data.lvl - 1];

        if (count == 0) return;

        if (!(rnd.next() % 100 < 37)) return;

        data.accessory = 1 + (rnd.next() % count);

    }



    function setHat(ItemData memory data, Rand memory rnd) private view {

        uint count = hatLevelCounts[data.lvl - 1];

        if (count == 0) return;

        if (!(rnd.next() % 100 < 37)) return;

        data.hat = 1 + (rnd.next() % count);

    }



    function setEars(ItemData memory data, Rand memory rnd) private view {

        uint count = earsLevelCounts[data.lvl - 1];

        if (count == 0) return;

        if (!(rnd.next() % 100 < 3)) return;

        data.ears = 1 + (rnd.next() % count);

    }



    // META



    function getMeta(

        SeedData calldata seed_data

    ) external view returns (string memory) {

        ItemData memory data = this.getItemData(seed_data);

        bytes memory lvl = abi.encodePacked('"level":', data.lvl.toString());

        bytes memory background = abi.encodePacked(

            ',"background":"',

            data.background,

            '"'

        );

        bytes memory body = abi.encodePacked(

            ',"bodyColor":"',

            data.bodyColor,

            '"'

        );

        bytes memory cloth = abi.encodePacked(

            ',"clothes":',

            data.cloth.toString()

        );

        bytes memory eyes = abi.encodePacked(',"eyes":', data.eyes.toString());

        bytes memory mouth = abi.encodePacked(

            ',"mouth":',

            data.mouth.toString()

        );

        bytes memory accessory = abi.encodePacked(

            ',"accessory":',

            data.accessory.toString()

        );

        bytes memory hat = abi.encodePacked(

            ',"Head Item":',

            data.hat.toString()

        );

        bytes memory ears = abi.encodePacked(',"ears":', data.ears.toString());

        bytes memory web_text = abi.encodePacked(',"web":"', web, '"');

        bytes memory description_text = abi.encodePacked(

            ',"description":"',

            description,

            '"'

        );



        return

            string(

                abi.encodePacked(

                    "{",

                    abi.encodePacked(

                        lvl,

                        background,

                        body,

                        cloth,

                        eyes,

                        mouth,

                        accessory,

                        hat,

                        ears

                    ),

                    web_text,

                    description_text,

                    "}"

                )

            );

    }



    // SVG



    function getSvg(

        SeedData calldata seed_data

    ) external view returns (string memory) {

        return toSvg(this.getItemData(seed_data));

    }



    function toSvg(ItemData memory data) private view returns (string memory) {

        require(data.lvl > 0, "lvl is zero");

        bytes memory svgStart = abi.encodePacked(

            "<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0",

            " ",

            pixelsCount.toString(),

            " ",

            pixelsCount.toString(),

            "'>"

        );



        return

            string(

                abi.encodePacked(

                    svgStart,

                    backgroundSvg(data),

                    bodySvg(data),

                    clothSvg(data),

                    earsSvg(data),

                    mouthSvg(data),

                    eyesSvg(data),

                    accessorySvg(data),

                    hatSvg(data),

                    "</svg>"

                )

            );

    }



    function backgroundSvg(

        ItemData memory data

    ) private pure returns (string memory) {

        Rect memory r = Rect(0, 0, pixelsCount, pixelsCount);

        return r.toSvg(data.background);

    }



    function bodySvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.body == 0) return "";

        return bodies[data.lvl - 1][data.body - 1].toSvg(data.bodyColor);

    }



    function clothSvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.cloth == 0) return "";

        return cloths[data.lvl - 1][data.cloth - 1].toSvg();

    }



    function eyesSvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.eyes == 0) return "";

        return eyes[data.lvl - 1][data.eyes - 1].toSvg();

    }



    function mouthSvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.mouth == 0) return "";

        return mouths[data.lvl - 1][data.mouth - 1].toSvg();

    }



    function accessorySvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.accessory == 0) return "";

        return accessories[data.lvl - 1][data.accessory - 1].toSvg();

    }



    function hatSvg(ItemData memory data) private view returns (string memory) {

        if (data.hat == 0) return "";

        return hats[data.lvl - 1][data.hat - 1].toSvg();

    }



    function earsSvg(

        ItemData memory data

    ) private view returns (string memory) {

        if (data.ears == 0) return "";

        return ears[data.lvl - 1][data.ears - 1].toSvg();

    }

}

File 5 of 8 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.20;



contract Ownable {

    address _owner;



    event RenounceOwnership();



    constructor() {

        _owner = msg.sender;

    }



    modifier onlyOwner() {

        require(_owner == msg.sender, "only owner");

        _;

    }



    function owner() external view virtual returns (address) {

        return _owner;

    }



    function ownerRenounce() public onlyOwner {

        _owner = address(0);

        emit RenounceOwnership();

    }



    function transferOwnership(address newOwner) external onlyOwner {

        _owner = newOwner;

    }

}

File 6 of 8 : Erc20.sol
pragma solidity ^0.8.20;



import "@openzeppelin/contracts/token/ERC20/IERC20.sol";

import "@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol";

import "@openzeppelin/contracts/utils/Context.sol";



contract ERC20 is Context, IERC20, IERC20Metadata {

    mapping(address => uint256) internal _balances;



    mapping(address => mapping(address => uint256)) private _allowances;



    uint256 internal _totalSupply;

    uint8 internal constant _decimals = 9;



    string private _name;

    string private _symbol;



    /**

     * @dev Sets the values for {name} and {symbol}.

     *

     * All two of these values are immutable: they can only be set once during

     * construction.

     */

    constructor(string memory name_, string memory symbol_) {

        _name = name_;

        _symbol = symbol_;

    }



    /**

     * @dev Returns the name of the token.

     */

    function name() public view virtual override returns (string memory) {

        return _name;

    }



    /**

     * @dev Returns the symbol of the token, usually a shorter version of the

     * name.

     */

    function symbol() public view virtual override returns (string memory) {

        return _symbol;

    }



    /**

     * @dev Returns the number of decimals used to get its user representation.

     * For example, if `decimals` equals `2`, a balance of `505` tokens should

     * be displayed to a user as `5.05` (`505 / 10 ** 2`).

     *

     * Tokens usually opt for a value of 18, imitating the relationship between

     * Ether and Wei. This is the default value returned by this function, unless

     * it's overridden.

     *

     * NOTE: This information is only used for _display_ purposes: it in

     * no way affects any of the arithmetic of the contract, including

     * {IERC20-balanceOf} and {IERC20-transfer}.

     */

    function decimals() public pure returns (uint8) {

        return _decimals;

    }



    /**

     * @dev See {IERC20-totalSupply}.

     */

    function totalSupply() public view virtual override returns (uint256) {

        return _totalSupply;

    }



    /**

     * @dev See {IERC20-balanceOf}.

     */

    function balanceOf(

        address account

    ) public view virtual override returns (uint256) {

        return _balances[account];

    }



    /**

     * @dev See {IERC20-transfer}.

     *

     * Requirements:

     *

     * - `to` cannot be the zero address.

     * - the caller must have a balance of at least `amount`.

     */

    function transfer(

        address to,

        uint256 amount

    ) public virtual override returns (bool) {

        address owner = _msgSender();

        _transfer(owner, to, amount);

        return true;

    }



    /**

     * @dev See {IERC20-allowance}.

     */

    function allowance(

        address owner,

        address spender

    ) public view virtual override returns (uint256) {

        return _allowances[owner][spender];

    }



    /**

     * @dev See {IERC20-approve}.

     *

     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on

     * `transferFrom`. This is semantically equivalent to an infinite approval.

     *

     * Requirements:

     *

     * - `spender` cannot be the zero address.

     */

    function approve(

        address spender,

        uint256 amount

    ) public virtual override returns (bool) {

        address owner = _msgSender();

        _approve(owner, spender, amount);

        return true;

    }



    /**

     * @dev See {IERC20-transferFrom}.

     *

     * Emits an {Approval} event indicating the updated allowance. This is not

     * required by the EIP. See the note at the beginning of {ERC20}.

     *

     * NOTE: Does not update the allowance if the current allowance

     * is the maximum `uint256`.

     *

     * Requirements:

     *

     * - `from` and `to` cannot be the zero address.

     * - `from` must have a balance of at least `amount`.

     * - the caller must have allowance for ``from``'s tokens of at least

     * `amount`.

     */

    function transferFrom(

        address from,

        address to,

        uint256 amount

    ) public virtual override returns (bool) {

        address spender = _msgSender();

        _spendAllowance(from, spender, amount);

        _transfer(from, to, amount);

        return true;

    }



    /**

     * @dev Atomically increases the allowance granted to `spender` by the caller.

     *

     * This is an alternative to {approve} that can be used as a mitigation for

     * problems described in {IERC20-approve}.

     *

     * Emits an {Approval} event indicating the updated allowance.

     *

     * Requirements:

     *

     * - `spender` cannot be the zero address.

     */

    function increaseAllowance(

        address spender,

        uint256 addedValue

    ) public virtual returns (bool) {

        address owner = _msgSender();

        _approve(owner, spender, allowance(owner, spender) + addedValue);

        return true;

    }



    /**

     * @dev Atomically decreases the allowance granted to `spender` by the caller.

     *

     * This is an alternative to {approve} that can be used as a mitigation for

     * problems described in {IERC20-approve}.

     *

     * Emits an {Approval} event indicating the updated allowance.

     *

     * Requirements:

     *

     * - `spender` cannot be the zero address.

     * - `spender` must have allowance for the caller of at least

     * `subtractedValue`.

     */

    function decreaseAllowance(

        address spender,

        uint256 subtractedValue

    ) public virtual returns (bool) {

        address owner = _msgSender();

        uint256 currentAllowance = allowance(owner, spender);

        require(

            currentAllowance >= subtractedValue,

            "ERC20: decreased allowance below zero"

        );

        unchecked {

            _approve(owner, spender, currentAllowance - subtractedValue);

        }



        return true;

    }



    /**

     * @dev Moves `amount` of tokens from `from` to `to`.

     *

     * This internal function is equivalent to {transfer}, and can be used to

     * e.g. implement automatic token fees, slashing mechanisms, etc.

     *

     * Emits a {Transfer} event.

     *

     * Requirements:

     *

     * - `from` cannot be the zero address.

     * - `to` cannot be the zero address.

     * - `from` must have a balance of at least `amount`.

     */

    function _transfer(

        address from,

        address to,

        uint256 amount

    ) internal virtual {

        require(from != address(0), "ERC20: transfer from the zero address");



        uint256 fromBalance = _balances[from];

        require(

            fromBalance >= amount,

            "ERC20: transfer amount exceeds balance"

        );

        unchecked {

            _balances[from] = fromBalance - amount;

            // Overflow not possible: the sum of all balances is capped by totalSupply, and the sum is preserved by

            // decrementing then incrementing.

            _balances[to] += amount;

        }



        emit Transfer(from, to, amount);

    }



    /** @dev Creates `amount` tokens and assigns them to `account`, increasing

     * the total supply.

     *

     * Emits a {Transfer} event with `from` set to the zero address.

     *

     * Requirements:

     *

     * - `account` cannot be the zero address.

     */

    function _mint(address account, uint256 amount) internal virtual {

        require(account != address(0), "ERC20: mint to the zero address");



        _totalSupply += amount;

        unchecked {

            // Overflow not possible: balance + amount is at most totalSupply + amount, which is checked above.

            _balances[account] += amount;

        }

        emit Transfer(address(0), account, amount);

    }



    /**

     * @dev Erases `amount` tokens from `account`, reducing the

     * total supply.

     *

     * Emits a {Transfer} event with `to` set to the zero address.

     *

     * Requirements:

     *

     * - `account` cannot be the zero address.

     * - `account` must have at least `amount` tokens.

     */

    function _burn(address account, uint256 amount) internal virtual {

        require(account != address(0), "ERC20: burn from the zero address");



        uint256 accountBalance = _balances[account];

        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");

        unchecked {

            _balances[account] = accountBalance - amount;

            // Overflow not possible: amount <= accountBalance <= totalSupply.

            _totalSupply -= amount;

        }



        emit Transfer(account, address(0), amount);

    }



    /**

     * @dev Sets `amount` as the allowance of `spender` over the `owner` s tokens.

     *

     * This internal function is equivalent to `approve`, and can be used to

     * e.g. set automatic allowances for certain subsystems, etc.

     *

     * Emits an {Approval} event.

     *

     * Requirements:

     *

     * - `owner` cannot be the zero address.

     * - `spender` cannot be the zero address.

     */

    function _approve(

        address owner,

        address spender,

        uint256 amount

    ) internal virtual {

        require(owner != address(0), "ERC20: approve from the zero address");

        require(spender != address(0), "ERC20: approve to the zero address");



        _allowances[owner][spender] = amount;

        emit Approval(owner, spender, amount);

    }



    /**

     * @dev Updates `owner` s allowance for `spender` based on spent `amount`.

     *

     * Does not update the allowance amount in case of infinite allowance.

     * Revert if not enough allowance is available.

     *

     * Might emit an {Approval} event.

     */

    function _spendAllowance(

        address owner,

        address spender,

        uint256 amount

    ) internal virtual {

        uint256 currentAllowance = allowance(owner, spender);

        if (currentAllowance != type(uint256).max) {

            require(

                currentAllowance >= amount,

                "ERC20: insufficient allowance"

            );

            unchecked {

                _approve(owner, spender, currentAllowance - amount);

            }

        }

    }

}

File 7 of 8 : Pepi.sol
//https://twitter.com/Pepi_ERC20i

//https://t.me/pepe_ERC20i

//https://pepe-erc20i.vip/



// SPDX-License-Identifier: MIT

pragma solidity ^0.8.21;



import "./Erc20.sol";

import "./PoolCreatableErc20i.sol";

import "../Generator.sol";



library ExtraSeedLibrary {

    function extra(

        address account,

        uint extraSeed

    ) internal pure returns (uint256) {

        return uint(keccak256(abi.encodePacked(account, extraSeed)));

    }

}



abstract contract Mushrooms is PoolCreatableErc20i {

    using ExtraSeedLibrary for address;

    mapping(address owner => uint) _counts;

    mapping(address owner => mapping(uint index => SeedData seed_data)) _ownedTokens;

    mapping(address owner => mapping(uint tokenId => uint)) _ownedTokensIndex;

    mapping(address owner => mapping(uint => bool)) _owns;

    mapping(address owner => SeedData seed_data) _spores;

    mapping(uint index => address user) _holderList;

    mapping(address user => uint index) _holderListIndexes;

    uint _mushroomsTotalCount;

    uint _holdersCount;

    uint _sporesTotalCount;

    uint _random_nonce;



    event OnMushroomTransfer(

        address indexed from,

        address indexed to,

        SeedData seed_data

    );

    event OnSporesGrow(address indexed holder, SeedData seed_data);

    event OnSporesShrink(address indexed holder, SeedData seed_data);



    constructor()

        PoolCreatableErc20i("PEPi", "PEPI", msg.sender)

    {}



    modifier holder_calculate(address acc1, address acc2) {

        bool before1 = _isHolder(acc1);

        bool before2 = _isHolder(acc2);

        _;

        bool after1 = _isHolder(acc1);

        bool after2 = _isHolder(acc2);

        if (!before1 && after1) _addHolder(acc1);

        if (before1 && !after1) _removeHolder(acc1);

        if (!before2 && after2) _addHolder(acc2);

        if (before2 && !after2) _removeHolder(acc2);

    }



    function _isHolder(address account) private view returns (bool) {

        if (

            account == address(this) ||

            account == _pool ||

            account == address(0)

        ) return false;



        return (_spores[account].seed + this.mushroomCount(account)) > 0;

    }



    function trySeedTransfer(

        address from,

        address to,

        uint amount

    ) internal holder_calculate(from, to) {

        if (from == address(this)) return;

        uint seed = amount / (10 ** decimals());



        if (seed > 0 && from != _pool && to != _pool) {

            // transfer growing mushroom

            if (_spores[from].seed == seed && !_owns[to][seed]) {

                SeedData memory data = _spores[from];

                _removeSeedCount(from, seed);

                _addTokenToOwnerEnumeration(to, data);

                emit OnMushroomTransfer(from, to, data);

                return;

            }



            // transfer collected mushroom

            if (_owns[from][seed] && !_owns[to][seed]) {

                SeedData memory data = _ownedTokens[from][

                    _ownedTokensIndex[from][seed]

                ];

                _removeTokenFromOwnerEnumeration(from, seed);

                _addTokenToOwnerEnumeration(to, data);

                emit OnMushroomTransfer(from, to, data);

                return;

            }

        }



        // transfer spores

        uint lastBalanceFromSeed = _balances[from] / (10 ** decimals());

        uint newBalanceFromSeed = (_balances[from] - amount) /

            (10 ** decimals());

        _removeSeedCount(from, lastBalanceFromSeed - newBalanceFromSeed);

        _addSeedCount(to, seed);

    }



    function _addHolder(address account) private {

        _holderList[_holdersCount] = account;

        _holderListIndexes[account] = _holdersCount;

        ++_holdersCount;

    }



    function _removeHolder(address account) private {

        if (_holdersCount == 0) return;

        uint removingIndex = _holderListIndexes[account];

        if (removingIndex != _holdersCount - 1) {

            address lastHolder = _holderList[_holdersCount - 1];

            _holderList[removingIndex] = lastHolder;

            _holderListIndexes[lastHolder] = removingIndex;

        }



        if (_holdersCount > 0) --_holdersCount;

        delete _holderListIndexes[account];

        delete _holderList[_holdersCount];

    }



    function getHolderByIndex(uint index) public view returns (address) {

        return _holderList[index];

    }



    function getHoldersList(

        uint startIndex,

        uint count

    ) public view returns (address[] memory) {

        address[] memory holders = new address[](count);

        for (uint i = 0; i < count; ++i)

            holders[i] = getHolderByIndex(startIndex + i);

        return holders;

    }



    function _addSeedCount(address account, uint seed) private {

        if (seed == 0) return;

        if (account == _pool) return;

        SeedData memory last = _spores[account];



        if (_spores[account].seed == 0)

            _spores[account].seed2 = RandLib.random_value(++_random_nonce);

        _spores[account].seed += seed;

        _spores[account].extra = account.extra(++_random_nonce);



        if (last.seed == 0 && _spores[account].seed > 0) ++_sporesTotalCount;



        emit OnSporesGrow(account, _spores[account]);

    }



    function _removeSeedCount(address account, uint seed) private {

        if (seed == 0) return;

        if (account == _pool) return;

        SeedData memory lastSpores = _spores[account];

        if (_spores[account].seed >= seed) {

            _spores[account].seed -= seed;

            _spores[account].extra = account.extra(++_random_nonce);

            if (lastSpores.seed > 0 && _spores[account].seed == 0) {

                if (_sporesTotalCount > 0) --_sporesTotalCount;

            }

            emit OnSporesShrink(account, _spores[account]);

            return;

        }

        uint seedRemains = seed - _spores[account].seed;

        _spores[account].seed = 0;

        _spores[account].extra = account.extra(++_random_nonce);



        // remove mushrooms

        uint count = _counts[account];

        uint removed;

        for (uint i = 0; i < count && removed < seedRemains; ++i) {

            removed += _removeFirstTokenFromOwner(account);

        }



        if (removed > seedRemains) {

            _spores[account].seed += removed - seedRemains;

            _spores[account].extra = account.extra(++_random_nonce);

        }

        if (lastSpores.seed > 0 && _spores[account].seed == 0) {

            if (_sporesTotalCount > 0) --_sporesTotalCount;

        }

        if (lastSpores.seed == 0 && _spores[account].seed > 0)

            ++_sporesTotalCount;

        emit OnSporesShrink(account, _spores[account]);

    }



    function _addTokenToOwnerEnumeration(

        address to,

        SeedData memory data

    ) private {

        if (to == _pool) return;

        ++_counts[to];

        ++_mushroomsTotalCount;

        uint length = _counts[to] - 1;

        _ownedTokens[to][length] = data;

        _ownedTokensIndex[to][data.seed] = length;

        _owns[to][data.seed] = true;

    }



    function _removeTokenFromOwnerEnumeration(address from, uint seed) private {

        if (from == _pool) return;

        if (_counts[from] > 0) --_counts[from];

        if (_mushroomsTotalCount > 0) --_mushroomsTotalCount;

        _owns[from][seed] = false;

        uint lastTokenIndex = _counts[from];

        uint tokenIndex = _ownedTokensIndex[from][seed];

        SeedData memory data = _ownedTokens[from][tokenIndex];



        // When the token to delete is the last token, the swap operation is unnecessary

        if (tokenIndex != lastTokenIndex) {

            SeedData memory lastTokenId = _ownedTokens[from][lastTokenIndex];



            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token

            _ownedTokensIndex[from][lastTokenId.seed] = tokenIndex; // Update the moved token's index

        }



        delete _ownedTokensIndex[from][data.seed];

        delete _ownedTokens[from][lastTokenIndex];

    }



    function _removeFirstTokenFromOwner(address owner) private returns (uint) {

        uint count = _counts[owner];

        if (count == 0) return 0;

        uint seed = _ownedTokens[owner][0].seed;

        _removeTokenFromOwnerEnumeration(owner, seed);

        return seed;

    }



    function isOwnerOf(address owner, uint seed) external view returns (bool) {

        return _owns[owner][seed];

    }



    function sporesDegree(

        address owner

    ) external view returns (SeedData memory data) {

        return _spores[owner];

    }



    function mushroomCount(address owner) external view returns (uint) {

        return _counts[owner];

    }



    function mushroomOfOwnerByIndex(

        address owner,

        uint index

    ) external view returns (SeedData memory data) {

        return _ownedTokens[owner][index];

    }



    function mushroomsTotalCount() external view returns (uint) {

        return _mushroomsTotalCount;

    }



    function holdersCount() external view returns (uint) {

        return _holdersCount;

    }



    function sporesTotalCount() external view returns (uint) {

        return _sporesTotalCount;

    }



    function getHolderIndex(address account) external view returns (uint) {

        return _holderListIndexes[account];

    }

}



contract Pepi is Mushrooms, Generator {

    uint constant _startTotalSupply = 13370 * (10 ** _decimals);

    uint constant _startMaxBuyCount = (_startTotalSupply * 5) / 10000;

    uint constant _addMaxBuyPercentPerSec = 5; // 100%=_addMaxBuyPrecesion add 0.005%/second

    uint constant _addMaxBuyPrecesion = 100000;



    constructor() {

        _mint(msg.sender, _startTotalSupply);

    }



    modifier maxBuyLimit(uint256 amount) {

        require(amount <= maxBuy(), "max buy limit");

        _;

    }



    function maxBuy() public view returns (uint256) {

        if (!isStarted()) return _startTotalSupply;

        uint256 count = _startMaxBuyCount +

            (_startTotalSupply *

                (block.timestamp - _startTime) *

                _addMaxBuyPercentPerSec) /

            _addMaxBuyPrecesion;

        if (count > _startTotalSupply) count = _startTotalSupply;

        return count;

    }



    function _transfer(

        address from,

        address to,

        uint256 amount

    ) internal override {

        if (isStarted()) {

            trySeedTransfer(from, to, amount);

        } else {

            require(from == _owner || to == _owner, "not started");

        }



        // allow burning

        if (to == address(0)) {

            _burn(from, amount);

            return;

        }



        // system transfers

        if (from == address(this)) {

            super._transfer(from, to, amount);

            return;

        }



        if (_feeLocked) {

            super._transfer(from, to, amount);

            return;

        } else {

            if (from == _pool) {

                buy(to, amount);

                return;

            }

        }



        super._transfer(from, to, amount);

    }



    function buy(

        address to,

        uint256 amount

    ) private maxBuyLimit(amount) lockFee {

        super._transfer(_pool, to, amount);

    }



    function burnCount() public view returns (uint256) {

        return _startTotalSupply - totalSupply();

    }

}

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

pragma solidity ^0.8.21;



import "./Erc20.sol";



abstract contract PoolCreatableErc20i is ERC20 {

    address internal _pool;

    uint256 internal _startTime;

    bool internal _feeLocked;

    address immutable _pairCreator;



    constructor(

        string memory name_,

        string memory symbol_,

        address pairCreator

    ) ERC20(name_, symbol_) {

        _pairCreator = pairCreator;

    }



    modifier lockFee() {

        _feeLocked = true;

        _;

        _feeLocked = false;

    }



    function launch(address poolAddress) external payable {

        require(msg.sender == _pairCreator);

        require(!isStarted());

        _pool = poolAddress;

        _startTime = block.timestamp;

    }



    function isStarted() internal view returns (bool) {

        return _pool != address(0);

    }



    function pool() external view returns (address) {

        return _pool;

    }

}

Settings
{

  "optimizer": {

    "enabled": true,

    "runs": 200

  },

  "evmVersion": "paris",

  "outputSelection": {

    "*": {

      "*": [

        "evm.bytecode",

        "evm.deployedBytecode",

        "devdoc",

        "userdoc",

        "metadata",

        "abi"

      ]

    }

  },

  "libraries": {}

}

Contract Security Audit

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnMushroomTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesGrow","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"holder","type":"address"},{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"indexed":false,"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"OnSporesShrink","type":"event"},{"anonymous":false,"inputs":[],"name":"RenounceOwnership","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"burnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getHolderByIndex","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getHolderIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"startIndex","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"getHoldersList","outputs":[{"internalType":"address[]","name":"","type":"address[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getItemData","outputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"string","name":"background","type":"string"},{"internalType":"uint256","name":"body","type":"uint256"},{"internalType":"string","name":"bodyColor","type":"string"},{"internalType":"uint256","name":"cloth","type":"uint256"},{"internalType":"uint256","name":"eyes","type":"uint256"},{"internalType":"uint256","name":"mouth","type":"uint256"},{"internalType":"uint256","name":"accessory","type":"uint256"},{"internalType":"uint256","name":"hat","type":"uint256"},{"internalType":"uint256","name":"ears","type":"uint256"}],"internalType":"struct ItemData","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getMeta","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"seed_data","type":"tuple"}],"name":"getSvg","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"holdersCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"seed","type":"uint256"}],"name":"isOwnerOf","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"poolAddress","type":"address"}],"name":"launch","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"maxBuy","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"mushroomCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"mushroomOfOwnerByIndex","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mushroomsTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerRenounce","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"pool","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setAccessories","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"}],"internalType":"struct Rect[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileData[]","name":"data","type":"tuple[]"}],"name":"setBodies","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setCloths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setEars","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setEyes","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setHats","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"components":[{"internalType":"uint256","name":"lvl","type":"uint256"},{"internalType":"uint256","name":"file","type":"uint256"},{"components":[{"internalType":"uint8","name":"x","type":"uint8"},{"internalType":"uint8","name":"y","type":"uint8"},{"internalType":"uint8","name":"width","type":"uint8"},{"internalType":"uint8","name":"height","type":"uint8"},{"internalType":"uint24","name":"color","type":"uint24"}],"internalType":"struct RectColored[]","name":"rects","type":"tuple[]"}],"internalType":"struct FileDataColored[]","name":"data","type":"tuple[]"}],"name":"setMouths","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"sporesDegree","outputs":[{"components":[{"internalType":"uint256","name":"seed","type":"uint256"},{"internalType":"uint256","name":"seed2","type":"uint256"},{"internalType":"uint256","name":"extra","type":"uint256"}],"internalType":"struct SeedData","name":"data","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"sporesTotalCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6007610180818152660236333373130360cc1b6101a05260a09081526101c0828152662364623431363160c81b6101e05260c052610200828152660233961656230360cc1b6102205260e052610240828152662339323431663360c81b610260526101005261028082815266119a989c19333360c91b6102a052610120526102c08281526611b0993099309960c91b6102e052610140526103406040526103008281526611b33333199c9960c91b61032052610160526100c291602291906106aa565b506040805161058081018252600761054082018181526608cd4cce0c8ccd60ca1b610560840181905290835283518085018552828152662334396132363960c81b60208281018290528086019290925285518087018752848152662336376434383760c81b8184018190528688019190915286518088018852858152660233462393534360cc1b81850181905260608801919091528751808901895286815280850186905260808801528751808901895286815280850184905260a08801528751808901895286815280850183905260c08801528751808901895286815280850182905260e08801528751808901895286815280850186905261010088015287518089018952868152808501849052610120880152875180890189528681528085018390526101408801528751808901895286815280850182905261016088015287518089018952868152808501869052610180880152875180890189528681528085018490526101a0880152875180890189528681528085018390526101c0880152875180890189528681528085018290526101e08801528751808901895286815280850186905261020088015287518089018952868152808501849052610220880152875180890189528681528085018390526102408801528751808901895286815280850182905261026088015287518089018952868152808501869052610280880152875180890189528681528085018490526102a0880152875180890189528681528085018390526102c0880152875180890189528681528085018290526102e0880152875180890189528681528085019590955261030087019490945286518088018852858152808401929092526103208601919091528551808701875284815280830191909152610340850152845180860186528381528082019290925261036084019190915283518085018552828152660233739343130360cc1b8183015261038084015283518085018552828152660233861386130360cc1b818301526103a0840152835180850185528281526608d88d984d0c5960ca1b818301526103c0840152835180850185528281526608d918d8cdcc8d60ca1b818301526103e084015283518085018552828152662334313932633360c81b818301526104008401528351808501855282815266119b18b099333360c91b8183015261042084015283518085018552828152662336316433653360c81b81830152610440840152835180850185528281526611b0991b98b33360c91b81830152610460840152835180850185528281526611b21a1a33181b60c91b8183015261048084015283518085018552828152662363663435386360c81b818301526104a084015283518085018552828152662364346133376360c81b818301526104c0840152835180850185528281526611a323219821a160c91b818301526104e084015283518085018552828152660233830303038360cc1b81830152610500840152835180850190945290835266119c231818232360c91b9083015261052081019190915261053490602390602a610700565b5034801561054157600080fd5b50604051806040016040528060048152602001635045506960e01b815250604051806040016040528060048152602001635045504960e01b815250338282816003908161058e9190610856565b50600461059b8282610856565b5050506001600160a01b03166080525050601380546001600160a01b031916339081179091556105e2906105d16009600a610a11565b6105dd9061343a610a27565b6105e7565b610a51565b6001600160a01b0382166106415760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546106539190610a3e565b90915550506001600160a01b038216600081815260208181526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b8280548282559060005260206000209081019282156106f0579160200282015b828111156106f057825182906106e09082610856565b50916020019190600101906106ca565b506106fc929150610746565b5090565b8280548282559060005260206000209081019282156106f0579160200282015b828111156106f057825182906107369082610856565b5091602001919060010190610720565b808211156106fc57600061075a8282610763565b50600101610746565b50805461076f906107cb565b6000825580601f1061077f575050565b601f01602090049060005260206000209081019061079d91906107a0565b50565b5b808211156106fc57600081556001016107a1565b634e487b7160e01b600052604160045260246000fd5b600181811c908216806107df57607f821691505b6020821081036107ff57634e487b7160e01b600052602260045260246000fd5b50919050565b601f821115610851576000816000526020600020601f850160051c8101602086101561082e5750805b601f850160051c820191505b8181101561084d5782815560010161083a565b5050505b505050565b81516001600160401b0381111561086f5761086f6107b5565b6108838161087d84546107cb565b84610805565b602080601f8311600181146108b857600084156108a05750858301515b600019600386901b1c1916600185901b17855561084d565b600085815260208120601f198616915b828110156108e7578886015182559484019460019091019084016108c8565b50858210156109055787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600181815b8085111561096657816000190482111561094c5761094c610915565b8085161561095957918102915b93841c9390800290610930565b509250929050565b60008261097d57506001610a0b565b8161098a57506000610a0b565b81600181146109a057600281146109aa576109c6565b6001915050610a0b565b60ff8411156109bb576109bb610915565b50506001821b610a0b565b5060208310610133831016604e8410600b84101617156109e9575081810a610a0b565b6109f3838361092b565b8060001904821115610a0757610a07610915565b0290505b92915050565b6000610a2060ff84168361096e565b9392505050565b8082028115828204841417610a0b57610a0b610915565b80820180821115610a0b57610a0b610915565b60805161544d610a6c600039600061089b015261544d6000f3fe6080604052600436106102255760003560e01c806370db69d611610123578063a435130b116100ab578063cb8106f41161006f578063cb8106f4146106c7578063d6875752146106fd578063dd62ed3e1461071d578063eb518bf61461073d578063f2fde38b1461075257600080fd5b8063a435130b14610601578063a457c2d714610621578063a775188a14610641578063a9059cbb14610661578063c5b8f7721461068157600080fd5b806395d89b41116100f257806395d89b411461054057806395e4b21b14610555578063997d54f51461058b5780639c216508146105ab5780639eb63de6146105e157600080fd5b806370db69d6146104cd57806386169143146104e25780638ab4598e146105025780638da5cb5b1461052257600080fd5b8063333a0072116101b157806363f6e78c1161017557806363f6e78c14610415578063641f334a146104355780636b4ed21b146104625780636c835c4a1461047757806370a082311461049757600080fd5b8063333a00721461037e57806335ad0cea1461039357806336a6c7bc146103c057806339509351146103e0578063524773ce1461040057600080fd5b806318160ddd116101f857806318160ddd146102f95780632088131914610318578063214013ca1461032d57806323b872dd14610342578063313ce5671461036257600080fd5b806306fdde031461022a578063095ea7b3146102555780630fd9587e1461028557806316f0115b146102c7575b600080fd5b34801561023657600080fd5b5061023f610772565b60405161024c91906143b7565b60405180910390f35b34801561026157600080fd5b506102756102703660046143e1565b610804565b604051901515815260200161024c565b34801561029157600080fd5b506102a56102a03660046143e1565b61081e565b604080518251815260208084015190820152918101519082015260600161024c565b3480156102d357600080fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161024c565b34801561030557600080fd5b506002545b60405190815260200161024c565b34801561032457600080fd5b5060115461030a565b61034061033b36600461440b565b610890565b005b34801561034e57600080fd5b5061027561035d366004614426565b610901565b34801561036e57600080fd5b506040516009815260200161024c565b34801561038a57600080fd5b50610340610925565b34801561039f57600080fd5b506103b36103ae366004614462565b610993565b60405161024c9190614484565b3480156103cc57600080fd5b506103406103db36600461451d565b610a2e565b3480156103ec57600080fd5b506102756103fb3660046143e1565b610a6a565b34801561040c57600080fd5b5061030a610a8c565b34801561042157600080fd5b5061023f61043036600461455f565b610abe565b34801561044157600080fd5b5061045561045036600461455f565b610dd7565b60405161024c9190614577565b34801561046e57600080fd5b5060105461030a565b34801561048357600080fd5b5061034061049236600461451d565b611774565b3480156104a357600080fd5b5061030a6104b236600461440b565b6001600160a01b031660009081526020819052604090205490565b3480156104d957600080fd5b5061030a6117ac565b3480156104ee57600080fd5b506103406104fd36600461451d565b6118a5565b34801561050e57600080fd5b5061034061051d36600461451d565b6118dd565b34801561052e57600080fd5b506013546001600160a01b03166102e1565b34801561054c57600080fd5b5061023f611915565b34801561056157600080fd5b5061030a61057036600461440b565b6001600160a01b03166000908152600e602052604090205490565b34801561059757600080fd5b506103406105a636600461451d565b611924565b3480156105b757600080fd5b5061030a6105c636600461440b565b6001600160a01b031660009081526008602052604090205490565b3480156105ed57600080fd5b506103406105fc36600461451d565b61195c565b34801561060d57600080fd5b5061023f61061c36600461455f565b611994565b34801561062d57600080fd5b5061027561063c3660046143e1565b611a18565b34801561064d57600080fd5b506102a561065c36600461440b565b611a93565b34801561066d57600080fd5b5061027561067c3660046143e1565b611af9565b34801561068d57600080fd5b5061027561069c3660046143e1565b6001600160a01b03919091166000908152600b60209081526040808320938352929052205460ff1690565b3480156106d357600080fd5b506102e16106e2366004614619565b6000908152600d60205260409020546001600160a01b031690565b34801561070957600080fd5b5061034061071836600461451d565b611b07565b34801561072957600080fd5b5061030a610738366004614632565b611b3f565b34801561074957600080fd5b50600f5461030a565b34801561075e57600080fd5b5061034061076d36600461440b565b611b6a565b60606003805461078190614665565b80601f01602080910402602001604051908101604052809291908181526020018280546107ad90614665565b80156107fa5780601f106107cf576101008083540402835291602001916107fa565b820191906000526020600020905b8154815290600101906020018083116107dd57829003601f168201915b5050505050905090565b600033610812818585611bb6565b60019150505b92915050565b61084260405180606001604052806000815260200160008152602001600081525090565b506001600160a01b0382166000908152600960209081526040808320848452825291829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108c557600080fd5b6005546001600160a01b0316156108db57600080fd5b600580546001600160a01b0319166001600160a01b039290921691909117905542600655565b60003361090f858285611cdb565b61091a858585611d55565b506001949350505050565b6013546001600160a01b031633146109585760405162461bcd60e51b815260040161094f90614699565b60405180910390fd5b601380546001600160a01b03191690556040517f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb90600090a1565b606060008267ffffffffffffffff8111156109b0576109b06146bd565b6040519080825280602002602001820160405280156109d9578160200160208202803683370190505b50905060005b83811015610a26576109f46106e282876146e9565b828281518110610a0657610a066146fc565b6001600160a01b03909216602092830291909101909101526001016109df565b509392505050565b6013546001600160a01b03163314610a585760405162461bcd60e51b815260040161094f90614699565b610a66602083836019611e52565b5050565b600033610812818585610a7d8383611b3f565b610a8791906146e9565b611bb6565b6000610a9760025490565b610aa36009600a6147f6565b610aaf9061343a614805565b610ab9919061481c565b905090565b6040805163320f99a560e11b81528235600482015260208301356024820152908201356044820152606090600090309063641f334a90606401600060405180830381865afa158015610b14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3c91908101906148e1565b90506000610b4d8260000151611e9a565b604051602001610b5d91906149c7565b604051602081830303815290604052905060008260200151604051602001610b8591906149f8565b604051602081830303815290604052905060008360600151604051602001610bad9190614a3b565b60405160208183030381529060405290506000610bcd8560800151611e9a565b604051602001610bdd9190614a7d565b60405160208183030381529060405290506000610bfd8660a00151611e9a565b604051602001610c0d9190614ab1565b60405160208183030381529060405290506000610c2d8760c00151611e9a565b604051602001610c3d9190614ad5565b60405160208183030381529060405290506000610c5d8860e00151611e9a565b604051602001610c6d9190614b07565b60405160208183030381529060405290506000610c8e896101000151611e9a565b604051602001610c9e9190614b3d565b60405160208183030381529060405290506000610cbf8a6101200151611e9a565b604051602001610ccf9190614b66565b604051602081830303815290604052905060006040518060400160405280601881526020017f68747470733a2f2f706570652d6572633230692e7669702f0000000000000000815250604051602001610d289190614b8a565b60408051601f198184030181526101c0830190915261018e8083529092506000919061528a6020830139604051602001610d629190614bc6565b60405160208183030381529060405290508a8a8a8a8a8a8a8a8a604051602001610d9499989796959493929190614c0a565b60408051601f1981840301815290829052610db59184908490602001614ccb565b6040516020818303038152906040529c50505050505050505050505050919050565b610ddf614296565b6040805160a081018252833581526020808501359082015283820135918101919091526000606082018190526080820152610e18614296565b610e2182611fa3565b610e2c9060016146e9565b8152610e38818361200a565b610e4281836120fa565b610e4c818361224c565b610e5681836122e4565b610e60818361235b565b610e6a81836123d2565b610e74818361246a565b610e7e8183612503565b8051600103610eed578060c00151600903610eba5760078160e0015110158015610ead575060098160e0015111155b15610eba57600060e08201525b8060a00151600503610eed57600a8160e0015110158015610ee05750600d8160e0015111155b15610eed57600060e08201525b8051600203610f2057601981610100015110158015610f125750601c81610100015111155b15610f205760006101208201525b8051600303610fd3578060c00151600903610f59578060e0015160011480610f4c57508060e001516002145b15610f5957600060e08201525b8060a00151600503610fa9578060e0015160031480610f7c57508060e001516006145b80610f9c5750600f8160e0015110158015610f9c575060148160e0015111155b15610fa957600060e08201525b602c81610100015110158015610fc55750602f81610100015111155b15610fd35760006101208201525b80516004036110d5578060a0015160050361106c578060e0015160011480610fff57508060e001516005145b8061101f575060088160e001511015801561101f5750600d8160e0015111155b8061103f5750600e8160e001511015801561103f575060138160e0015111155b8061105f575060148160e001511015801561105f575060198160e0015111155b1561106c57600060e08201525b8060e001516005036110ab578060a001516005148061108f57508060e001516009145b8061109e57508060e00151600a145b156110ab57600060a08201525b6036816101000151101580156110c75750603981610100015111155b156110d55760006101208201525b805160050361126b578060c0015160090361111f578060e00151602c1480611112575060148160e0015110158015611112575060198160e0015111155b1561111f57600060e08201525b8060a001516005036111b25760088160e00151101580156111455750600d8160e0015111155b806111655750600e8160e0015110158015611165575060138160e0015111155b806111855750601a8160e00151101580156111855750601f8160e0015111155b806111a5575060208160e00151101580156111a5575060258160e0015111155b156111b257600060e08201525b806101000151603103611241578060e00151600214806111d657508060e001516005145b806111e557508060e001516006145b806111f457508060e00151602c145b80611214575060148160e0015110158015611214575060198160e0015111155b80611234575060268160e00151101580156112345750602b8160e0015111155b1561124157600060e08201525b60468161010001511015801561125d5750604981610100015111155b1561126b5760006101208201525b8051600603611613578060c001516006036112c757603f8160e001511015801561129a575060418160e0015111155b806112ba575060458160e00151101580156112ba575060478160e0015111155b156112c757600060e08201525b8060c001516009036113e6578060e00151600314806112ea57508060e001516030145b806112f957508060e001516037145b806113195750601e8160e0015110158015611319575060238160e0015111155b80611339575060248160e0015110158015611339575060298160e0015111155b80611359575060318160e0015110158015611359575060368160e0015111155b80611379575060398160e00151101580156113795750603b8160e0015111155b806113995750603f8160e0015110158015611399575060418160e0015111155b806113b9575060458160e00151101580156113b9575060478160e0015111155b806113d95750604b8160e00151101580156113d95750604d8160e0015111155b156113e657600060e08201525b8060c00151600a036114395760458160e001511015801561140c575060478160e0015111155b8061142c5750604b8160e001511015801561142c5750604d8160e0015111155b1561143957600060e08201525b8060a0015160050361153a578060e001516011148061146d575060058160e001511015801561146d5750600a8160e0015111155b8061148d5750600b8160e001511015801561148d575060108160e0015111155b806114ad575060128160e00151101580156114ad575060178160e0015111155b806114cd5750602a8160e00151101580156114cd5750602f8160e0015111155b806114ed575060488160e00151101580156114ed5750604a8160e0015111155b8061150d575060458160e001511015801561150d575060478160e0015111155b8061152d5750603f8160e001511015801561152d575060418160e0015111155b1561153a57600060e08201525b8061010001516032036115e9578060e001516002148061155e57508060e001516011145b8061156d57508060e001516030145b8061157c57508060e001516037145b8061159c575060188160e001511015801561159c5750601d8160e0015111155b806115bc5750601e8160e00151101580156115bc575060238160e0015111155b806115dc575060248160e00151101580156115dc575060298160e0015111155b156115e957600060e08201525b6048816101000151101580156116055750604881610100015111155b156116135760006101208201525b8060a00151600c0361176d57805160020361164f57600a8160e00151101580156116425750600d8160e0015111155b1561164f57600060e08201525b805160030361168e5760068160e001511015806116815750600f8160e0015110158015611681575060148160e0015111155b1561168e57600060e08201525b80516004036116cd5760058160e001511015806116c0575060088160e00151101580156116c0575060138160e0015111155b156116cd57600060e08201525b805160050361171d57601a8160e00151101580156116f05750601f8160e0015111155b806117105750600e8160e0015110158015611710575060138160e0015111155b1561171d57600060e08201525b805160060361176d57600b8160e0015110158015611740575060178160e0015111155b806117605750602a8160e00151101580156117605750602f8160e0015111155b1561176d57600060e08201525b9392505050565b6013546001600160a01b0316331461179e5760405162461bcd60e51b815260040161094f90614699565b610a66601f83836018611e52565b60006117c26005546001600160a01b0316151590565b6117de576117d26009600a6147f6565b610ab99061343a614805565b6000620186a06005600654426117f4919061481c565b6118006009600a6147f6565b61180c9061343a614805565b6118169190614805565b6118209190614805565b61182a9190614d45565b6127106118396009600a6147f6565b6118459061343a614805565b611850906005614805565b61185a9190614d45565b61186491906146e9565b90506118726009600a6147f6565b61187e9061343a614805565b8111156118a0576118916009600a6147f6565b61189d9061343a614805565b90505b919050565b6013546001600160a01b031633146118cf5760405162461bcd60e51b815260040161094f90614699565b610a6660218383601a611e52565b6013546001600160a01b031633146119075760405162461bcd60e51b815260040161094f90614699565b610a66601e83836017611e52565b60606004805461078190614665565b6013546001600160a01b0316331461194e5760405162461bcd60e51b815260040161094f90614699565b610a66601c83836015611e52565b6013546001600160a01b031633146119865760405162461bcd60e51b815260040161094f90614699565b610a66601d83836016611e52565b6040805163320f99a560e11b8152823560048201526020830135602482015290820135604482015260609061081890309063641f334a90606401600060405180830381865afa1580156119eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a1391908101906148e1565b61259c565b60003381611a268286611b3f565b905083811015611a865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161094f565b61091a8286868403611bb6565b611ab760405180606001604052806000815260200160008152602001600081525090565b506001600160a01b03166000908152600c6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b600033610812818585611d55565b6013546001600160a01b03163314611b315760405162461bcd60e51b815260040161094f90614699565b610a66601b8383601461268b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6013546001600160a01b03163314611b945760405162461bcd60e51b815260040161094f90614699565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611c185760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161094f565b6001600160a01b038216611c795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161094f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000611ce78484611b3f565b90506000198114611d4f5781811015611d425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161094f565b611d4f8484848403611bb6565b50505050565b6005546001600160a01b031615611d7657611d718383836126cc565b611dd9565b6013546001600160a01b0384811691161480611d9f57506013546001600160a01b038381169116145b611dd95760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b604482015260640161094f565b6001600160a01b038216611df657611df18382612a37565b505050565b306001600160a01b03841603611e1157611df1838383612b61565b60075460ff1615611e2757611df1838383612b61565b6005546001600160a01b0390811690841603611e4757611df18282612ca4565b611df1838383612b61565b60005b82811015611e9357611e8b85858584818110611e7357611e736146fc565b9050602002810190611e859190614d59565b84612d1f565b600101611e55565b5050505050565b606081600003611ec15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eeb5780611ed581614d79565b9150611ee49050600a83614d45565b9150611ec5565b60008167ffffffffffffffff811115611f0657611f066146bd565b6040519080825280601f01601f191660200182016040528015611f30576020820181803683370190505b5090505b8415611f9b57611f4560018361481c565b9150611f52600a86614d92565b611f5d9060306146e9565b60f81b818381518110611f7257611f726146fc565b60200101906001600160f81b031916908160001a905350611f94600a86614d45565b9450611f34565b949350505050565b6000600b82600001511015611fba57506000919050565b815160161115611fcc57506001919050565b815160211115611fde57506002919050565b8151602c1115611ff057506003919050565b81516038111561200257506004919050565b506005919050565b6120ee816022805480602002602001604051908101604052809291908181526020016000905b828210156120dc57838290600052602060002001805461204f90614665565b80601f016020809104026020016040519081016040528092919081815260200182805461207b90614665565b80156120c85780601f1061209d576101008083540402835291602001916120c8565b820191906000526020600020905b8154815290600101906020018083116120ab57829003601f168201915b505050505081526020019060010190612030565b50505050612e7d90919063ffffffff16565b82602001819052505050565b600060146001846000015161210f919061481c565b6006811061211f5761211f6146fc565b602081049091015460ff601f9092166101000a9004169050600081900361214557505050565b8061214f83612eaa565b6121599190614d92565b6121649060016146e9565b83604001818152505061223f826023805480602002602001604051908101604052809291908181526020016000905b828210156120dc5783829060005260206000200180546121b290614665565b80601f01602080910402602001604051908101604052809291908181526020018280546121de90614665565b801561222b5780601f106122005761010080835404028352916020019161222b565b820191906000526020600020905b81548152906001019060200180831161220e57829003601f168201915b505050505081526020019060010190612193565b8360600181905250505050565b6000601560018460000151612261919061481c565b60068110612271576122716146fc565b602081049091015460ff601f9092166101000a9004169050600081900361229757505050565b603c60646122a484612eaa565b6122ae9190614d92565b106122b857505050565b806122c283612eaa565b6122cc9190614d92565b6122d79060016146e9565b6080909301929092525050565b60006016600184600001516122f9919061481c565b60068110612309576123096146fc565b602081049091015460ff601f9092166101000a9004169050600081900361232f57505050565b8061233983612eaa565b6123439190614d92565b61234e9060016146e9565b60a0909301929092525050565b6000601760018460000151612370919061481c565b60068110612380576123806146fc565b602081049091015460ff601f9092166101000a900416905060008190036123a657505050565b806123b083612eaa565b6123ba9190614d92565b6123c59060016146e9565b60c0909301929092525050565b60006018600184600001516123e7919061481c565b600681106123f7576123f76146fc565b602081049091015460ff601f9092166101000a9004169050600081900361241d57505050565b6025606461242a84612eaa565b6124349190614d92565b1061243e57505050565b8061244883612eaa565b6124529190614d92565b61245d9060016146e9565b60e0909301929092525050565b600060196001846000015161247f919061481c565b6006811061248f5761248f6146fc565b602081049091015460ff601f9092166101000a900416905060008190036124b557505050565b602560646124c284612eaa565b6124cc9190614d92565b106124d657505050565b806124e083612eaa565b6124ea9190614d92565b6124f59060016146e9565b610100909301929092525050565b6000601a60018460000151612518919061481c565b60068110612528576125286146fc565b602081049091015460ff601f9092166101000a9004169050600081900361254e57505050565b6003606461255b84612eaa565b6125659190614d92565b1061256f57505050565b8061257983612eaa565b6125839190614d92565b61258e9060016146e9565b610120909301929092525050565b80516060906125db5760405162461bcd60e51b815260206004820152600b60248201526a6c766c206973207a65726f60a81b604482015260640161094f565b60006125e76020611e9a565b6125f16020611e9a565b604051602001612602929190614da6565b60405160208183030381529060405290508061261d84612f0e565b61262685612f43565b61262f86612fbf565b6126388761302d565b6126418861308a565b61264a896130e5565b6126538a613140565b61265c8b61319b565b60405160200161267499989796959493929190614e41565b604051602081830303815290604052915050919050565b60005b82811015611e93576126c4858585848181106126ac576126ac6146fc565b90506020028101906126be9190614d59565b846131f8565b60010161268e565b828260006126d983613356565b905060006126e683613356565b90506001600160a01b03871630146129ae5760006127066009600a6147f6565b6127109087614d45565b905060008111801561273057506005546001600160a01b03898116911614155b801561274a57506005546001600160a01b03888116911614155b1561291c576001600160a01b0388166000908152600c60205260409020548114801561279a57506001600160a01b0387166000908152600b6020908152604080832084845290915290205460ff16155b15612860576001600160a01b0388166000908152600c602090815260409182902082516060810184528154815260018201549281019290925260020154918101919091526127e88983613430565b6127f28882613813565b876001600160a01b0316896001600160a01b03167f6ff3d06dc3f0549ae8f3284ae87ffdc9b4547229c3062c11c22b80b1fc40865e83604051612851919081518152602080830151908201526040918201519181019190915260600190565b60405180910390a350506129ae565b6001600160a01b0388166000908152600b6020908152604080832084845290915290205460ff1680156128b757506001600160a01b0387166000908152600b6020908152604080832084845290915290205460ff16155b1561291c576001600160a01b0388166000908152600960209081526040808320600a8352818420858552835281842054845282529182902082516060810184528154815260018201549281019290925260020154918101919091526127e8898361390d565b600061292a6009600a6147f6565b6001600160a01b038a1660009081526020819052604090205461294d9190614d45565b9050600061295d6009600a6147f6565b6001600160a01b038b16600090815260208190526040902054612981908a9061481c565b61298b9190614d45565b90506129a08a61299b838561481c565b613430565b6129aa8984613ade565b5050505b60006129b985613356565b905060006129c685613356565b9050831580156129d35750815b156129e1576129e186613c85565b8380156129ec575081155b156129fa576129fa86613cd5565b82158015612a055750805b15612a1357612a1385613c85565b828015612a1e575080155b15612a2c57612a2c85613cd5565b505050505050505050565b6001600160a01b038216612a975760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161094f565b6001600160a01b03821660009081526020819052604090205481811015612b0b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161094f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611cce565b6001600160a01b038316612bc55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161094f565b6001600160a01b03831660009081526020819052604090205481811015612c3d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161094f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b80612cad6117ac565b811115612cec5760405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b604482015260640161094f565b6007805460ff19166001179055600554612d10906001600160a01b03168484612b61565b50506007805460ff1916905550565b60008381612d2f6001863561481c565b8152602001908152602001600020600060018560200135612d50919061481c565b81526020810191909152604001600020805490915015612db957836000612d796001863561481c565b8152602001908152602001600020600060018560200135612d9a919061481c565b81526020019081526020016000206000612db491906142e9565b612e10565b81612dc66001853561481c565b60068110612dd657612dd66146fc565b6020918282040191900681819054906101000a900460ff16612df790614f13565b91906101000a81548160ff021916908360ff1602179055505b60005b612e206040850185614f32565b9050811015611e935781612e376040860186614f32565b83818110612e4757612e476146fc565b83546001810185556000948552602090942060a09091029290920192919091019050612e738282614f8e565b5050600101612e13565b606082612e8a8484613dc5565b81518110612e9a57612e9a6146fc565b6020026020010151905092915050565b60006001826060018051809190612ec090614d79565b90528351612ece91906146e9565b612ed8919061481c565b60408084015181516020810193909352908201526060015b60408051601f19818403018152919052805160209091012092915050565b60408051608081018252600080825260208083019190915291810182905260608181018390529183015161176d908290613ddc565b60608160400151600003612f6557505060408051602081019091526000815290565b6108188260600151601b600060018660000151612f82919061481c565b8152602001908152602001600020600060018660400151612fa3919061481c565b8152602001908152602001600020613e4a90919063ffffffff16565b60608160800151600003612fe157505060408051602081019091526000815290565b610818601c600060018560000151612ff9919061481c565b815260200190815260200160002060006001856080015161301a919061481c565b8152602001908152602001600020613eee565b606081610120015160000361305057505060408051602081019091526000815290565b6108186021600060018560000151613068919061481c565b81526020019081526020016000206000600185610120015161301a919061481c565b60608160c001516000036130ac57505060408051602081019091526000815290565b610818601e6000600185600001516130c4919061481c565b8152602001908152602001600020600060018560c0015161301a919061481c565b60608160a0015160000361310757505060408051602081019091526000815290565b610818601d60006001856000015161311f919061481c565b8152602001908152602001600020600060018560a0015161301a919061481c565b60608160e0015160000361316257505060408051602081019091526000815290565b610818601f60006001856000015161317a919061481c565b8152602001908152602001600020600060018560e0015161301a919061481c565b60608161010001516000036131be57505060408051602081019091526000815290565b61081860206000600185600001516131d6919061481c565b81526020019081526020016000206000600185610100015161301a919061481c565b600083816132086001863561481c565b8152602001908152602001600020600060018560200135613229919061481c565b81526020810191909152604001600020805490915015613292578360006132526001863561481c565b8152602001908152602001600020600060018560200135613273919061481c565b8152602001908152602001600020600061328d919061430a565b6132e9565b8161329f6001853561481c565b600681106132af576132af6146fc565b6020918282040191900681819054906101000a900460ff166132d090614f13565b91906101000a81548160ff021916908360ff1602179055505b60005b6132f96040850185615057565b9050811015611e9357816133106040860186615057565b83818110613320576133206146fc565b8354600181018555600094855260209094206080909102929092019291909101905061334c82826150a1565b50506001016132ec565b60006001600160a01b03821630148061337c57506005546001600160a01b038381169116145b8061338e57506001600160a01b038216155b1561339b57506000919050565b6040516313842ca160e31b81526001600160a01b03831660048201526000903090639c21650890602401602060405180830381865afa1580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340691906150da565b6001600160a01b0384166000908152600c602052604090205461342991906146e9565b1192915050565b8060000361343c575050565b6005546001600160a01b0390811690831603613456575050565b6001600160a01b0382166000818152600c60208181526040808420815160608101835281548082526001830154828601526002909201549281019290925294909352529082116135c7576001600160a01b0383166000908152600c6020526040812080548492906134c890849061481c565b925050819055506134f66012600081546134e190614d79565b91829055506001600160a01b03851690613faa565b6001600160a01b0384166000908152600c602052604090206002015580511580159061353857506001600160a01b0383166000908152600c6020526040902054155b15613559576011541561355957601160008154613554906150f3565b909155505b6001600160a01b0383166000818152600c60205260409081902090517f3680d86cad43530d49d879ddd9012f83a955bc07d08ec59bbc4a7bf723a87128916135ba918154815260018201546020820152600290910154604082015260600190565b60405180910390a2505050565b6001600160a01b0383166000908152600c60205260408120546135ea908461481c565b6001600160a01b0385166000908152600c60205260408120819055601280549293506136319290919061361c90614d79565b91829055506001600160a01b03861690613faa565b6001600160a01b0385166000908152600c6020908152604080832060020193909355600890529081205490805b828110801561366c57508382105b156136965761367a87613ff2565b61368490836146e9565b915061368f81614d79565b905061365e565b508281111561371c576136a9838261481c565b6001600160a01b0387166000908152600c6020526040812080549091906136d19084906146e9565b925050819055506136ff6012600081546136ea90614d79565b91829055506001600160a01b03881690613faa565b6001600160a01b0387166000908152600c60205260409020600201555b83511580159061374257506001600160a01b0386166000908152600c6020526040902054155b1561376357601154156137635760116000815461375e906150f3565b909155505b835115801561378957506001600160a01b0386166000908152600c602052604090205415155b156137a25760116000815461379d90614d79565b909155505b6001600160a01b0386166000818152600c60205260409081902090517f3680d86cad43530d49d879ddd9012f83a955bc07d08ec59bbc4a7bf723a8712891613803918154815260018201546020820152600290910154604082015260600190565b60405180910390a2505050505050565b6005546001600160a01b039081169083160361382d575050565b6001600160a01b0382166000908152600860205260408120805490919061385390614d79565b90915550600f805460009061386790614d79565b909155506001600160a01b0382166000908152600860205260408120546138909060019061481c565b6001600160a01b0390931660008181526009602090815260408083208784528252808320865181558287015160018083019190915582880151600290920191909155848452600a835281842087518552835281842097909755928252600b81528282209451825293909352909120805460ff191690921790915550565b6005546001600160a01b0390811690831603613927575050565b6001600160a01b03821660009081526008602052604090205415613970576001600160a01b0382166000908152600860205260408120805490919061396b906150f3565b909155505b600f541561398c57600f60008154613987906150f3565b909155505b6001600160a01b0382166000818152600b602090815260408083208584528252808320805460ff191690558383526008825280832054600a8352818420868552835281842054948452600983528184208585528352928190208151606081018352815481526001820154938101939093526002015490820152909190818314613a8d576001600160a01b03851660008181526009602090815260408083208784528083528184208251606081018452815481526001808301548287019081526002938401548387019081528b89529487528588208351815590519181019190915592519290910191909155938352600a825280832093518352929052208290555b6001600160a01b039094166000818152600a60209081526040808320975183529681528682208290559181526009825285812093815292905250918220828155600181018390556002019190915550565b80600003613aea575050565b6005546001600160a01b0390811690831603613b04575050565b6001600160a01b0382166000818152600c602081815260408084208151606081018352815480825260018301548286015260029092015492810192909252948452919052919003613b8857613b6b601260008154613b6190614d79565b9182905550614049565b6001600160a01b0384166000908152600c60205260409020600101555b6001600160a01b0383166000908152600c602052604081208054849290613bb09084906146e9565b92505081905550613bc96012600081546134e190614d79565b6001600160a01b0384166000908152600c60205260409020600201558051158015613c0b57506001600160a01b0383166000908152600c602052604090205415155b15613c2457601160008154613c1f90614d79565b909155505b6001600160a01b0383166000818152600c60205260409081902090517fc0ed2f507ba32ecf45fa2603886bf221661ac1ac706468fb1bb203b073348d06916135ba918154815260018201546020820152600290910154604082015260600190565b601080546000908152600d6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558454908452600e9092528220819055613cce90614d79565b9091555050565b601054600003613ce25750565b6001600160a01b0381166000908152600e6020526040902054601054613d0a9060019061481c565b8114613d6f576000600d60006001601054613d25919061481c565b81526020808201929092526040908101600090812054858252600d845282822080546001600160a01b0319166001600160a01b0390921691821790558152600e9092529020829055505b60105415613d8b57601060008154613d86906150f3565b909155505b506001600160a01b03166000908152600e602090815260408083208390556010548352600d909152902080546001600160a01b0319169055565b60008251613dd283614085565b61176d9190614d92565b6060613dee836000015160ff16611e9a565b613dfe846020015160ff16611e9a565b613e0e856040015160ff16611e9a565b613e1e866060015160ff16611e9a565b85604051602001613e3395949392919061510a565b604051602081830303815290604052905092915050565b60608060005b8454811015610a265781613ec385878481548110613e7057613e706146fc565b600091825260209182902060408051608081018252929091015460ff8082168452610100820481169484019490945262010000810484169183019190915263010000009004909116606082015290613ddc565b604051602001613ed49291906151f6565b60408051601f198184030181529190529150600101613e50565b60608060005b8354811015613fa35781613f78858381548110613f1357613f136146fc565b60009182526020918290206040805160a081018252919092015460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204909216606083015262ffffff6401000000009091041660808201526140c8565b604051602001613f899291906151f6565b60408051601f198184030181529190529150600101613ef4565b5092915050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160408051601f1981840301815291905280516020909101209392505050565b6001600160a01b03811660009081526008602052604081205480820361401b5750600092915050565b6001600160a01b038316600090815260096020908152604080832083805290915290205461176d848261390d565b604080514260208201526bffffffffffffffffffffffff193360601b169181019190915260548101829052436074820152600090609401612ef0565b6000600182608001805180919061409b90614d79565b905260208401516140ac91906146e9565b6140b6919061481c565b604051602001612ef091815260200190565b60606140da826000015160ff16611e9a565b6140ea836020015160ff16611e9a565b6140fa846040015160ff16611e9a565b61410a856060015160ff16611e9a565b61411c866080015162ffffff16614146565b60405160200161413095949392919061510a565b6040516020818303038152906040529050919050565b606061415182614161565b6040516020016141309190615225565b6040805160068082528183019092526060916000919060208201818036833701905050905060005b6003811015613fa35761419e84600f16614241565b826141aa836002614805565b6141b590600561481c565b815181106141c5576141c56146fc565b60200101906001600160f81b031916908160001a9053506141ec600f600486901c16614241565b826141f8836002614805565b61420390600461481c565b81518110614213576142136146fc565b60200101906001600160f81b031916908160001a90535060088462ffffff16901c9350806001019050614189565b6000600a8260ff1610156142715761425d600a60ff8416614d92565b6142689060306146e9565b60f81b92915050565b600661427e600a8461524e565b6142889190615267565b6142689060ff1660416146e9565b604051806101400160405280600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906143079190614328565b50565b5080546000825590600052602060002090810190614307919061434b565b5b8082111561434757805466ffffffffffffff19168155600101614329565b5090565b5b8082111561434757805463ffffffff1916815560010161434c565b60005b8381101561438257818101518382015260200161436a565b50506000910152565b600081518084526143a3816020860160208601614367565b601f01601f19169290920160200192915050565b60208152600061176d602083018461438b565b80356001600160a01b03811681146118a057600080fd5b600080604083850312156143f457600080fd5b6143fd836143ca565b946020939093013593505050565b60006020828403121561441d57600080fd5b61176d826143ca565b60008060006060848603121561443b57600080fd5b614444846143ca565b9250614452602085016143ca565b9150604084013590509250925092565b6000806040838503121561447557600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156144c55783516001600160a01b0316835292840192918401916001016144a0565b50909695505050505050565b60008083601f8401126144e357600080fd5b50813567ffffffffffffffff8111156144fb57600080fd5b6020830191508360208260051b850101111561451657600080fd5b9250929050565b6000806020838503121561453057600080fd5b823567ffffffffffffffff81111561454757600080fd5b614553858286016144d1565b90969095509350505050565b60006060828403121561457157600080fd5b50919050565b6020815281516020820152600060208301516101408060408501526145a061016085018361438b565b9150604085015160608501526060850151601f198584030160808601526145c7838261438b565b925050608085015160a085015260a085015160c085015260c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151838701525050508091505092915050565b60006020828403121561462b57600080fd5b5035919050565b6000806040838503121561464557600080fd5b61464e836143ca565b915061465c602084016143ca565b90509250929050565b600181811c9082168061467957607f821691505b60208210810361457157634e487b7160e01b600052602260045260246000fd5b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610818576108186146d3565b634e487b7160e01b600052603260045260246000fd5b600181815b8085111561474d578160001904821115614733576147336146d3565b8085161561474057918102915b93841c9390800290614717565b509250929050565b60008261476457506001610818565b8161477157506000610818565b81600181146147875760028114614791576147ad565b6001915050610818565b60ff8411156147a2576147a26146d3565b50506001821b610818565b5060208310610133831016604e8410600b84101617156147d0575081810a610818565b6147da8383614712565b80600019048211156147ee576147ee6146d3565b029392505050565b600061176d60ff841683614755565b8082028115828204841417610818576108186146d3565b81810381811115610818576108186146d3565b604051610140810167ffffffffffffffff81118282101715614853576148536146bd565b60405290565b600082601f83011261486a57600080fd5b815167ffffffffffffffff80821115614885576148856146bd565b604051601f8301601f19908116603f011681019082821181831017156148ad576148ad6146bd565b816040528381528660208588010111156148c657600080fd5b6148d7846020830160208901614367565b9695505050505050565b6000602082840312156148f357600080fd5b815167ffffffffffffffff8082111561490b57600080fd5b90830190610140828603121561492057600080fd5b61492861482f565b8251815260208301518281111561493e57600080fd5b61494a87828601614859565b6020830152506040830151604082015260608301518281111561496c57600080fd5b61497887828601614859565b6060830152506080838101519082015260a0808401519082015260c0808401519082015260e0808401519082015261010080840151908201526101209283015192810192909252509392505050565b67113632bb32b6111d60c11b815281516000906149eb816008850160208701614367565b9190910160080192915050565b6e16113130b1b5b3b937bab732111d1160891b81528151600090614a2381600f850160208701614367565b601160f91b600f939091019283015250601001919050565b6d16113137b23ca1b7b637b9111d1160911b81528151600090614a6581600e850160208701614367565b601160f91b600e939091019283015250600f01919050565b6a161131b637ba3432b9911d60a91b81528151600090614aa481600b850160208701614367565b91909101600b0192915050565b67161132bcb2b9911d60c11b815281516000906149eb816008850160208701614367565b68161136b7baba34111d60b91b81528151600090614afa816009850160208701614367565b9190910160090192915050565b6c161130b1b1b2b9b9b7b93c911d60991b81528151600090614b3081600d850160208701614367565b91909101600d0192915050565b6c16112432b0b21024ba32b6911d60991b81528151600090614b3081600d850160208701614367565b67161132b0b939911d60c11b815281516000906149eb816008850160208701614367565b6716113bb2b1111d1160c11b81528151600090614bae816008850160208701614367565b601160f91b6008939091019283015250600901919050565b6f16113232b9b1b934b83a34b7b7111d1160811b81528151600090614bf2816010850160208701614367565b601160f91b6010939091019283015250601101919050565b60008a51614c1c818460208f01614367565b8a51614c2e8183860160208f01614367565b8a519184010190614c43818360208e01614367565b8951614c558183850160208e01614367565b8951929091010190614c6b818360208c01614367565b8751614c7d8183850160208c01614367565b8751929091010190614c93818360208a01614367565b8551614ca58183850160208a01614367565b8551929091010190614cbb818360208801614367565b019b9a5050505050505050505050565b607b60f81b815260008451614ce7816001850160208901614367565b845190830190614cfe816001840160208901614367565b8451910190614d14816001840160208801614367565b607d60f81b6001929091019182015260020195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082614d5457614d54614d2f565b500490565b60008235605e19833603018112614d6f57600080fd5b9190910192915050565b600060018201614d8b57614d8b6146d3565b5060010190565b600082614da157614da1614d2f565b500690565b7f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3230815273030302f737667272076696577426f783d273020360641b60208201526000600160fd1b8060348401528451614e06816035860160208901614367565b808401905081603582015284519150614e26826036830160208801614367565b61139f60f11b91016036810191909152603801949350505050565b60008a51614e53818460208f01614367565b8a51614e658183860160208f01614367565b8a519184010190614e7a818360208e01614367565b8951614e8c8183850160208e01614367565b8951929091010190614ea2818360208c01614367565b8751614eb48183850160208c01614367565b8751929091010190614eca818360208a01614367565b8551614edc8183850160208a01614367565b8551929091010190614ef2818360208801614367565b651e17b9bb339f60d11b91019081526006019b9a5050505050505050505050565b600060ff821660ff8103614f2957614f296146d3565b60010192915050565b6000808335601e19843603018112614f4957600080fd5b83018035915067ffffffffffffffff821115614f6457600080fd5b602001915060a08102360382131561451657600080fd5b6000813560ff8116811461081857600080fd5b614fab614f9a83614f7b565b825460ff191660ff91909116178255565b614fd0614fba60208401614f7b565b825461ff00191660089190911b61ff0016178255565b614ff7614fdf60408401614f7b565b825462ff0000191660109190911b62ff000016178255565b61502061500660608401614f7b565b825463ff000000191660189190911b63ff00000016178255565b608082013562ffffff8116811461503657600080fd5b815466ffffff00000000191660209190911b66ffffff000000001617905550565b6000808335601e1984360301811261506e57600080fd5b83018035915067ffffffffffffffff82111561508957600080fd5b6020019150600781901b360382131561451657600080fd5b6150ad614f9a83614f7b565b6150bc614fba60208401614f7b565b6150cb614fdf60408401614f7b565b610a6661500660608401614f7b565b6000602082840312156150ec57600080fd5b5051919050565b600081615102576151026146d3565b506000190190565b683c7265637420783d2760b81b81526000865161512e816009850160208b01614367565b642720793d2760d81b600991840191820152865161515381600e840160208b01614367565b68272077696474683d2760b81b600e9290910191820152855161517d816017840160208a01614367565b6927206865696768743d2760b01b6017929091019182015284516151a8816021840160208901614367565b67272066696c6c3d2760c01b6021929091019182015283516151d1816029840160208801614367565b6151e96029828401016213979f60e91b815260030190565b9998505050505050505050565b60008351615208818460208801614367565b83519083019061521c818360208801614367565b01949350505050565b602360f81b815260008251615241816001850160208701614367565b9190910160010192915050565b60ff8281168282160390811115610818576108186146d3565b600060ff83168061527a5761527a614d2f565b8060ff8416069150509291505056fe4120636f6c6c656374696f6e206f662050455069732c20616e20696e736372697074696f6e73204552432d32306920636f6c6c656374696f6e2e203620646966666572656e74206c6576656c732066726f6d20656767206d61737320746f20612066756c6c792067726f776e20506570652e205768696368206f6e6520697320796f7572733f2450455049206973206120756e697175652c2066756c6c79206f6e2d636861696e206172742070726f6a656374206275696c74206f6e2074686520696e6e6f766174697665206e6577204552432d32306920666f726d6174207769746820696e736372697074696f6e206d657461646174612e204561636820706f7274696f6e206f6620746f6b656e7320726573656d626c65732061207365656420746861742067656e65726174657320756e697175652033327833322064796e616d696320696d61676573206f6620506570652073746f726564206f6e2d636861696e2c20646570656e64696e67206f6e207468652077616c6c6574277320746f6b656e2062616c616e63652ea2646970667358221220b5604c78fe108b9c05c5ab884663a15c0867a16223c4309ddc1091897942121464736f6c63430008190033

Deployed Bytecode

0x6080604052600436106102255760003560e01c806370db69d611610123578063a435130b116100ab578063cb8106f41161006f578063cb8106f4146106c7578063d6875752146106fd578063dd62ed3e1461071d578063eb518bf61461073d578063f2fde38b1461075257600080fd5b8063a435130b14610601578063a457c2d714610621578063a775188a14610641578063a9059cbb14610661578063c5b8f7721461068157600080fd5b806395d89b41116100f257806395d89b411461054057806395e4b21b14610555578063997d54f51461058b5780639c216508146105ab5780639eb63de6146105e157600080fd5b806370db69d6146104cd57806386169143146104e25780638ab4598e146105025780638da5cb5b1461052257600080fd5b8063333a0072116101b157806363f6e78c1161017557806363f6e78c14610415578063641f334a146104355780636b4ed21b146104625780636c835c4a1461047757806370a082311461049757600080fd5b8063333a00721461037e57806335ad0cea1461039357806336a6c7bc146103c057806339509351146103e0578063524773ce1461040057600080fd5b806318160ddd116101f857806318160ddd146102f95780632088131914610318578063214013ca1461032d57806323b872dd14610342578063313ce5671461036257600080fd5b806306fdde031461022a578063095ea7b3146102555780630fd9587e1461028557806316f0115b146102c7575b600080fd5b34801561023657600080fd5b5061023f610772565b60405161024c91906143b7565b60405180910390f35b34801561026157600080fd5b506102756102703660046143e1565b610804565b604051901515815260200161024c565b34801561029157600080fd5b506102a56102a03660046143e1565b61081e565b604080518251815260208084015190820152918101519082015260600161024c565b3480156102d357600080fd5b506005546001600160a01b03165b6040516001600160a01b03909116815260200161024c565b34801561030557600080fd5b506002545b60405190815260200161024c565b34801561032457600080fd5b5060115461030a565b61034061033b36600461440b565b610890565b005b34801561034e57600080fd5b5061027561035d366004614426565b610901565b34801561036e57600080fd5b506040516009815260200161024c565b34801561038a57600080fd5b50610340610925565b34801561039f57600080fd5b506103b36103ae366004614462565b610993565b60405161024c9190614484565b3480156103cc57600080fd5b506103406103db36600461451d565b610a2e565b3480156103ec57600080fd5b506102756103fb3660046143e1565b610a6a565b34801561040c57600080fd5b5061030a610a8c565b34801561042157600080fd5b5061023f61043036600461455f565b610abe565b34801561044157600080fd5b5061045561045036600461455f565b610dd7565b60405161024c9190614577565b34801561046e57600080fd5b5060105461030a565b34801561048357600080fd5b5061034061049236600461451d565b611774565b3480156104a357600080fd5b5061030a6104b236600461440b565b6001600160a01b031660009081526020819052604090205490565b3480156104d957600080fd5b5061030a6117ac565b3480156104ee57600080fd5b506103406104fd36600461451d565b6118a5565b34801561050e57600080fd5b5061034061051d36600461451d565b6118dd565b34801561052e57600080fd5b506013546001600160a01b03166102e1565b34801561054c57600080fd5b5061023f611915565b34801561056157600080fd5b5061030a61057036600461440b565b6001600160a01b03166000908152600e602052604090205490565b34801561059757600080fd5b506103406105a636600461451d565b611924565b3480156105b757600080fd5b5061030a6105c636600461440b565b6001600160a01b031660009081526008602052604090205490565b3480156105ed57600080fd5b506103406105fc36600461451d565b61195c565b34801561060d57600080fd5b5061023f61061c36600461455f565b611994565b34801561062d57600080fd5b5061027561063c3660046143e1565b611a18565b34801561064d57600080fd5b506102a561065c36600461440b565b611a93565b34801561066d57600080fd5b5061027561067c3660046143e1565b611af9565b34801561068d57600080fd5b5061027561069c3660046143e1565b6001600160a01b03919091166000908152600b60209081526040808320938352929052205460ff1690565b3480156106d357600080fd5b506102e16106e2366004614619565b6000908152600d60205260409020546001600160a01b031690565b34801561070957600080fd5b5061034061071836600461451d565b611b07565b34801561072957600080fd5b5061030a610738366004614632565b611b3f565b34801561074957600080fd5b50600f5461030a565b34801561075e57600080fd5b5061034061076d36600461440b565b611b6a565b60606003805461078190614665565b80601f01602080910402602001604051908101604052809291908181526020018280546107ad90614665565b80156107fa5780601f106107cf576101008083540402835291602001916107fa565b820191906000526020600020905b8154815290600101906020018083116107dd57829003601f168201915b5050505050905090565b600033610812818585611bb6565b60019150505b92915050565b61084260405180606001604052806000815260200160008152602001600081525090565b506001600160a01b0382166000908152600960209081526040808320848452825291829020825160608101845281548152600182015492810192909252600201549181019190915292915050565b336001600160a01b037f0000000000000000000000001609e546e316297b64186c6cf7d504abeeccadc316146108c557600080fd5b6005546001600160a01b0316156108db57600080fd5b600580546001600160a01b0319166001600160a01b039290921691909117905542600655565b60003361090f858285611cdb565b61091a858585611d55565b506001949350505050565b6013546001600160a01b031633146109585760405162461bcd60e51b815260040161094f90614699565b60405180910390fd5b601380546001600160a01b03191690556040517f6e4ee811a17215345b89e3506064ff2d62f4feedff3566e9d09219cda7e8cadb90600090a1565b606060008267ffffffffffffffff8111156109b0576109b06146bd565b6040519080825280602002602001820160405280156109d9578160200160208202803683370190505b50905060005b83811015610a26576109f46106e282876146e9565b828281518110610a0657610a066146fc565b6001600160a01b03909216602092830291909101909101526001016109df565b509392505050565b6013546001600160a01b03163314610a585760405162461bcd60e51b815260040161094f90614699565b610a66602083836019611e52565b5050565b600033610812818585610a7d8383611b3f565b610a8791906146e9565b611bb6565b6000610a9760025490565b610aa36009600a6147f6565b610aaf9061343a614805565b610ab9919061481c565b905090565b6040805163320f99a560e11b81528235600482015260208301356024820152908201356044820152606090600090309063641f334a90606401600060405180830381865afa158015610b14573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052610b3c91908101906148e1565b90506000610b4d8260000151611e9a565b604051602001610b5d91906149c7565b604051602081830303815290604052905060008260200151604051602001610b8591906149f8565b604051602081830303815290604052905060008360600151604051602001610bad9190614a3b565b60405160208183030381529060405290506000610bcd8560800151611e9a565b604051602001610bdd9190614a7d565b60405160208183030381529060405290506000610bfd8660a00151611e9a565b604051602001610c0d9190614ab1565b60405160208183030381529060405290506000610c2d8760c00151611e9a565b604051602001610c3d9190614ad5565b60405160208183030381529060405290506000610c5d8860e00151611e9a565b604051602001610c6d9190614b07565b60405160208183030381529060405290506000610c8e896101000151611e9a565b604051602001610c9e9190614b3d565b60405160208183030381529060405290506000610cbf8a6101200151611e9a565b604051602001610ccf9190614b66565b604051602081830303815290604052905060006040518060400160405280601881526020017f68747470733a2f2f706570652d6572633230692e7669702f0000000000000000815250604051602001610d289190614b8a565b60408051601f198184030181526101c0830190915261018e8083529092506000919061528a6020830139604051602001610d629190614bc6565b60405160208183030381529060405290508a8a8a8a8a8a8a8a8a604051602001610d9499989796959493929190614c0a565b60408051601f1981840301815290829052610db59184908490602001614ccb565b6040516020818303038152906040529c50505050505050505050505050919050565b610ddf614296565b6040805160a081018252833581526020808501359082015283820135918101919091526000606082018190526080820152610e18614296565b610e2182611fa3565b610e2c9060016146e9565b8152610e38818361200a565b610e4281836120fa565b610e4c818361224c565b610e5681836122e4565b610e60818361235b565b610e6a81836123d2565b610e74818361246a565b610e7e8183612503565b8051600103610eed578060c00151600903610eba5760078160e0015110158015610ead575060098160e0015111155b15610eba57600060e08201525b8060a00151600503610eed57600a8160e0015110158015610ee05750600d8160e0015111155b15610eed57600060e08201525b8051600203610f2057601981610100015110158015610f125750601c81610100015111155b15610f205760006101208201525b8051600303610fd3578060c00151600903610f59578060e0015160011480610f4c57508060e001516002145b15610f5957600060e08201525b8060a00151600503610fa9578060e0015160031480610f7c57508060e001516006145b80610f9c5750600f8160e0015110158015610f9c575060148160e0015111155b15610fa957600060e08201525b602c81610100015110158015610fc55750602f81610100015111155b15610fd35760006101208201525b80516004036110d5578060a0015160050361106c578060e0015160011480610fff57508060e001516005145b8061101f575060088160e001511015801561101f5750600d8160e0015111155b8061103f5750600e8160e001511015801561103f575060138160e0015111155b8061105f575060148160e001511015801561105f575060198160e0015111155b1561106c57600060e08201525b8060e001516005036110ab578060a001516005148061108f57508060e001516009145b8061109e57508060e00151600a145b156110ab57600060a08201525b6036816101000151101580156110c75750603981610100015111155b156110d55760006101208201525b805160050361126b578060c0015160090361111f578060e00151602c1480611112575060148160e0015110158015611112575060198160e0015111155b1561111f57600060e08201525b8060a001516005036111b25760088160e00151101580156111455750600d8160e0015111155b806111655750600e8160e0015110158015611165575060138160e0015111155b806111855750601a8160e00151101580156111855750601f8160e0015111155b806111a5575060208160e00151101580156111a5575060258160e0015111155b156111b257600060e08201525b806101000151603103611241578060e00151600214806111d657508060e001516005145b806111e557508060e001516006145b806111f457508060e00151602c145b80611214575060148160e0015110158015611214575060198160e0015111155b80611234575060268160e00151101580156112345750602b8160e0015111155b1561124157600060e08201525b60468161010001511015801561125d5750604981610100015111155b1561126b5760006101208201525b8051600603611613578060c001516006036112c757603f8160e001511015801561129a575060418160e0015111155b806112ba575060458160e00151101580156112ba575060478160e0015111155b156112c757600060e08201525b8060c001516009036113e6578060e00151600314806112ea57508060e001516030145b806112f957508060e001516037145b806113195750601e8160e0015110158015611319575060238160e0015111155b80611339575060248160e0015110158015611339575060298160e0015111155b80611359575060318160e0015110158015611359575060368160e0015111155b80611379575060398160e00151101580156113795750603b8160e0015111155b806113995750603f8160e0015110158015611399575060418160e0015111155b806113b9575060458160e00151101580156113b9575060478160e0015111155b806113d95750604b8160e00151101580156113d95750604d8160e0015111155b156113e657600060e08201525b8060c00151600a036114395760458160e001511015801561140c575060478160e0015111155b8061142c5750604b8160e001511015801561142c5750604d8160e0015111155b1561143957600060e08201525b8060a0015160050361153a578060e001516011148061146d575060058160e001511015801561146d5750600a8160e0015111155b8061148d5750600b8160e001511015801561148d575060108160e0015111155b806114ad575060128160e00151101580156114ad575060178160e0015111155b806114cd5750602a8160e00151101580156114cd5750602f8160e0015111155b806114ed575060488160e00151101580156114ed5750604a8160e0015111155b8061150d575060458160e001511015801561150d575060478160e0015111155b8061152d5750603f8160e001511015801561152d575060418160e0015111155b1561153a57600060e08201525b8061010001516032036115e9578060e001516002148061155e57508060e001516011145b8061156d57508060e001516030145b8061157c57508060e001516037145b8061159c575060188160e001511015801561159c5750601d8160e0015111155b806115bc5750601e8160e00151101580156115bc575060238160e0015111155b806115dc575060248160e00151101580156115dc575060298160e0015111155b156115e957600060e08201525b6048816101000151101580156116055750604881610100015111155b156116135760006101208201525b8060a00151600c0361176d57805160020361164f57600a8160e00151101580156116425750600d8160e0015111155b1561164f57600060e08201525b805160030361168e5760068160e001511015806116815750600f8160e0015110158015611681575060148160e0015111155b1561168e57600060e08201525b80516004036116cd5760058160e001511015806116c0575060088160e00151101580156116c0575060138160e0015111155b156116cd57600060e08201525b805160050361171d57601a8160e00151101580156116f05750601f8160e0015111155b806117105750600e8160e0015110158015611710575060138160e0015111155b1561171d57600060e08201525b805160060361176d57600b8160e0015110158015611740575060178160e0015111155b806117605750602a8160e00151101580156117605750602f8160e0015111155b1561176d57600060e08201525b9392505050565b6013546001600160a01b0316331461179e5760405162461bcd60e51b815260040161094f90614699565b610a66601f83836018611e52565b60006117c26005546001600160a01b0316151590565b6117de576117d26009600a6147f6565b610ab99061343a614805565b6000620186a06005600654426117f4919061481c565b6118006009600a6147f6565b61180c9061343a614805565b6118169190614805565b6118209190614805565b61182a9190614d45565b6127106118396009600a6147f6565b6118459061343a614805565b611850906005614805565b61185a9190614d45565b61186491906146e9565b90506118726009600a6147f6565b61187e9061343a614805565b8111156118a0576118916009600a6147f6565b61189d9061343a614805565b90505b919050565b6013546001600160a01b031633146118cf5760405162461bcd60e51b815260040161094f90614699565b610a6660218383601a611e52565b6013546001600160a01b031633146119075760405162461bcd60e51b815260040161094f90614699565b610a66601e83836017611e52565b60606004805461078190614665565b6013546001600160a01b0316331461194e5760405162461bcd60e51b815260040161094f90614699565b610a66601c83836015611e52565b6013546001600160a01b031633146119865760405162461bcd60e51b815260040161094f90614699565b610a66601d83836016611e52565b6040805163320f99a560e11b8152823560048201526020830135602482015290820135604482015260609061081890309063641f334a90606401600060405180830381865afa1580156119eb573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f19168201604052611a1391908101906148e1565b61259c565b60003381611a268286611b3f565b905083811015611a865760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161094f565b61091a8286868403611bb6565b611ab760405180606001604052806000815260200160008152602001600081525090565b506001600160a01b03166000908152600c6020908152604091829020825160608101845281548152600182015492810192909252600201549181019190915290565b600033610812818585611d55565b6013546001600160a01b03163314611b315760405162461bcd60e51b815260040161094f90614699565b610a66601b8383601461268b565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b6013546001600160a01b03163314611b945760405162461bcd60e51b815260040161094f90614699565b601380546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038316611c185760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161094f565b6001600160a01b038216611c795760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161094f565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6000611ce78484611b3f565b90506000198114611d4f5781811015611d425760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000604482015260640161094f565b611d4f8484848403611bb6565b50505050565b6005546001600160a01b031615611d7657611d718383836126cc565b611dd9565b6013546001600160a01b0384811691161480611d9f57506013546001600160a01b038381169116145b611dd95760405162461bcd60e51b815260206004820152600b60248201526a1b9bdd081cdd185c9d195960aa1b604482015260640161094f565b6001600160a01b038216611df657611df18382612a37565b505050565b306001600160a01b03841603611e1157611df1838383612b61565b60075460ff1615611e2757611df1838383612b61565b6005546001600160a01b0390811690841603611e4757611df18282612ca4565b611df1838383612b61565b60005b82811015611e9357611e8b85858584818110611e7357611e736146fc565b9050602002810190611e859190614d59565b84612d1f565b600101611e55565b5050505050565b606081600003611ec15750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611eeb5780611ed581614d79565b9150611ee49050600a83614d45565b9150611ec5565b60008167ffffffffffffffff811115611f0657611f066146bd565b6040519080825280601f01601f191660200182016040528015611f30576020820181803683370190505b5090505b8415611f9b57611f4560018361481c565b9150611f52600a86614d92565b611f5d9060306146e9565b60f81b818381518110611f7257611f726146fc565b60200101906001600160f81b031916908160001a905350611f94600a86614d45565b9450611f34565b949350505050565b6000600b82600001511015611fba57506000919050565b815160161115611fcc57506001919050565b815160211115611fde57506002919050565b8151602c1115611ff057506003919050565b81516038111561200257506004919050565b506005919050565b6120ee816022805480602002602001604051908101604052809291908181526020016000905b828210156120dc57838290600052602060002001805461204f90614665565b80601f016020809104026020016040519081016040528092919081815260200182805461207b90614665565b80156120c85780601f1061209d576101008083540402835291602001916120c8565b820191906000526020600020905b8154815290600101906020018083116120ab57829003601f168201915b505050505081526020019060010190612030565b50505050612e7d90919063ffffffff16565b82602001819052505050565b600060146001846000015161210f919061481c565b6006811061211f5761211f6146fc565b602081049091015460ff601f9092166101000a9004169050600081900361214557505050565b8061214f83612eaa565b6121599190614d92565b6121649060016146e9565b83604001818152505061223f826023805480602002602001604051908101604052809291908181526020016000905b828210156120dc5783829060005260206000200180546121b290614665565b80601f01602080910402602001604051908101604052809291908181526020018280546121de90614665565b801561222b5780601f106122005761010080835404028352916020019161222b565b820191906000526020600020905b81548152906001019060200180831161220e57829003601f168201915b505050505081526020019060010190612193565b8360600181905250505050565b6000601560018460000151612261919061481c565b60068110612271576122716146fc565b602081049091015460ff601f9092166101000a9004169050600081900361229757505050565b603c60646122a484612eaa565b6122ae9190614d92565b106122b857505050565b806122c283612eaa565b6122cc9190614d92565b6122d79060016146e9565b6080909301929092525050565b60006016600184600001516122f9919061481c565b60068110612309576123096146fc565b602081049091015460ff601f9092166101000a9004169050600081900361232f57505050565b8061233983612eaa565b6123439190614d92565b61234e9060016146e9565b60a0909301929092525050565b6000601760018460000151612370919061481c565b60068110612380576123806146fc565b602081049091015460ff601f9092166101000a900416905060008190036123a657505050565b806123b083612eaa565b6123ba9190614d92565b6123c59060016146e9565b60c0909301929092525050565b60006018600184600001516123e7919061481c565b600681106123f7576123f76146fc565b602081049091015460ff601f9092166101000a9004169050600081900361241d57505050565b6025606461242a84612eaa565b6124349190614d92565b1061243e57505050565b8061244883612eaa565b6124529190614d92565b61245d9060016146e9565b60e0909301929092525050565b600060196001846000015161247f919061481c565b6006811061248f5761248f6146fc565b602081049091015460ff601f9092166101000a900416905060008190036124b557505050565b602560646124c284612eaa565b6124cc9190614d92565b106124d657505050565b806124e083612eaa565b6124ea9190614d92565b6124f59060016146e9565b610100909301929092525050565b6000601a60018460000151612518919061481c565b60068110612528576125286146fc565b602081049091015460ff601f9092166101000a9004169050600081900361254e57505050565b6003606461255b84612eaa565b6125659190614d92565b1061256f57505050565b8061257983612eaa565b6125839190614d92565b61258e9060016146e9565b610120909301929092525050565b80516060906125db5760405162461bcd60e51b815260206004820152600b60248201526a6c766c206973207a65726f60a81b604482015260640161094f565b60006125e76020611e9a565b6125f16020611e9a565b604051602001612602929190614da6565b60405160208183030381529060405290508061261d84612f0e565b61262685612f43565b61262f86612fbf565b6126388761302d565b6126418861308a565b61264a896130e5565b6126538a613140565b61265c8b61319b565b60405160200161267499989796959493929190614e41565b604051602081830303815290604052915050919050565b60005b82811015611e93576126c4858585848181106126ac576126ac6146fc565b90506020028101906126be9190614d59565b846131f8565b60010161268e565b828260006126d983613356565b905060006126e683613356565b90506001600160a01b03871630146129ae5760006127066009600a6147f6565b6127109087614d45565b905060008111801561273057506005546001600160a01b03898116911614155b801561274a57506005546001600160a01b03888116911614155b1561291c576001600160a01b0388166000908152600c60205260409020548114801561279a57506001600160a01b0387166000908152600b6020908152604080832084845290915290205460ff16155b15612860576001600160a01b0388166000908152600c602090815260409182902082516060810184528154815260018201549281019290925260020154918101919091526127e88983613430565b6127f28882613813565b876001600160a01b0316896001600160a01b03167f6ff3d06dc3f0549ae8f3284ae87ffdc9b4547229c3062c11c22b80b1fc40865e83604051612851919081518152602080830151908201526040918201519181019190915260600190565b60405180910390a350506129ae565b6001600160a01b0388166000908152600b6020908152604080832084845290915290205460ff1680156128b757506001600160a01b0387166000908152600b6020908152604080832084845290915290205460ff16155b1561291c576001600160a01b0388166000908152600960209081526040808320600a8352818420858552835281842054845282529182902082516060810184528154815260018201549281019290925260020154918101919091526127e8898361390d565b600061292a6009600a6147f6565b6001600160a01b038a1660009081526020819052604090205461294d9190614d45565b9050600061295d6009600a6147f6565b6001600160a01b038b16600090815260208190526040902054612981908a9061481c565b61298b9190614d45565b90506129a08a61299b838561481c565b613430565b6129aa8984613ade565b5050505b60006129b985613356565b905060006129c685613356565b9050831580156129d35750815b156129e1576129e186613c85565b8380156129ec575081155b156129fa576129fa86613cd5565b82158015612a055750805b15612a1357612a1385613c85565b828015612a1e575080155b15612a2c57612a2c85613cd5565b505050505050505050565b6001600160a01b038216612a975760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161094f565b6001600160a01b03821660009081526020819052604090205481811015612b0b5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161094f565b6001600160a01b0383166000818152602081815260408083208686039055600280548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101611cce565b6001600160a01b038316612bc55760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161094f565b6001600160a01b03831660009081526020819052604090205481811015612c3d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161094f565b6001600160a01b03848116600081815260208181526040808320878703905593871680835291849020805487019055925185815290927fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a350505050565b80612cad6117ac565b811115612cec5760405162461bcd60e51b815260206004820152600d60248201526c1b585e08189d5e481b1a5b5a5d609a1b604482015260640161094f565b6007805460ff19166001179055600554612d10906001600160a01b03168484612b61565b50506007805460ff1916905550565b60008381612d2f6001863561481c565b8152602001908152602001600020600060018560200135612d50919061481c565b81526020810191909152604001600020805490915015612db957836000612d796001863561481c565b8152602001908152602001600020600060018560200135612d9a919061481c565b81526020019081526020016000206000612db491906142e9565b612e10565b81612dc66001853561481c565b60068110612dd657612dd66146fc565b6020918282040191900681819054906101000a900460ff16612df790614f13565b91906101000a81548160ff021916908360ff1602179055505b60005b612e206040850185614f32565b9050811015611e935781612e376040860186614f32565b83818110612e4757612e476146fc565b83546001810185556000948552602090942060a09091029290920192919091019050612e738282614f8e565b5050600101612e13565b606082612e8a8484613dc5565b81518110612e9a57612e9a6146fc565b6020026020010151905092915050565b60006001826060018051809190612ec090614d79565b90528351612ece91906146e9565b612ed8919061481c565b60408084015181516020810193909352908201526060015b60408051601f19818403018152919052805160209091012092915050565b60408051608081018252600080825260208083019190915291810182905260608181018390529183015161176d908290613ddc565b60608160400151600003612f6557505060408051602081019091526000815290565b6108188260600151601b600060018660000151612f82919061481c565b8152602001908152602001600020600060018660400151612fa3919061481c565b8152602001908152602001600020613e4a90919063ffffffff16565b60608160800151600003612fe157505060408051602081019091526000815290565b610818601c600060018560000151612ff9919061481c565b815260200190815260200160002060006001856080015161301a919061481c565b8152602001908152602001600020613eee565b606081610120015160000361305057505060408051602081019091526000815290565b6108186021600060018560000151613068919061481c565b81526020019081526020016000206000600185610120015161301a919061481c565b60608160c001516000036130ac57505060408051602081019091526000815290565b610818601e6000600185600001516130c4919061481c565b8152602001908152602001600020600060018560c0015161301a919061481c565b60608160a0015160000361310757505060408051602081019091526000815290565b610818601d60006001856000015161311f919061481c565b8152602001908152602001600020600060018560a0015161301a919061481c565b60608160e0015160000361316257505060408051602081019091526000815290565b610818601f60006001856000015161317a919061481c565b8152602001908152602001600020600060018560e0015161301a919061481c565b60608161010001516000036131be57505060408051602081019091526000815290565b61081860206000600185600001516131d6919061481c565b81526020019081526020016000206000600185610100015161301a919061481c565b600083816132086001863561481c565b8152602001908152602001600020600060018560200135613229919061481c565b81526020810191909152604001600020805490915015613292578360006132526001863561481c565b8152602001908152602001600020600060018560200135613273919061481c565b8152602001908152602001600020600061328d919061430a565b6132e9565b8161329f6001853561481c565b600681106132af576132af6146fc565b6020918282040191900681819054906101000a900460ff166132d090614f13565b91906101000a81548160ff021916908360ff1602179055505b60005b6132f96040850185615057565b9050811015611e9357816133106040860186615057565b83818110613320576133206146fc565b8354600181018555600094855260209094206080909102929092019291909101905061334c82826150a1565b50506001016132ec565b60006001600160a01b03821630148061337c57506005546001600160a01b038381169116145b8061338e57506001600160a01b038216155b1561339b57506000919050565b6040516313842ca160e31b81526001600160a01b03831660048201526000903090639c21650890602401602060405180830381865afa1580156133e2573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061340691906150da565b6001600160a01b0384166000908152600c602052604090205461342991906146e9565b1192915050565b8060000361343c575050565b6005546001600160a01b0390811690831603613456575050565b6001600160a01b0382166000818152600c60208181526040808420815160608101835281548082526001830154828601526002909201549281019290925294909352529082116135c7576001600160a01b0383166000908152600c6020526040812080548492906134c890849061481c565b925050819055506134f66012600081546134e190614d79565b91829055506001600160a01b03851690613faa565b6001600160a01b0384166000908152600c602052604090206002015580511580159061353857506001600160a01b0383166000908152600c6020526040902054155b15613559576011541561355957601160008154613554906150f3565b909155505b6001600160a01b0383166000818152600c60205260409081902090517f3680d86cad43530d49d879ddd9012f83a955bc07d08ec59bbc4a7bf723a87128916135ba918154815260018201546020820152600290910154604082015260600190565b60405180910390a2505050565b6001600160a01b0383166000908152600c60205260408120546135ea908461481c565b6001600160a01b0385166000908152600c60205260408120819055601280549293506136319290919061361c90614d79565b91829055506001600160a01b03861690613faa565b6001600160a01b0385166000908152600c6020908152604080832060020193909355600890529081205490805b828110801561366c57508382105b156136965761367a87613ff2565b61368490836146e9565b915061368f81614d79565b905061365e565b508281111561371c576136a9838261481c565b6001600160a01b0387166000908152600c6020526040812080549091906136d19084906146e9565b925050819055506136ff6012600081546136ea90614d79565b91829055506001600160a01b03881690613faa565b6001600160a01b0387166000908152600c60205260409020600201555b83511580159061374257506001600160a01b0386166000908152600c6020526040902054155b1561376357601154156137635760116000815461375e906150f3565b909155505b835115801561378957506001600160a01b0386166000908152600c602052604090205415155b156137a25760116000815461379d90614d79565b909155505b6001600160a01b0386166000818152600c60205260409081902090517f3680d86cad43530d49d879ddd9012f83a955bc07d08ec59bbc4a7bf723a8712891613803918154815260018201546020820152600290910154604082015260600190565b60405180910390a2505050505050565b6005546001600160a01b039081169083160361382d575050565b6001600160a01b0382166000908152600860205260408120805490919061385390614d79565b90915550600f805460009061386790614d79565b909155506001600160a01b0382166000908152600860205260408120546138909060019061481c565b6001600160a01b0390931660008181526009602090815260408083208784528252808320865181558287015160018083019190915582880151600290920191909155848452600a835281842087518552835281842097909755928252600b81528282209451825293909352909120805460ff191690921790915550565b6005546001600160a01b0390811690831603613927575050565b6001600160a01b03821660009081526008602052604090205415613970576001600160a01b0382166000908152600860205260408120805490919061396b906150f3565b909155505b600f541561398c57600f60008154613987906150f3565b909155505b6001600160a01b0382166000818152600b602090815260408083208584528252808320805460ff191690558383526008825280832054600a8352818420868552835281842054948452600983528184208585528352928190208151606081018352815481526001820154938101939093526002015490820152909190818314613a8d576001600160a01b03851660008181526009602090815260408083208784528083528184208251606081018452815481526001808301548287019081526002938401548387019081528b89529487528588208351815590519181019190915592519290910191909155938352600a825280832093518352929052208290555b6001600160a01b039094166000818152600a60209081526040808320975183529681528682208290559181526009825285812093815292905250918220828155600181018390556002019190915550565b80600003613aea575050565b6005546001600160a01b0390811690831603613b04575050565b6001600160a01b0382166000818152600c602081815260408084208151606081018352815480825260018301548286015260029092015492810192909252948452919052919003613b8857613b6b601260008154613b6190614d79565b9182905550614049565b6001600160a01b0384166000908152600c60205260409020600101555b6001600160a01b0383166000908152600c602052604081208054849290613bb09084906146e9565b92505081905550613bc96012600081546134e190614d79565b6001600160a01b0384166000908152600c60205260409020600201558051158015613c0b57506001600160a01b0383166000908152600c602052604090205415155b15613c2457601160008154613c1f90614d79565b909155505b6001600160a01b0383166000818152600c60205260409081902090517fc0ed2f507ba32ecf45fa2603886bf221661ac1ac706468fb1bb203b073348d06916135ba918154815260018201546020820152600290910154604082015260600190565b601080546000908152600d6020908152604080832080546001600160a01b0319166001600160a01b0387169081179091558454908452600e9092528220819055613cce90614d79565b9091555050565b601054600003613ce25750565b6001600160a01b0381166000908152600e6020526040902054601054613d0a9060019061481c565b8114613d6f576000600d60006001601054613d25919061481c565b81526020808201929092526040908101600090812054858252600d845282822080546001600160a01b0319166001600160a01b0390921691821790558152600e9092529020829055505b60105415613d8b57601060008154613d86906150f3565b909155505b506001600160a01b03166000908152600e602090815260408083208390556010548352600d909152902080546001600160a01b0319169055565b60008251613dd283614085565b61176d9190614d92565b6060613dee836000015160ff16611e9a565b613dfe846020015160ff16611e9a565b613e0e856040015160ff16611e9a565b613e1e866060015160ff16611e9a565b85604051602001613e3395949392919061510a565b604051602081830303815290604052905092915050565b60608060005b8454811015610a265781613ec385878481548110613e7057613e706146fc565b600091825260209182902060408051608081018252929091015460ff8082168452610100820481169484019490945262010000810484169183019190915263010000009004909116606082015290613ddc565b604051602001613ed49291906151f6565b60408051601f198184030181529190529150600101613e50565b60608060005b8354811015613fa35781613f78858381548110613f1357613f136146fc565b60009182526020918290206040805160a081018252919092015460ff8082168352610100820481169483019490945262010000810484169282019290925263010000008204909216606083015262ffffff6401000000009091041660808201526140c8565b604051602001613f899291906151f6565b60408051601f198184030181529190529150600101613ef4565b5092915050565b6040516bffffffffffffffffffffffff19606084901b1660208201526034810182905260009060540160408051601f1981840301815291905280516020909101209392505050565b6001600160a01b03811660009081526008602052604081205480820361401b5750600092915050565b6001600160a01b038316600090815260096020908152604080832083805290915290205461176d848261390d565b604080514260208201526bffffffffffffffffffffffff193360601b169181019190915260548101829052436074820152600090609401612ef0565b6000600182608001805180919061409b90614d79565b905260208401516140ac91906146e9565b6140b6919061481c565b604051602001612ef091815260200190565b60606140da826000015160ff16611e9a565b6140ea836020015160ff16611e9a565b6140fa846040015160ff16611e9a565b61410a856060015160ff16611e9a565b61411c866080015162ffffff16614146565b60405160200161413095949392919061510a565b6040516020818303038152906040529050919050565b606061415182614161565b6040516020016141309190615225565b6040805160068082528183019092526060916000919060208201818036833701905050905060005b6003811015613fa35761419e84600f16614241565b826141aa836002614805565b6141b590600561481c565b815181106141c5576141c56146fc565b60200101906001600160f81b031916908160001a9053506141ec600f600486901c16614241565b826141f8836002614805565b61420390600461481c565b81518110614213576142136146fc565b60200101906001600160f81b031916908160001a90535060088462ffffff16901c9350806001019050614189565b6000600a8260ff1610156142715761425d600a60ff8416614d92565b6142689060306146e9565b60f81b92915050565b600661427e600a8461524e565b6142889190615267565b6142689060ff1660416146e9565b604051806101400160405280600081526020016060815260200160008152602001606081526020016000815260200160008152602001600081526020016000815260200160008152602001600081525090565b50805460008255906000526020600020908101906143079190614328565b50565b5080546000825590600052602060002090810190614307919061434b565b5b8082111561434757805466ffffffffffffff19168155600101614329565b5090565b5b8082111561434757805463ffffffff1916815560010161434c565b60005b8381101561438257818101518382015260200161436a565b50506000910152565b600081518084526143a3816020860160208601614367565b601f01601f19169290920160200192915050565b60208152600061176d602083018461438b565b80356001600160a01b03811681146118a057600080fd5b600080604083850312156143f457600080fd5b6143fd836143ca565b946020939093013593505050565b60006020828403121561441d57600080fd5b61176d826143ca565b60008060006060848603121561443b57600080fd5b614444846143ca565b9250614452602085016143ca565b9150604084013590509250925092565b6000806040838503121561447557600080fd5b50508035926020909101359150565b6020808252825182820181905260009190848201906040850190845b818110156144c55783516001600160a01b0316835292840192918401916001016144a0565b50909695505050505050565b60008083601f8401126144e357600080fd5b50813567ffffffffffffffff8111156144fb57600080fd5b6020830191508360208260051b850101111561451657600080fd5b9250929050565b6000806020838503121561453057600080fd5b823567ffffffffffffffff81111561454757600080fd5b614553858286016144d1565b90969095509350505050565b60006060828403121561457157600080fd5b50919050565b6020815281516020820152600060208301516101408060408501526145a061016085018361438b565b9150604085015160608501526060850151601f198584030160808601526145c7838261438b565b925050608085015160a085015260a085015160c085015260c085015160e085015260e0850151610100818187015280870151915050610120818187015280870151838701525050508091505092915050565b60006020828403121561462b57600080fd5b5035919050565b6000806040838503121561464557600080fd5b61464e836143ca565b915061465c602084016143ca565b90509250929050565b600181811c9082168061467957607f821691505b60208210810361457157634e487b7160e01b600052602260045260246000fd5b6020808252600a908201526937b7363c9037bbb732b960b11b604082015260600190565b634e487b7160e01b600052604160045260246000fd5b634e487b7160e01b600052601160045260246000fd5b80820180821115610818576108186146d3565b634e487b7160e01b600052603260045260246000fd5b600181815b8085111561474d578160001904821115614733576147336146d3565b8085161561474057918102915b93841c9390800290614717565b509250929050565b60008261476457506001610818565b8161477157506000610818565b81600181146147875760028114614791576147ad565b6001915050610818565b60ff8411156147a2576147a26146d3565b50506001821b610818565b5060208310610133831016604e8410600b84101617156147d0575081810a610818565b6147da8383614712565b80600019048211156147ee576147ee6146d3565b029392505050565b600061176d60ff841683614755565b8082028115828204841417610818576108186146d3565b81810381811115610818576108186146d3565b604051610140810167ffffffffffffffff81118282101715614853576148536146bd565b60405290565b600082601f83011261486a57600080fd5b815167ffffffffffffffff80821115614885576148856146bd565b604051601f8301601f19908116603f011681019082821181831017156148ad576148ad6146bd565b816040528381528660208588010111156148c657600080fd5b6148d7846020830160208901614367565b9695505050505050565b6000602082840312156148f357600080fd5b815167ffffffffffffffff8082111561490b57600080fd5b90830190610140828603121561492057600080fd5b61492861482f565b8251815260208301518281111561493e57600080fd5b61494a87828601614859565b6020830152506040830151604082015260608301518281111561496c57600080fd5b61497887828601614859565b6060830152506080838101519082015260a0808401519082015260c0808401519082015260e0808401519082015261010080840151908201526101209283015192810192909252509392505050565b67113632bb32b6111d60c11b815281516000906149eb816008850160208701614367565b9190910160080192915050565b6e16113130b1b5b3b937bab732111d1160891b81528151600090614a2381600f850160208701614367565b601160f91b600f939091019283015250601001919050565b6d16113137b23ca1b7b637b9111d1160911b81528151600090614a6581600e850160208701614367565b601160f91b600e939091019283015250600f01919050565b6a161131b637ba3432b9911d60a91b81528151600090614aa481600b850160208701614367565b91909101600b0192915050565b67161132bcb2b9911d60c11b815281516000906149eb816008850160208701614367565b68161136b7baba34111d60b91b81528151600090614afa816009850160208701614367565b9190910160090192915050565b6c161130b1b1b2b9b9b7b93c911d60991b81528151600090614b3081600d850160208701614367565b91909101600d0192915050565b6c16112432b0b21024ba32b6911d60991b81528151600090614b3081600d850160208701614367565b67161132b0b939911d60c11b815281516000906149eb816008850160208701614367565b6716113bb2b1111d1160c11b81528151600090614bae816008850160208701614367565b601160f91b6008939091019283015250600901919050565b6f16113232b9b1b934b83a34b7b7111d1160811b81528151600090614bf2816010850160208701614367565b601160f91b6010939091019283015250601101919050565b60008a51614c1c818460208f01614367565b8a51614c2e8183860160208f01614367565b8a519184010190614c43818360208e01614367565b8951614c558183850160208e01614367565b8951929091010190614c6b818360208c01614367565b8751614c7d8183850160208c01614367565b8751929091010190614c93818360208a01614367565b8551614ca58183850160208a01614367565b8551929091010190614cbb818360208801614367565b019b9a5050505050505050505050565b607b60f81b815260008451614ce7816001850160208901614367565b845190830190614cfe816001840160208901614367565b8451910190614d14816001840160208801614367565b607d60f81b6001929091019182015260020195945050505050565b634e487b7160e01b600052601260045260246000fd5b600082614d5457614d54614d2f565b500490565b60008235605e19833603018112614d6f57600080fd5b9190910192915050565b600060018201614d8b57614d8b6146d3565b5060010190565b600082614da157614da1614d2f565b500690565b7f3c73766720786d6c6e733d27687474703a2f2f7777772e77332e6f72672f3230815273030302f737667272076696577426f783d273020360641b60208201526000600160fd1b8060348401528451614e06816035860160208901614367565b808401905081603582015284519150614e26826036830160208801614367565b61139f60f11b91016036810191909152603801949350505050565b60008a51614e53818460208f01614367565b8a51614e658183860160208f01614367565b8a519184010190614e7a818360208e01614367565b8951614e8c8183850160208e01614367565b8951929091010190614ea2818360208c01614367565b8751614eb48183850160208c01614367565b8751929091010190614eca818360208a01614367565b8551614edc8183850160208a01614367565b8551929091010190614ef2818360208801614367565b651e17b9bb339f60d11b91019081526006019b9a5050505050505050505050565b600060ff821660ff8103614f2957614f296146d3565b60010192915050565b6000808335601e19843603018112614f4957600080fd5b83018035915067ffffffffffffffff821115614f6457600080fd5b602001915060a08102360382131561451657600080fd5b6000813560ff8116811461081857600080fd5b614fab614f9a83614f7b565b825460ff191660ff91909116178255565b614fd0614fba60208401614f7b565b825461ff00191660089190911b61ff0016178255565b614ff7614fdf60408401614f7b565b825462ff0000191660109190911b62ff000016178255565b61502061500660608401614f7b565b825463ff000000191660189190911b63ff00000016178255565b608082013562ffffff8116811461503657600080fd5b815466ffffff00000000191660209190911b66ffffff000000001617905550565b6000808335601e1984360301811261506e57600080fd5b83018035915067ffffffffffffffff82111561508957600080fd5b6020019150600781901b360382131561451657600080fd5b6150ad614f9a83614f7b565b6150bc614fba60208401614f7b565b6150cb614fdf60408401614f7b565b610a6661500660608401614f7b565b6000602082840312156150ec57600080fd5b5051919050565b600081615102576151026146d3565b506000190190565b683c7265637420783d2760b81b81526000865161512e816009850160208b01614367565b642720793d2760d81b600991840191820152865161515381600e840160208b01614367565b68272077696474683d2760b81b600e9290910191820152855161517d816017840160208a01614367565b6927206865696768743d2760b01b6017929091019182015284516151a8816021840160208901614367565b67272066696c6c3d2760c01b6021929091019182015283516151d1816029840160208801614367565b6151e96029828401016213979f60e91b815260030190565b9998505050505050505050565b60008351615208818460208801614367565b83519083019061521c818360208801614367565b01949350505050565b602360f81b815260008251615241816001850160208701614367565b9190910160010192915050565b60ff8281168282160390811115610818576108186146d3565b600060ff83168061527a5761527a614d2f565b8060ff8416069150509291505056fe4120636f6c6c656374696f6e206f662050455069732c20616e20696e736372697074696f6e73204552432d32306920636f6c6c656374696f6e2e203620646966666572656e74206c6576656c732066726f6d20656767206d61737320746f20612066756c6c792067726f776e20506570652e205768696368206f6e6520697320796f7572733f2450455049206973206120756e697175652c2066756c6c79206f6e2d636861696e206172742070726f6a656374206275696c74206f6e2074686520696e6e6f766174697665206e6577204552432d32306920666f726d6174207769746820696e736372697074696f6e206d657461646174612e204561636820706f7274696f6e206f6620746f6b656e7320726573656d626c65732061207365656420746861742067656e65726174657320756e697175652033327833322064796e616d696320696d61676573206f6620506570652073746f726564206f6e2d636861696e2c20646570656e64696e67206f6e207468652077616c6c6574277320746f6b656e2062616c616e63652ea2646970667358221220b5604c78fe108b9c05c5ab884663a15c0867a16223c4309ddc1091897942121464736f6c63430008190033

Loading