false
true
0

Contract Address Details

0x9d95DFBB1aBb8F57abc20FDE4F786BB1Db52ad71

Token
DrDoge (DRDOGE)
Creator
0xe36f65–037129 at 0x6a9363–3073fa
Balance
0 PLS ( )
Tokens
Fetching tokens...
Transactions
574 Transactions
Transfers
0 Transfers
Gas Used
0
Last Balance Update
26172673
Warning! Contract bytecode has been changed and doesn't match the verified one. Therefore, interaction with this smart contract may be risky.
Contract name:
DrDoge




Optimization enabled
true
Compiler version
v0.8.29+commit.ab55807c




Optimization runs
200
EVM Version
paris




Verified at
2025-07-15T16:03:07.107365Z

contracts/DrDoge.sol

// SPDX-License-Identifier: DrDoge - The first useful meme on PulseChain
// DrDoge is proud of you for not trusting a random JPG on the internet! Always check the code!
pragma solidity 0.8.29;

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

// ------------------------------ WHY NOT WRITE THIS HERE -------------------------------- 
/**
 *      DrDoge Code: The code itself is straightforward, there's only battle tested code.
 *      DrDoge Innovation: The innovation lies in the tokenomics, transparency, honesty, and the attempt to do something good.
 * @dev ERC20 token with block-based minting schedule, enriched events, and janitor-only minting.
 *      This contract supports multiple scheduled minting streams with catch-up logic,
 *      detailed events for off-chain indexing, and strict access control for minting.
 *      Scheduled minting is a timelocking replacement. Less code, less bugs, same risk.
 */
contract DrDoge is ERC20Burnable {
    // ------------------------------ EVENTS --------------------------------

    event MintLiquidityPoolStarting(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintJustJanitor(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintCureCoinAndFLDCClaim(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintLiquidityPoolStartingSacrificeReward(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintLiquidityPoolSacrificeSuccessLock(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintJustYearlyJanitor(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintLiquidityPoolCommunitySacrificeLock(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintLiquidityPoolCommunityBuybackLock(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintStakingReward(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintScienceReward(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 periodCount,
        uint256 blockNumber,
        uint256 timestamp
    );
    event MintLiquidityPoolStartSuccessLock(
        address indexed sender,
        address indexed recipient,
        uint256 amount,
        uint256 blockNumber,
        uint256 timestamp
    );

    // ------------------------------ RECIPIENT ADDRESSES -----------------------

    address public constant RECIPIENT_LIQUIDITY_POOL_STARTING                  = 0xF46b417245F05Bc24e07c3A4AEd9DdDCC0Ea7760;
    address public constant RECIPIENT_LIQUIDITY_POOL_STARTING_SACRIFICE_REWARD = 0xFFD9c98467c07A07A969AD4d411dc33Fb406a35B;
    address public constant RECIPIENT_LIQUIDITY_POOL_SACRIFICE_SUCCESS_LOCK    = 0x509323819a25A79cE0235f4EA81A35576112968D;
    address public constant RECIPIENT_JUST_YEARLY_JANITOR                      = 0xDb0F954DBcc5BBB95De61A24ea9547F4555bE98b;
    address public constant RECIPIENT_LIQUIDITY_POOL_COMMUNITY_SACRIFICE_LOCK  = 0x5E901fe27F2BA5DFba024CB246F4145b74791A6F;
    address public constant RECIPIENT_LIQUIDITY_POOL_COMMUNITY_BUYBACK_LOCK    = 0x58d3fF89F6C27F8E4aB7EAFEebbF1D34837b852b;
    address public constant RECIPIENT_JUST_JANITOR                             = 0x6421Cf34f193609EBD78b7D6DFc75F9B6F738536;
    address public constant RECIPIENT_CURECOIN_AND_FLDC_CLAIM                  = 0x06cB9263aBaA71C84ECce77D62ff7B4A1ce1B60c;
    address public constant RECIPIENT_STAKING_REWARD                           = 0xA92bA7794429357Ef26341a7300Dd090b68a7F03;
    address public constant RECIPIENT_SCIENCE_REWARD                           = 0x99066Af7FA805FD9F37bf88e99a7C45B87d8e725;
    address public constant RECIPIENT_LIQUIDITY_POOL_START_SUCCESS_LOCK        = 0xd11FF2430A8D87A4be9f3292817565939Bd650A1;

    // ------------------------------ STATE VARIABLES ---------------------------

    address public immutable JustAJanitor;   // Only this address may perform minting

    bool    public mintedLiquidityPoolStarting;
    bool    public mintedJustJanitor;
    bool    public mintedLiquidityPoolStartSuccessLock;

    uint256 public cureCoinAndFLDCClaimCount;
    uint256 public liquidityPoolStartingSacrificeRewardCount;
    uint256 public liquidityPoolSacrificeSuccessLockCount;
    uint256 public justYearlyJanitorCount;
    uint256 public liquidityPoolCommunitySacrificeLockCount;
    uint256 public liquidityPoolCommunityBuybackLockCount;
    uint256 public stakingRewardCount;
    uint256 public scienceRewardCount;

    uint256[22] private scienceRewardByYear;

    uint256 public immutable startBlock;

    // ------------------------------ INTERVAL CONSTANTS ------------------------

    uint256 private constant BLOCKS_PER_MONTH      = 259200;   // ~30d @10s/block
    uint256 private constant BLOCKS_PER_YEAR       = 3153600;  // ~365d
    uint256 private constant MAX_SLOTS_PER_TX      = 3;        // Catch-up limit
    uint256 private constant CLAIM_START_DELAY     = 4 * BLOCKS_PER_MONTH; // 4 months delay
    uint256 private constant ONE_MONTH_DELAY_BLOCKS = BLOCKS_PER_MONTH; // Used where 1 month delay is needed

    // ------------------------------ CONSTRUCTOR ------------------------------

    constructor() ERC20("DrDoge", "DRDOGE") {
        JustAJanitor = msg.sender;
        startBlock   = block.number;
        // Science reward schedule for first 21 years (then flat)
        scienceRewardByYear[1]  = 300_000;
        scienceRewardByYear[2]  = 270_000;
        scienceRewardByYear[3]  = 243_000;
        scienceRewardByYear[4]  = 218_700;
        scienceRewardByYear[5]  = 196_830;
        scienceRewardByYear[6]  = 177_147;
        scienceRewardByYear[7]  = 159_432;
        scienceRewardByYear[8]  = 143_489;
        scienceRewardByYear[9]  = 129_140;
        scienceRewardByYear[10] = 116_226;
        scienceRewardByYear[11] = 104_603;
        scienceRewardByYear[12] = 94_143;
        scienceRewardByYear[13] = 84_729;
        scienceRewardByYear[14] = 76_256;
        scienceRewardByYear[15] = 68_630;
        scienceRewardByYear[16] = 61_767;
        scienceRewardByYear[17] = 55_590;
        scienceRewardByYear[18] = 50_031;
        scienceRewardByYear[19] = 45_028;
        scienceRewardByYear[20] = 49_052;
        scienceRewardByYear[21] = 50_000;
    }

    // ------------------------------ MINT FUNCTIONS ---------------------------

    /**
     * @notice Mint initial liquidity pool starting tokens (one-time)
     */
    function mintLiquidityPoolStarting() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(!mintedLiquidityPoolStarting, "LiquidityPoolStarting already minted");
        mintedLiquidityPoolStarting = true;
        uint256 amount = 3_000_000 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_STARTING, amount);
        emit MintLiquidityPoolStarting(msg.sender, RECIPIENT_LIQUIDITY_POOL_STARTING, amount, block.number, block.timestamp);
    }

    /**
     * @notice Mint one-time janitor tokens (one-time)
     */
    function mintJustJanitor() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(!mintedJustJanitor, "JustJanitor already minted");
        mintedJustJanitor = true;
        uint256 amount = 300_000 * 10**decimals();
        _mint(RECIPIENT_JUST_JANITOR, amount);
        emit MintJustJanitor(msg.sender, RECIPIENT_JUST_JANITOR, amount, block.number, block.timestamp);
    }

    /**
     * @notice Mint monthly CureCoin & FLDC claim tokens (after 4-month delay, up to 6 months)
     */
    function mintCureCoinAndFLDCClaim() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + CLAIM_START_DELAY, "Claiming not started yet");
        require(cureCoinAndFLDCClaimCount < 6, "Claim minting period completed");

        uint256 monthsElapsed = (block.number - startBlock) / BLOCKS_PER_MONTH;
        uint256 availableSlots = monthsElapsed >= 4 ? monthsElapsed - 4 + 1 : 0;
        require(availableSlots > cureCoinAndFLDCClaimCount, "No monthly slot available");

        uint256 toMint = availableSlots - cureCoinAndFLDCClaimCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (cureCoinAndFLDCClaimCount + toMint > 6) {
            toMint = 6 - cureCoinAndFLDCClaimCount;
        }
        cureCoinAndFLDCClaimCount += toMint;

        uint256 amount = toMint * 333_333 * 10**decimals();
        _mint(RECIPIENT_CURECOIN_AND_FLDC_CLAIM, amount);
        emit MintCureCoinAndFLDCClaim(msg.sender, RECIPIENT_CURECOIN_AND_FLDC_CLAIM, amount, cureCoinAndFLDCClaimCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint monthly liquidity pool starting sacrifice rewards (up to 24 months)
     */
    function mintLiquidityPoolStartingSacrificeReward() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + ONE_MONTH_DELAY_BLOCKS, "Monthly delay not reached");
        require(liquidityPoolStartingSacrificeRewardCount < 24, "StartingSacrificeReward minted out");
        uint256 slots = _monthsSinceStart();
        require(slots > liquidityPoolStartingSacrificeRewardCount, "No monthly slot available");
        uint256 toMint = slots - liquidityPoolStartingSacrificeRewardCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (liquidityPoolStartingSacrificeRewardCount + toMint > 24) {
            toMint = 24 - liquidityPoolStartingSacrificeRewardCount;
        }
        liquidityPoolStartingSacrificeRewardCount += toMint;
        uint256 amount = toMint * 125_000 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_STARTING_SACRIFICE_REWARD, amount);
        emit MintLiquidityPoolStartingSacrificeReward(msg.sender, RECIPIENT_LIQUIDITY_POOL_STARTING_SACRIFICE_REWARD, amount, liquidityPoolStartingSacrificeRewardCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint monthly liquidity pool sacrifice success lock (up to 24 months)
     */
    function mintLiquidityPoolSacrificeSuccessLock() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + ONE_MONTH_DELAY_BLOCKS, "Monthly delay not reached");
        require(liquidityPoolSacrificeSuccessLockCount < 24, "SacrificeSuccessLock minted out");
        uint256 slots = _monthsSinceStart();
        require(slots > liquidityPoolSacrificeSuccessLockCount, "No monthly slot available");
        uint256 toMint = slots - liquidityPoolSacrificeSuccessLockCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (liquidityPoolSacrificeSuccessLockCount + toMint > 24) {
            toMint = 24 - liquidityPoolSacrificeSuccessLockCount;
        }
        liquidityPoolSacrificeSuccessLockCount += toMint;
        uint256 amount = toMint * 41_650 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_SACRIFICE_SUCCESS_LOCK, amount);
        emit MintLiquidityPoolSacrificeSuccessLock(msg.sender, RECIPIENT_LIQUIDITY_POOL_SACRIFICE_SUCCESS_LOCK, amount, liquidityPoolSacrificeSuccessLockCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint yearly janitor allocation (unlimited years, first mint only after 1 year)
     */
    function mintJustYearlyJanitor() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + BLOCKS_PER_YEAR, "Yearly minting not started yet");
        uint256 slots = _yearsSinceStart();
        require(slots > justYearlyJanitorCount, "No yearly slot available");
        uint256 toMint = slots - justYearlyJanitorCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        justYearlyJanitorCount += toMint;
        uint256 amount = toMint * 50_000 * 10**decimals();
        _mint(RECIPIENT_JUST_YEARLY_JANITOR, amount);
        emit MintJustYearlyJanitor(msg.sender, RECIPIENT_JUST_YEARLY_JANITOR, amount, justYearlyJanitorCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint monthly community sacrifice lock (up to 24 months)
     */
    function mintLiquidityPoolCommunitySacrificeLock() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + ONE_MONTH_DELAY_BLOCKS, "Monthly delay not reached");
        require(liquidityPoolCommunitySacrificeLockCount < 24, "CommunitySacrificeLock minted out");
        uint256 slots = _monthsSinceStart();
        require(slots > liquidityPoolCommunitySacrificeLockCount, "No monthly slot available");
        uint256 toMint = slots - liquidityPoolCommunitySacrificeLockCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (liquidityPoolCommunitySacrificeLockCount + toMint > 24) {
            toMint = 24 - liquidityPoolCommunitySacrificeLockCount;
        }
        liquidityPoolCommunitySacrificeLockCount += toMint;
        uint256 amount = toMint * 125_000 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_COMMUNITY_SACRIFICE_LOCK, amount);
        emit MintLiquidityPoolCommunitySacrificeLock(msg.sender, RECIPIENT_LIQUIDITY_POOL_COMMUNITY_SACRIFICE_LOCK, amount, liquidityPoolCommunitySacrificeLockCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint monthly community buyback lock (up to 24 months)
     */
    function mintLiquidityPoolCommunityBuybackLock() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + ONE_MONTH_DELAY_BLOCKS, "Monthly delay not reached");
        require(liquidityPoolCommunityBuybackLockCount < 24, "CommunityBuybackLock minted out");
        uint256 slots = _monthsSinceStart();
        require(slots > liquidityPoolCommunityBuybackLockCount, "No monthly slot available");
        uint256 toMint = slots - liquidityPoolCommunityBuybackLockCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (liquidityPoolCommunityBuybackLockCount + toMint > 24) {
            toMint = 24 - liquidityPoolCommunityBuybackLockCount;
        }
        liquidityPoolCommunityBuybackLockCount += toMint;
        uint256 amount = toMint * 83_300 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_COMMUNITY_BUYBACK_LOCK, amount);
        emit MintLiquidityPoolCommunityBuybackLock(msg.sender, RECIPIENT_LIQUIDITY_POOL_COMMUNITY_BUYBACK_LOCK, amount, liquidityPoolCommunityBuybackLockCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint yearly staking rewards (up to 3 years)
     */
    function mintStakingReward() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(block.number >= startBlock + BLOCKS_PER_YEAR, "Yearly delay not reached");
        require(stakingRewardCount < 3, "StakingReward minted out");
        uint256 slots = _yearsSinceStart();
        require(slots > stakingRewardCount, "No yearly slot available");
        uint256 toMint = slots - stakingRewardCount;
        if (toMint > MAX_SLOTS_PER_TX) {
            toMint = MAX_SLOTS_PER_TX;
        }
        if (stakingRewardCount + toMint > 3) {
            toMint = 3 - stakingRewardCount;
        }
        stakingRewardCount += toMint;
        uint256 amount = toMint * 500_000 * 10**decimals();
        _mint(RECIPIENT_STAKING_REWARD, amount);
        emit MintStakingReward(msg.sender, RECIPIENT_STAKING_REWARD, amount, stakingRewardCount, block.number, block.timestamp);
    }

    /**
     * @notice Mint yearly science reward (unlimited, tiered schedule for first 21 years)
     */
    function mintScienceReward() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        uint256 slots = _yearsSinceStart();
        uint256 slotsToMint = slots - scienceRewardCount;
        if (slotsToMint > MAX_SLOTS_PER_TX) {
            slotsToMint = MAX_SLOTS_PER_TX;
        }
        require(slotsToMint > 0, "No yearly slot available");
        for (uint256 i = 0; i < slotsToMint; i++) { 
            scienceRewardCount++;
            uint256 yearIndex = scienceRewardCount > 21 ? 21 : scienceRewardCount;
            uint256 reward    = scienceRewardByYear[yearIndex] * 10**decimals();
            _mint(RECIPIENT_SCIENCE_REWARD, reward);
            emit MintScienceReward(msg.sender, RECIPIENT_SCIENCE_REWARD, reward, scienceRewardCount, block.number, block.timestamp);
        }
    }

    /**
     * @notice Mint a one-time liquidity pool start success lock allocation
     */
    function mintLiquidityPoolStartSuccessLock() external {
        require(msg.sender == JustAJanitor, "Only JustAJanitor can mint");
        require(!mintedLiquidityPoolStartSuccessLock, "LiqudityPoolStartSuccessLock already minted");
        mintedLiquidityPoolStartSuccessLock = true;
        uint256 amount = 300_000 * 10**decimals();
        _mint(RECIPIENT_LIQUIDITY_POOL_START_SUCCESS_LOCK, amount);
        emit MintLiquidityPoolStartSuccessLock(msg.sender, RECIPIENT_LIQUIDITY_POOL_START_SUCCESS_LOCK, amount, block.number, block.timestamp);
    }

    // ------------------------------ INTERNAL HELPERS ---------------------------

    function _monthsSinceStart() internal view returns (uint256) {
        return ((block.number - startBlock) / BLOCKS_PER_MONTH) + 1;
    }

    function _yearsSinceStart() internal view returns (uint256) {
        return ((block.number - startBlock) / BLOCKS_PER_YEAR) + 1;
    }
}
        

@openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.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 ERC-20 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);
}
          

@openzeppelin/contracts/interfaces/draft-IERC6093.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (interfaces/draft-IERC6093.sol)
pragma solidity ^0.8.20;

/**
 * @dev Standard ERC-20 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-20 tokens.
 */
interface IERC20Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientBalance(address sender, uint256 balance, uint256 needed);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC20InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC20InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `spender`’s `allowance`. Used in transfers.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     * @param allowance Amount of tokens a `spender` is allowed to operate with.
     * @param needed Minimum amount required to perform a transfer.
     */
    error ERC20InsufficientAllowance(address spender, uint256 allowance, uint256 needed);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC20InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `spender` to be approved. Used in approvals.
     * @param spender Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC20InvalidSpender(address spender);
}

/**
 * @dev Standard ERC-721 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-721 tokens.
 */
interface IERC721Errors {
    /**
     * @dev Indicates that an address can't be an owner. For example, `address(0)` is a forbidden owner in ERC-20.
     * Used in balance queries.
     * @param owner Address of the current owner of a token.
     */
    error ERC721InvalidOwner(address owner);

    /**
     * @dev Indicates a `tokenId` whose `owner` is the zero address.
     * @param tokenId Identifier number of a token.
     */
    error ERC721NonexistentToken(uint256 tokenId);

    /**
     * @dev Indicates an error related to the ownership over a particular token. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param tokenId Identifier number of a token.
     * @param owner Address of the current owner of a token.
     */
    error ERC721IncorrectOwner(address sender, uint256 tokenId, address owner);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC721InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC721InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param tokenId Identifier number of a token.
     */
    error ERC721InsufficientApproval(address operator, uint256 tokenId);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC721InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC721InvalidOperator(address operator);
}

/**
 * @dev Standard ERC-1155 Errors
 * Interface of the https://eips.ethereum.org/EIPS/eip-6093[ERC-6093] custom errors for ERC-1155 tokens.
 */
interface IERC1155Errors {
    /**
     * @dev Indicates an error related to the current `balance` of a `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     * @param balance Current balance for the interacting account.
     * @param needed Minimum amount required to perform a transfer.
     * @param tokenId Identifier number of a token.
     */
    error ERC1155InsufficientBalance(address sender, uint256 balance, uint256 needed, uint256 tokenId);

    /**
     * @dev Indicates a failure with the token `sender`. Used in transfers.
     * @param sender Address whose tokens are being transferred.
     */
    error ERC1155InvalidSender(address sender);

    /**
     * @dev Indicates a failure with the token `receiver`. Used in transfers.
     * @param receiver Address to which tokens are being transferred.
     */
    error ERC1155InvalidReceiver(address receiver);

    /**
     * @dev Indicates a failure with the `operator`’s approval. Used in transfers.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     * @param owner Address of the current owner of a token.
     */
    error ERC1155MissingApprovalForAll(address operator, address owner);

    /**
     * @dev Indicates a failure with the `approver` of a token to be approved. Used in approvals.
     * @param approver Address initiating an approval operation.
     */
    error ERC1155InvalidApprover(address approver);

    /**
     * @dev Indicates a failure with the `operator` to be approved. Used in approvals.
     * @param operator Address that may be allowed to operate on tokens without being their owner.
     */
    error ERC1155InvalidOperator(address operator);

    /**
     * @dev Indicates an array length mismatch between ids and values in a safeBatchTransferFrom operation.
     * Used in batch transfers.
     * @param idsLength Length of the array of token identifiers
     * @param valuesLength Length of the array of token amounts
     */
    error ERC1155InvalidArrayLength(uint256 idsLength, uint256 valuesLength);
}
          

@openzeppelin/contracts/token/ERC20/ERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.3.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.20;

import {IERC20} from "./IERC20.sol";
import {IERC20Metadata} from "./extensions/IERC20Metadata.sol";
import {Context} from "../../utils/Context.sol";
import {IERC20Errors} from "../../interfaces/draft-IERC6093.sol";

/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.openzeppelin.com/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * The default value of {decimals} is 18. To change this, you should override
 * this function so it returns a different value.
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC-20
 * applications.
 */
abstract contract ERC20 is Context, IERC20, IERC20Metadata, IERC20Errors {
    mapping(address account => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * Both 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 returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view virtual 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 view virtual returns (uint8) {
        return 18;
    }

    /**
     * @dev See {IERC20-totalSupply}.
     */
    function totalSupply() public view virtual returns (uint256) {
        return _totalSupply;
    }

    /**
     * @dev See {IERC20-balanceOf}.
     */
    function balanceOf(address account) public view virtual 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 `value`.
     */
    function transfer(address to, uint256 value) public virtual returns (bool) {
        address owner = _msgSender();
        _transfer(owner, to, value);
        return true;
    }

    /**
     * @dev See {IERC20-allowance}.
     */
    function allowance(address owner, address spender) public view virtual returns (uint256) {
        return _allowances[owner][spender];
    }

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `value` 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 value) public virtual returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, value);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Skips emitting an {Approval} event indicating an allowance update. This is not
     * required by the ERC. See {xref-ERC20-_approve-address-address-uint256-bool-}[_approve].
     *
     * 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 `value`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `value`.
     */
    function transferFrom(address from, address to, uint256 value) public virtual returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, value);
        _transfer(from, to, value);
        return true;
    }

    /**
     * @dev Moves a `value` 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.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _transfer(address from, address to, uint256 value) internal {
        if (from == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        if (to == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(from, to, value);
    }

    /**
     * @dev Transfers a `value` amount of tokens from `from` to `to`, or alternatively mints (or burns) if `from`
     * (or `to`) is the zero address. All customizations to transfers, mints, and burns should be done by overriding
     * this function.
     *
     * Emits a {Transfer} event.
     */
    function _update(address from, address to, uint256 value) internal virtual {
        if (from == address(0)) {
            // Overflow check required: The rest of the code assumes that totalSupply never overflows
            _totalSupply += value;
        } else {
            uint256 fromBalance = _balances[from];
            if (fromBalance < value) {
                revert ERC20InsufficientBalance(from, fromBalance, value);
            }
            unchecked {
                // Overflow not possible: value <= fromBalance <= totalSupply.
                _balances[from] = fromBalance - value;
            }
        }

        if (to == address(0)) {
            unchecked {
                // Overflow not possible: value <= totalSupply or value <= fromBalance <= totalSupply.
                _totalSupply -= value;
            }
        } else {
            unchecked {
                // Overflow not possible: balance + value is at most totalSupply, which we know fits into a uint256.
                _balances[to] += value;
            }
        }

        emit Transfer(from, to, value);
    }

    /**
     * @dev Creates a `value` amount of tokens and assigns them to `account`, by transferring it from address(0).
     * Relies on the `_update` mechanism
     *
     * Emits a {Transfer} event with `from` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead.
     */
    function _mint(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidReceiver(address(0));
        }
        _update(address(0), account, value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, lowering the total supply.
     * Relies on the `_update` mechanism.
     *
     * Emits a {Transfer} event with `to` set to the zero address.
     *
     * NOTE: This function is not virtual, {_update} should be overridden instead
     */
    function _burn(address account, uint256 value) internal {
        if (account == address(0)) {
            revert ERC20InvalidSender(address(0));
        }
        _update(account, address(0), value);
    }

    /**
     * @dev Sets `value` 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.
     *
     * Overrides to this logic should be done to the variant with an additional `bool emitEvent` argument.
     */
    function _approve(address owner, address spender, uint256 value) internal {
        _approve(owner, spender, value, true);
    }

    /**
     * @dev Variant of {_approve} with an optional flag to enable or disable the {Approval} event.
     *
     * By default (when calling {_approve}) the flag is set to true. On the other hand, approval changes made by
     * `_spendAllowance` during the `transferFrom` operation set the flag to false. This saves gas by not emitting any
     * `Approval` event during `transferFrom` operations.
     *
     * Anyone who wishes to continue emitting `Approval` events on the`transferFrom` operation can force the flag to
     * true using the following override:
     *
     * ```solidity
     * function _approve(address owner, address spender, uint256 value, bool) internal virtual override {
     *     super._approve(owner, spender, value, true);
     * }
     * ```
     *
     * Requirements are the same as {_approve}.
     */
    function _approve(address owner, address spender, uint256 value, bool emitEvent) internal virtual {
        if (owner == address(0)) {
            revert ERC20InvalidApprover(address(0));
        }
        if (spender == address(0)) {
            revert ERC20InvalidSpender(address(0));
        }
        _allowances[owner][spender] = value;
        if (emitEvent) {
            emit Approval(owner, spender, value);
        }
    }

    /**
     * @dev Updates `owner`'s allowance for `spender` based on spent `value`.
     *
     * Does not update the allowance value in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Does not emit an {Approval} event.
     */
    function _spendAllowance(address owner, address spender, uint256 value) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance < type(uint256).max) {
            if (currentAllowance < value) {
                revert ERC20InsufficientAllowance(spender, currentAllowance, value);
            }
            unchecked {
                _approve(owner, spender, currentAllowance - value, false);
            }
        }
    }
}
          

@openzeppelin/contracts/token/ERC20/IERC20.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.1.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC-20 standard as defined in the ERC.
 */
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);
}
          

@openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol

// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.20;

import {ERC20} from "../ERC20.sol";
import {Context} from "../../../utils/Context.sol";

/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys a `value` amount of tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 value) public virtual {
        _burn(_msgSender(), value);
    }

    /**
     * @dev Destroys a `value` amount of tokens from `account`, deducting from
     * the caller's allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `value`.
     */
    function burnFrom(address account, uint256 value) public virtual {
        _spendAllowance(account, _msgSender(), value);
        _burn(account, value);
    }
}
          

@openzeppelin/contracts/utils/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;
    }
}
          

Compiler Settings

{"outputSelection":{"*":{"*":["abi","evm.bytecode","evm.deployedBytecode","evm.methodIdentifiers","metadata"],"":["ast"]}},"optimizer":{"runs":200,"enabled":true},"libraries":{},"evmVersion":"paris"}
              

Contract ABI

[{"type":"constructor","stateMutability":"nonpayable","inputs":[]},{"type":"error","name":"ERC20InsufficientAllowance","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"allowance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InsufficientBalance","inputs":[{"type":"address","name":"sender","internalType":"address"},{"type":"uint256","name":"balance","internalType":"uint256"},{"type":"uint256","name":"needed","internalType":"uint256"}]},{"type":"error","name":"ERC20InvalidApprover","inputs":[{"type":"address","name":"approver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidReceiver","inputs":[{"type":"address","name":"receiver","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSender","inputs":[{"type":"address","name":"sender","internalType":"address"}]},{"type":"error","name":"ERC20InvalidSpender","inputs":[{"type":"address","name":"spender","internalType":"address"}]},{"type":"event","name":"Approval","inputs":[{"type":"address","name":"owner","internalType":"address","indexed":true},{"type":"address","name":"spender","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintCureCoinAndFLDCClaim","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintJustJanitor","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintJustYearlyJanitor","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolCommunityBuybackLock","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolCommunitySacrificeLock","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolSacrificeSuccessLock","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolStartSuccessLock","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolStarting","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintLiquidityPoolStartingSacrificeReward","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintScienceReward","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"MintStakingReward","inputs":[{"type":"address","name":"sender","internalType":"address","indexed":true},{"type":"address","name":"recipient","internalType":"address","indexed":true},{"type":"uint256","name":"amount","internalType":"uint256","indexed":false},{"type":"uint256","name":"periodCount","internalType":"uint256","indexed":false},{"type":"uint256","name":"blockNumber","internalType":"uint256","indexed":false},{"type":"uint256","name":"timestamp","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"event","name":"Transfer","inputs":[{"type":"address","name":"from","internalType":"address","indexed":true},{"type":"address","name":"to","internalType":"address","indexed":true},{"type":"uint256","name":"value","internalType":"uint256","indexed":false}],"anonymous":false},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"JustAJanitor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_CURECOIN_AND_FLDC_CLAIM","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_JUST_JANITOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_JUST_YEARLY_JANITOR","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_COMMUNITY_BUYBACK_LOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_COMMUNITY_SACRIFICE_LOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_SACRIFICE_SUCCESS_LOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_STARTING","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_STARTING_SACRIFICE_REWARD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_LIQUIDITY_POOL_START_SUCCESS_LOCK","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_SCIENCE_REWARD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"address","name":"","internalType":"address"}],"name":"RECIPIENT_STAKING_REWARD","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"allowance","inputs":[{"type":"address","name":"owner","internalType":"address"},{"type":"address","name":"spender","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"approve","inputs":[{"type":"address","name":"spender","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"balanceOf","inputs":[{"type":"address","name":"account","internalType":"address"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burn","inputs":[{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"burnFrom","inputs":[{"type":"address","name":"account","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"cureCoinAndFLDCClaimCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint8","name":"","internalType":"uint8"}],"name":"decimals","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"justYearlyJanitorCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPoolCommunityBuybackLockCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPoolCommunitySacrificeLockCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPoolSacrificeSuccessLockCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"liquidityPoolStartingSacrificeRewardCount","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintCureCoinAndFLDCClaim","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintJustJanitor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintJustYearlyJanitor","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolCommunityBuybackLock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolCommunitySacrificeLock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolSacrificeSuccessLock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolStartSuccessLock","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolStarting","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintLiquidityPoolStartingSacrificeReward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintScienceReward","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[],"name":"mintStakingReward","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintedJustJanitor","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintedLiquidityPoolStartSuccessLock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"mintedLiquidityPoolStarting","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"name","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"scienceRewardCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"stakingRewardCount","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"startBlock","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"string","name":"","internalType":"string"}],"name":"symbol","inputs":[]},{"type":"function","stateMutability":"view","outputs":[{"type":"uint256","name":"","internalType":"uint256"}],"name":"totalSupply","inputs":[]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transfer","inputs":[{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]},{"type":"function","stateMutability":"nonpayable","outputs":[{"type":"bool","name":"","internalType":"bool"}],"name":"transferFrom","inputs":[{"type":"address","name":"from","internalType":"address"},{"type":"address","name":"to","internalType":"address"},{"type":"uint256","name":"value","internalType":"uint256"}]}]
              

Contract Creation Code

0x60c060405234801561001057600080fd5b50604051806040016040528060068152602001654472446f676560d01b815250604051806040016040528060068152602001654452444f474560d01b815250816003908161005e91906101a7565b50600461006b82826101a7565b505033608052504360a052620493e0600f5562041eb06010556203b5386011556203564c601255620300de6013556202b3fb60145562026ec8601555620230816016556201f8746017556201c6026018556201989b60195562016fbf601a5562014af9601b55620129e0601c5562010c16601d5561f147601e5561d926601f5561c36f60205561afe460215561bf9c60225561c350602355610265565b634e487b7160e01b600052604160045260246000fd5b600181811c9082168061013257607f821691505b60208210810361015257634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156101a257806000526020600020601f840160051c8101602085101561017f5750805b601f840160051c820191505b8181101561019f576000815560010161018b565b50505b505050565b81516001600160401b038111156101c0576101c0610108565b6101d4816101ce845461011e565b84610158565b6020601f82116001811461020857600083156101f05750848201515b600019600385901b1c1916600184901b17845561019f565b600084815260208120601f198516915b828110156102385787850151825560209485019460019092019101610218565b50848210156102565786840151600019600387901b60f8161c191681555b50505050600190811b01905550565b60805160a0516123b661031d600039600081816103d9015281816108bc01528181610c5701528181610e220152818161106701528181611287015281816117590152818161198601528181611a5501528181611cd20152611d520152600081816102d5015281816106e50152818161087601528181610a9e01528181610c1101528181610ddc01528181611021015281816112410152818161147e015281816115cb01528181611713015261193501526123b66000f3fe608060405234801561001057600080fd5b506004361061028a5760003560e01c806353f11cd81161015c5780639bc9e03e116100ce578063b87c4a8111610087578063b87c4a811461056b578063cecc219814610578578063dd62ed3e14610593578063ea6e2e98146105cc578063f315aa90146105d4578063f753b38a146105ef57600080fd5b80639bc9e03e1461051c5780639debc24e14610524578063a1d299831461052c578063a9059cbb14610534578063a92a58f414610547578063b312c8c61461055057600080fd5b8063785947961161012057806378594796146104ba57806379cc6790146104c25780637a4b1ba5146104d557806382bc949f146104f057806395d89b411461050b578063977cf98d1461051357600080fd5b806353f11cd81461045d5780636bd7fda71461047857806370a08231146104815780637126d490146104aa57806372dbaa7b146104b257600080fd5b80633c2ce7c61161020057806348ecf468116101b957806348ecf468146103fb5780634d0a6bf3146104165780634d4182561461041f5780634df04597146104285780634f9b00ed146104435780635180a4721461045557600080fd5b80633c2ce7c61461038c5780634088d1fa146103a7578063414828ce146103b057806342966c68146103b8578063476195ea146103cb57806348cd4cb1146103d457600080fd5b80631a2067e4116102525780631a2067e41461033c57806323b872dd146103455780632444863e14610358578063249feb291461036b578063266d308f14610375578063313ce5671461037d57600080fd5b806306fdde031461028f578063095ea7b3146102ad578063133346fc146102d057806318160ddd1461030f57806319ba22d714610321575b600080fd5b61029761060a565b6040516102a49190611f91565b60405180910390f35b6102c06102bb366004611ffb565b61069c565b60405190151581526020016102a4565b6102f77f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b0390911681526020016102a4565b6002545b6040519081526020016102a4565b6102f773a92ba7794429357ef26341a7300dd090b68a7f0381565b610313600c5481565b6102c0610353366004612025565b6106b6565b6005546102c09062010000900460ff1681565b6103736106da565b005b61037361086b565b604051601281526020016102a4565b6102f773f46b417245f05bc24e07c3a4aed9dddcc0ea776081565b61031360075481565b610373610a93565b6103736103c6366004612062565b610bf9565b61031360065481565b6103137f000000000000000000000000000000000000000000000000000000000000000081565b6102f773ffd9c98467c07a07a969ad4d411dc33fb406a35b81565b61031360085481565b610313600b5481565b6102f7735e901fe27f2ba5dfba024cb246f4145b74791a6f81565b6005546102c090610100900460ff1681565b610373610c06565b6102f77306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c81565b610313600d5481565b61031361048f36600461207b565b6001600160a01b031660009081526020819052604090205490565b610373610dd1565b610373611016565b610373611236565b6103736104d0366004611ffb565b61144b565b6102f77399066af7fa805fd9f37bf88e99a7c45b87d8e72581565b6102f7736421cf34f193609ebd78b7d6dfc75f9b6f73853681565b610297611464565b61031360095481565b610373611473565b6103736115c0565b610373611708565b6102c0610542366004611ffb565b61191c565b610313600a5481565b6102f773db0f954dbcc5bbb95de61a24ea9547f4555be98b81565b6005546102c09060ff1681565b6102f773509323819a25a79ce0235f4ea81a35576112968d81565b6103136105a136600461209d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61037361192a565b6102f77358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b81565b6102f773d11ff2430a8d87a4be9f3292817565939bd650a181565b606060038054610619906120d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610645906120d0565b80156106925780601f1061066757610100808354040283529160200191610692565b820191906000526020600020905b81548152906001019060200180831161067557829003601f168201915b5050505050905090565b6000336106aa818585611bdc565b60019150505b92915050565b6000336106c4858285611be9565b6106cf858585611c68565b506001949350505050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461072b5760405162461bcd60e51b81526004016107229061210a565b60405180910390fd5b6000610735611cc7565b90506000600d54826107479190612157565b90506003811115610756575060035b600081116107765760405162461bcd60e51b81526004016107229061216a565b60005b8181101561086657600d8054906000610791836121a1565b919050555060006015600d54116107aa57600d546107ad565b60155b905060006107bd6012600a6122a1565b600e83601681106107d0576107d06122b0565b01546107dc91906122c6565b90506107fc7399066af7fa805fd9f37bf88e99a7c45b87d8e72582611d11565b600d546040805183815260208101929092524382820152426060830152517399066af7fa805fd9f37bf88e99a7c45b87d8e7259133917f7d09aa606352a772bbfe118c92468b2e6c7f8f9bad8e8ac7a6115a352b33307e9181900360800190a35050600101610779565b505050565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146108b35760405162461bcd60e51b81526004016107229061210a565b6108e06203f4807f00000000000000000000000000000000000000000000000000000000000000006122dd565b4310156108ff5760405162461bcd60e51b8152600401610722906122f0565b6018600a541061095b5760405162461bcd60e51b815260206004820152602160248201527f436f6d6d756e6974795361637269666963654c6f636b206d696e746564206f756044820152601d60fa1b6064820152608401610722565b6000610965611d47565b9050600a5481116109885760405162461bcd60e51b815260040161072290612327565b6000600a54826109989190612157565b905060038111156109a7575060035b601881600a546109b791906122dd565b11156109ce57600a546109cb906018612157565b90505b80600a60008282546109e091906122dd565b90915550600090506109f46012600a6122a1565b610a01836201e8486122c6565b610a0b91906122c6565b9050610a2b735e901fe27f2ba5dfba024cb246f4145b74791a6f82611d11565b600a546040805183815260208101929092524390820152426060820152735e901fe27f2ba5dfba024cb246f4145b74791a6f9033907f4517bd3a07c19e912a560b46028a17a473d4eafce09052818b052279ee457c3d906080015b60405180910390a3505050565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610adb5760405162461bcd60e51b81526004016107229061210a565b60055462010000900460ff1615610b485760405162461bcd60e51b815260206004820152602b60248201527f4c69717564697479506f6f6c5374617274537563636573734c6f636b20616c7260448201526a1958591e481b5a5b9d195960aa1b6064820152608401610722565b6005805462ff00001916620100001790556000610b63601290565b610b6e90600a6122a1565b610b7b90620493e06122c6565b9050610b9b73d11ff2430a8d87a4be9f3292817565939bd650a182611d11565b60408051828152436020820152429181019190915273d11ff2430a8d87a4be9f3292817565939bd650a19033907f91b662e6504b5400709055bdcad22f79dbeb26f69689469a1828afaefcb1cebf906060015b60405180910390a350565b610c033382611d77565b50565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610c4e5760405162461bcd60e51b81526004016107229061210a565b610c7b62301ec07f00000000000000000000000000000000000000000000000000000000000000006122dd565b431015610cca5760405162461bcd60e51b815260206004820152601e60248201527f596561726c79206d696e74696e67206e6f7420737461727465642079657400006044820152606401610722565b6000610cd4611cc7565b90506009548111610cf75760405162461bcd60e51b81526004016107229061216a565b600060095482610d079190612157565b90506003811115610d16575060035b8060096000828254610d2891906122dd565b9091555060009050610d3c6012600a6122a1565b610d488361c3506122c6565b610d5291906122c6565b9050610d7273db0f954dbcc5bbb95de61a24ea9547f4555be98b82611d11565b600954604080518381526020810192909252439082015242606082015273db0f954dbcc5bbb95de61a24ea9547f4555be98b9033907f9470f40d4d40814ca773f56a83d0663817545abd726d3dddfb087a3ff6be2b5e90608001610a86565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614610e195760405162461bcd60e51b81526004016107229061210a565b610e4662301ec07f00000000000000000000000000000000000000000000000000000000000000006122dd565b431015610e955760405162461bcd60e51b815260206004820152601860248201527f596561726c792064656c6179206e6f74207265616368656400000000000000006044820152606401610722565b6003600c5410610ee75760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67526577617264206d696e746564206f757400000000000000006044820152606401610722565b6000610ef1611cc7565b9050600c548111610f145760405162461bcd60e51b81526004016107229061216a565b6000600c5482610f249190612157565b90506003811115610f33575060035b600381600c54610f4391906122dd565b1115610f5a57600c54610f57906003612157565b90505b80600c6000828254610f6c91906122dd565b9091555060009050610f806012600a6122a1565b610f8d836207a1206122c6565b610f9791906122c6565b9050610fb773a92ba7794429357ef26341a7300dd090b68a7f0382611d11565b600c54604080518381526020810192909252439082015242606082015273a92ba7794429357ef26341a7300dd090b68a7f039033907f9af4abcd438b1077bba8e3431953d4505969cc133ac34bee1ddd703e8e71498490608001610a86565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461105e5760405162461bcd60e51b81526004016107229061210a565b61108b6203f4807f00000000000000000000000000000000000000000000000000000000000000006122dd565b4310156110aa5760405162461bcd60e51b8152600401610722906122f0565b6018600754106111075760405162461bcd60e51b815260206004820152602260248201527f5374617274696e67536163726966696365526577617264206d696e746564206f6044820152611d5d60f21b6064820152608401610722565b6000611111611d47565b905060075481116111345760405162461bcd60e51b815260040161072290612327565b6000600754826111449190612157565b90506003811115611153575060035b60188160075461116391906122dd565b111561117a57600754611177906018612157565b90505b806007600082825461118c91906122dd565b90915550600090506111a06012600a6122a1565b6111ad836201e8486122c6565b6111b791906122c6565b90506111d773ffd9c98467c07a07a969ad4d411dc33fb406a35b82611d11565b600754604080518381526020810192909252439082015242606082015273ffd9c98467c07a07a969ad4d411dc33fb406a35b9033907f55422e2af579fe8afe40cd3aff96bb45c60b42bba7c9db889bacf472dec2ecf690608001610a86565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161461127e5760405162461bcd60e51b81526004016107229061210a565b6112ab6203f4807f00000000000000000000000000000000000000000000000000000000000000006122dd565b4310156112ca5760405162461bcd60e51b8152600401610722906122f0565b6018600b541061131c5760405162461bcd60e51b815260206004820152601f60248201527f436f6d6d756e6974794275796261636b4c6f636b206d696e746564206f7574006044820152606401610722565b6000611326611d47565b9050600b5481116113495760405162461bcd60e51b815260040161072290612327565b6000600b54826113599190612157565b90506003811115611368575060035b601881600b5461137891906122dd565b111561138f57600b5461138c906018612157565b90505b80600b60008282546113a191906122dd565b90915550600090506113b56012600a6122a1565b6113c283620145646122c6565b6113cc91906122c6565b90506113ec7358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b82611d11565b600b5460408051838152602081019290925243908201524260608201527358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b9033907fd210c9b1369bfb1564c40568bb0a54c19910a422816b48a54f093a366e02df8890608001610a86565b611456823383611be9565b6114608282611d77565b5050565b606060048054610619906120d0565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146114bb5760405162461bcd60e51b81526004016107229061210a565b60055460ff161561151a5760405162461bcd60e51b8152602060048201526024808201527f4c6971756964697479506f6f6c5374617274696e6720616c7265616479206d696044820152631b9d195960e21b6064820152608401610722565b6005805460ff191660011790556000611531601290565b61153c90600a6122a1565b61154990622dc6c06122c6565b905061156973f46b417245f05bc24e07c3a4aed9dddcc0ea776082611d11565b60408051828152436020820152429181019190915273f46b417245f05bc24e07c3a4aed9dddcc0ea77609033907fe98354ef11d19a16646497b1955d3bbbfa7235188af7d1080c87f0ba8d31d42e90606001610bee565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146116085760405162461bcd60e51b81526004016107229061210a565b600554610100900460ff16156116605760405162461bcd60e51b815260206004820152601a60248201527f4a7573744a616e69746f7220616c7265616479206d696e7465640000000000006044820152606401610722565b6005805461ff0019166101001790556000611679601290565b61168490600a6122a1565b61169190620493e06122c6565b90506116b1736421cf34f193609ebd78b7d6dfc75f9b6f73853682611d11565b604080518281524360208201524291810191909152736421cf34f193609ebd78b7d6dfc75f9b6f7385369033907f53bd6bc4cda146eb7aebfbf32645ff694cad4327a367c01daaa10f5871d1519e90606001610bee565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146117505760405162461bcd60e51b81526004016107229061210a565b61177d6203f4807f00000000000000000000000000000000000000000000000000000000000000006122dd565b43101561179c5760405162461bcd60e51b8152600401610722906122f0565b6018600854106117ee5760405162461bcd60e51b815260206004820152601f60248201527f536163726966696365537563636573734c6f636b206d696e746564206f7574006044820152606401610722565b60006117f8611d47565b9050600854811161181b5760405162461bcd60e51b815260040161072290612327565b60006008548261182b9190612157565b9050600381111561183a575060035b60188160085461184a91906122dd565b11156118615760085461185e906018612157565b90505b806008600082825461187391906122dd565b90915550600090506118876012600a6122a1565b6118938361a2b26122c6565b61189d91906122c6565b90506118bd73509323819a25a79ce0235f4ea81a35576112968d82611d11565b600854604080518381526020810192909252439082015242606082015273509323819a25a79ce0235f4ea81a35576112968d9033907f68d4cd2dc7879625f526506cab8aad27b8c5fd42c1057cf7f3bba419efea87cc90608001610a86565b6000336106aa818585611c68565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016146119725760405162461bcd60e51b81526004016107229061210a565b6119806203f48060046122c6565b6119aa907f00000000000000000000000000000000000000000000000000000000000000006122dd565b4310156119f95760405162461bcd60e51b815260206004820152601860248201527f436c61696d696e67206e6f7420737461727465642079657400000000000000006044820152606401610722565b6006805410611a4a5760405162461bcd60e51b815260206004820152601e60248201527f436c61696d206d696e74696e6720706572696f6420636f6d706c6574656400006044820152606401610722565b60006203f480611a7a7f000000000000000000000000000000000000000000000000000000000000000043612157565b611a84919061235e565b905060006004821015611a98576000611aae565b611aa3600483612157565b611aae9060016122dd565b90506006548111611ad15760405162461bcd60e51b815260040161072290612327565b600060065482611ae19190612157565b90506003811115611af0575060035b600681600654611b0091906122dd565b1115611b165760068054611b1391612157565b90505b8060066000828254611b2891906122dd565b9091555060009050611b3c6012600a6122a1565b611b4983620516156122c6565b611b5391906122c6565b9050611b737306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c82611d11565b60065460408051838152602081019290925243908201524260608201527306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c9033907f66ee2205d6b22a0492b258ed6e9b34c42dd3804ffffe9c9d43bc051ece72fdb6906080015b60405180910390a350505050565b6108668383836001611dad565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611c625781811015611c5357604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610722565b611c6284848484036000611dad565b50505050565b6001600160a01b038316611c9257604051634b637e8f60e11b815260006004820152602401610722565b6001600160a01b038216611cbc5760405163ec442f0560e01b815260006004820152602401610722565b610866838383611e74565b600062301ec0611cf77f000000000000000000000000000000000000000000000000000000000000000043612157565b611d01919061235e565b611d0c9060016122dd565b905090565b6001600160a01b038216611d3b5760405163ec442f0560e01b815260006004820152602401610722565b61146060008383611e74565b60006203f480611cf77f000000000000000000000000000000000000000000000000000000000000000043612157565b6001600160a01b038216611da157604051634b637e8f60e11b815260006004820152602401610722565b61146082600083611e74565b6001600160a01b038416611dd75760405163e602df0560e01b815260006004820152602401610722565b6001600160a01b038316611e0157604051634a1406b160e11b815260006004820152602401610722565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611c6257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611bce91815260200190565b6001600160a01b038316611e9f578060026000828254611e9491906122dd565b90915550611f119050565b6001600160a01b03831660009081526020819052604090205481811015611ef25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610722565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f2d57600280548290039055611f4c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a8691815260200190565b602081526000825180602084015260005b81811015611fbf5760208186018101516040868401015201611fa2565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611ff657600080fd5b919050565b6000806040838503121561200e57600080fd5b61201783611fdf565b946020939093013593505050565b60008060006060848603121561203a57600080fd5b61204384611fdf565b925061205160208501611fdf565b929592945050506040919091013590565b60006020828403121561207457600080fd5b5035919050565b60006020828403121561208d57600080fd5b61209682611fdf565b9392505050565b600080604083850312156120b057600080fd5b6120b983611fdf565b91506120c760208401611fdf565b90509250929050565b600181811c908216806120e457607f821691505b60208210810361210457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f4f6e6c79204a757374414a616e69746f722063616e206d696e74000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106b0576106b0612141565b60208082526018908201527f4e6f20796561726c7920736c6f7420617661696c61626c650000000000000000604082015260600190565b6000600182016121b3576121b3612141565b5060010190565b6001815b60018411156121f5578085048111156121d9576121d9612141565b60018416156121e757908102905b60019390931c9280026121be565b935093915050565b60008261220c575060016106b0565b81612219575060006106b0565b816001811461222f576002811461223957612255565b60019150506106b0565b60ff84111561224a5761224a612141565b50506001821b6106b0565b5060208310610133831016604e8410600b8410161715612278575081810a6106b0565b61228560001984846121ba565b806000190482111561229957612299612141565b029392505050565b600061209660ff8416836121fd565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176106b0576106b0612141565b808201808211156106b0576106b0612141565b60208082526019908201527f4d6f6e74686c792064656c6179206e6f74207265616368656400000000000000604082015260600190565b60208082526019908201527f4e6f206d6f6e74686c7920736c6f7420617661696c61626c6500000000000000604082015260600190565b60008261237b57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212206047331e4bb500040bdfe8963f384212cbd90d0347687c76708071bd122eb5aa64736f6c634300081d0033

Deployed ByteCode

0x608060405234801561001057600080fd5b506004361061028a5760003560e01c806353f11cd81161015c5780639bc9e03e116100ce578063b87c4a8111610087578063b87c4a811461056b578063cecc219814610578578063dd62ed3e14610593578063ea6e2e98146105cc578063f315aa90146105d4578063f753b38a146105ef57600080fd5b80639bc9e03e1461051c5780639debc24e14610524578063a1d299831461052c578063a9059cbb14610534578063a92a58f414610547578063b312c8c61461055057600080fd5b8063785947961161012057806378594796146104ba57806379cc6790146104c25780637a4b1ba5146104d557806382bc949f146104f057806395d89b411461050b578063977cf98d1461051357600080fd5b806353f11cd81461045d5780636bd7fda71461047857806370a08231146104815780637126d490146104aa57806372dbaa7b146104b257600080fd5b80633c2ce7c61161020057806348ecf468116101b957806348ecf468146103fb5780634d0a6bf3146104165780634d4182561461041f5780634df04597146104285780634f9b00ed146104435780635180a4721461045557600080fd5b80633c2ce7c61461038c5780634088d1fa146103a7578063414828ce146103b057806342966c68146103b8578063476195ea146103cb57806348cd4cb1146103d457600080fd5b80631a2067e4116102525780631a2067e41461033c57806323b872dd146103455780632444863e14610358578063249feb291461036b578063266d308f14610375578063313ce5671461037d57600080fd5b806306fdde031461028f578063095ea7b3146102ad578063133346fc146102d057806318160ddd1461030f57806319ba22d714610321575b600080fd5b61029761060a565b6040516102a49190611f91565b60405180910390f35b6102c06102bb366004611ffb565b61069c565b60405190151581526020016102a4565b6102f77f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712981565b6040516001600160a01b0390911681526020016102a4565b6002545b6040519081526020016102a4565b6102f773a92ba7794429357ef26341a7300dd090b68a7f0381565b610313600c5481565b6102c0610353366004612025565b6106b6565b6005546102c09062010000900460ff1681565b6103736106da565b005b61037361086b565b604051601281526020016102a4565b6102f773f46b417245f05bc24e07c3a4aed9dddcc0ea776081565b61031360075481565b610373610a93565b6103736103c6366004612062565b610bf9565b61031360065481565b6103137f00000000000000000000000000000000000000000000000000000000016e0f3c81565b6102f773ffd9c98467c07a07a969ad4d411dc33fb406a35b81565b61031360085481565b610313600b5481565b6102f7735e901fe27f2ba5dfba024cb246f4145b74791a6f81565b6005546102c090610100900460ff1681565b610373610c06565b6102f77306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c81565b610313600d5481565b61031361048f36600461207b565b6001600160a01b031660009081526020819052604090205490565b610373610dd1565b610373611016565b610373611236565b6103736104d0366004611ffb565b61144b565b6102f77399066af7fa805fd9f37bf88e99a7c45b87d8e72581565b6102f7736421cf34f193609ebd78b7d6dfc75f9b6f73853681565b610297611464565b61031360095481565b610373611473565b6103736115c0565b610373611708565b6102c0610542366004611ffb565b61191c565b610313600a5481565b6102f773db0f954dbcc5bbb95de61a24ea9547f4555be98b81565b6005546102c09060ff1681565b6102f773509323819a25a79ce0235f4ea81a35576112968d81565b6103136105a136600461209d565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61037361192a565b6102f77358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b81565b6102f773d11ff2430a8d87a4be9f3292817565939bd650a181565b606060038054610619906120d0565b80601f0160208091040260200160405190810160405280929190818152602001828054610645906120d0565b80156106925780601f1061066757610100808354040283529160200191610692565b820191906000526020600020905b81548152906001019060200180831161067557829003601f168201915b5050505050905090565b6000336106aa818585611bdc565b60019150505b92915050565b6000336106c4858285611be9565b6106cf858585611c68565b506001949350505050565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc3037129161461072b5760405162461bcd60e51b81526004016107229061210a565b60405180910390fd5b6000610735611cc7565b90506000600d54826107479190612157565b90506003811115610756575060035b600081116107765760405162461bcd60e51b81526004016107229061216a565b60005b8181101561086657600d8054906000610791836121a1565b919050555060006015600d54116107aa57600d546107ad565b60155b905060006107bd6012600a6122a1565b600e83601681106107d0576107d06122b0565b01546107dc91906122c6565b90506107fc7399066af7fa805fd9f37bf88e99a7c45b87d8e72582611d11565b600d546040805183815260208101929092524382820152426060830152517399066af7fa805fd9f37bf88e99a7c45b87d8e7259133917f7d09aa606352a772bbfe118c92468b2e6c7f8f9bad8e8ac7a6115a352b33307e9181900360800190a35050600101610779565b505050565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712916146108b35760405162461bcd60e51b81526004016107229061210a565b6108e06203f4807f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b4310156108ff5760405162461bcd60e51b8152600401610722906122f0565b6018600a541061095b5760405162461bcd60e51b815260206004820152602160248201527f436f6d6d756e6974795361637269666963654c6f636b206d696e746564206f756044820152601d60fa1b6064820152608401610722565b6000610965611d47565b9050600a5481116109885760405162461bcd60e51b815260040161072290612327565b6000600a54826109989190612157565b905060038111156109a7575060035b601881600a546109b791906122dd565b11156109ce57600a546109cb906018612157565b90505b80600a60008282546109e091906122dd565b90915550600090506109f46012600a6122a1565b610a01836201e8486122c6565b610a0b91906122c6565b9050610a2b735e901fe27f2ba5dfba024cb246f4145b74791a6f82611d11565b600a546040805183815260208101929092524390820152426060820152735e901fe27f2ba5dfba024cb246f4145b74791a6f9033907f4517bd3a07c19e912a560b46028a17a473d4eafce09052818b052279ee457c3d906080015b60405180910390a3505050565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc30371291614610adb5760405162461bcd60e51b81526004016107229061210a565b60055462010000900460ff1615610b485760405162461bcd60e51b815260206004820152602b60248201527f4c69717564697479506f6f6c5374617274537563636573734c6f636b20616c7260448201526a1958591e481b5a5b9d195960aa1b6064820152608401610722565b6005805462ff00001916620100001790556000610b63601290565b610b6e90600a6122a1565b610b7b90620493e06122c6565b9050610b9b73d11ff2430a8d87a4be9f3292817565939bd650a182611d11565b60408051828152436020820152429181019190915273d11ff2430a8d87a4be9f3292817565939bd650a19033907f91b662e6504b5400709055bdcad22f79dbeb26f69689469a1828afaefcb1cebf906060015b60405180910390a350565b610c033382611d77565b50565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc30371291614610c4e5760405162461bcd60e51b81526004016107229061210a565b610c7b62301ec07f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b431015610cca5760405162461bcd60e51b815260206004820152601e60248201527f596561726c79206d696e74696e67206e6f7420737461727465642079657400006044820152606401610722565b6000610cd4611cc7565b90506009548111610cf75760405162461bcd60e51b81526004016107229061216a565b600060095482610d079190612157565b90506003811115610d16575060035b8060096000828254610d2891906122dd565b9091555060009050610d3c6012600a6122a1565b610d488361c3506122c6565b610d5291906122c6565b9050610d7273db0f954dbcc5bbb95de61a24ea9547f4555be98b82611d11565b600954604080518381526020810192909252439082015242606082015273db0f954dbcc5bbb95de61a24ea9547f4555be98b9033907f9470f40d4d40814ca773f56a83d0663817545abd726d3dddfb087a3ff6be2b5e90608001610a86565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc30371291614610e195760405162461bcd60e51b81526004016107229061210a565b610e4662301ec07f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b431015610e955760405162461bcd60e51b815260206004820152601860248201527f596561726c792064656c6179206e6f74207265616368656400000000000000006044820152606401610722565b6003600c5410610ee75760405162461bcd60e51b815260206004820152601860248201527f5374616b696e67526577617264206d696e746564206f757400000000000000006044820152606401610722565b6000610ef1611cc7565b9050600c548111610f145760405162461bcd60e51b81526004016107229061216a565b6000600c5482610f249190612157565b90506003811115610f33575060035b600381600c54610f4391906122dd565b1115610f5a57600c54610f57906003612157565b90505b80600c6000828254610f6c91906122dd565b9091555060009050610f806012600a6122a1565b610f8d836207a1206122c6565b610f9791906122c6565b9050610fb773a92ba7794429357ef26341a7300dd090b68a7f0382611d11565b600c54604080518381526020810192909252439082015242606082015273a92ba7794429357ef26341a7300dd090b68a7f039033907f9af4abcd438b1077bba8e3431953d4505969cc133ac34bee1ddd703e8e71498490608001610a86565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc3037129161461105e5760405162461bcd60e51b81526004016107229061210a565b61108b6203f4807f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b4310156110aa5760405162461bcd60e51b8152600401610722906122f0565b6018600754106111075760405162461bcd60e51b815260206004820152602260248201527f5374617274696e67536163726966696365526577617264206d696e746564206f6044820152611d5d60f21b6064820152608401610722565b6000611111611d47565b905060075481116111345760405162461bcd60e51b815260040161072290612327565b6000600754826111449190612157565b90506003811115611153575060035b60188160075461116391906122dd565b111561117a57600754611177906018612157565b90505b806007600082825461118c91906122dd565b90915550600090506111a06012600a6122a1565b6111ad836201e8486122c6565b6111b791906122c6565b90506111d773ffd9c98467c07a07a969ad4d411dc33fb406a35b82611d11565b600754604080518381526020810192909252439082015242606082015273ffd9c98467c07a07a969ad4d411dc33fb406a35b9033907f55422e2af579fe8afe40cd3aff96bb45c60b42bba7c9db889bacf472dec2ecf690608001610a86565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc3037129161461127e5760405162461bcd60e51b81526004016107229061210a565b6112ab6203f4807f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b4310156112ca5760405162461bcd60e51b8152600401610722906122f0565b6018600b541061131c5760405162461bcd60e51b815260206004820152601f60248201527f436f6d6d756e6974794275796261636b4c6f636b206d696e746564206f7574006044820152606401610722565b6000611326611d47565b9050600b5481116113495760405162461bcd60e51b815260040161072290612327565b6000600b54826113599190612157565b90506003811115611368575060035b601881600b5461137891906122dd565b111561138f57600b5461138c906018612157565b90505b80600b60008282546113a191906122dd565b90915550600090506113b56012600a6122a1565b6113c283620145646122c6565b6113cc91906122c6565b90506113ec7358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b82611d11565b600b5460408051838152602081019290925243908201524260608201527358d3ff89f6c27f8e4ab7eafeebbf1d34837b852b9033907fd210c9b1369bfb1564c40568bb0a54c19910a422816b48a54f093a366e02df8890608001610a86565b611456823383611be9565b6114608282611d77565b5050565b606060048054610619906120d0565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712916146114bb5760405162461bcd60e51b81526004016107229061210a565b60055460ff161561151a5760405162461bcd60e51b8152602060048201526024808201527f4c6971756964697479506f6f6c5374617274696e6720616c7265616479206d696044820152631b9d195960e21b6064820152608401610722565b6005805460ff191660011790556000611531601290565b61153c90600a6122a1565b61154990622dc6c06122c6565b905061156973f46b417245f05bc24e07c3a4aed9dddcc0ea776082611d11565b60408051828152436020820152429181019190915273f46b417245f05bc24e07c3a4aed9dddcc0ea77609033907fe98354ef11d19a16646497b1955d3bbbfa7235188af7d1080c87f0ba8d31d42e90606001610bee565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712916146116085760405162461bcd60e51b81526004016107229061210a565b600554610100900460ff16156116605760405162461bcd60e51b815260206004820152601a60248201527f4a7573744a616e69746f7220616c7265616479206d696e7465640000000000006044820152606401610722565b6005805461ff0019166101001790556000611679601290565b61168490600a6122a1565b61169190620493e06122c6565b90506116b1736421cf34f193609ebd78b7d6dfc75f9b6f73853682611d11565b604080518281524360208201524291810191909152736421cf34f193609ebd78b7d6dfc75f9b6f7385369033907f53bd6bc4cda146eb7aebfbf32645ff694cad4327a367c01daaa10f5871d1519e90606001610bee565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712916146117505760405162461bcd60e51b81526004016107229061210a565b61177d6203f4807f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b43101561179c5760405162461bcd60e51b8152600401610722906122f0565b6018600854106117ee5760405162461bcd60e51b815260206004820152601f60248201527f536163726966696365537563636573734c6f636b206d696e746564206f7574006044820152606401610722565b60006117f8611d47565b9050600854811161181b5760405162461bcd60e51b815260040161072290612327565b60006008548261182b9190612157565b9050600381111561183a575060035b60188160085461184a91906122dd565b11156118615760085461185e906018612157565b90505b806008600082825461187391906122dd565b90915550600090506118876012600a6122a1565b6118938361a2b26122c6565b61189d91906122c6565b90506118bd73509323819a25a79ce0235f4ea81a35576112968d82611d11565b600854604080518381526020810192909252439082015242606082015273509323819a25a79ce0235f4ea81a35576112968d9033907f68d4cd2dc7879625f526506cab8aad27b8c5fd42c1057cf7f3bba419efea87cc90608001610a86565b6000336106aa818585611c68565b336001600160a01b037f000000000000000000000000e36f6563fe55bd6562789e974ac7aecbc303712916146119725760405162461bcd60e51b81526004016107229061210a565b6119806203f48060046122c6565b6119aa907f00000000000000000000000000000000000000000000000000000000016e0f3c6122dd565b4310156119f95760405162461bcd60e51b815260206004820152601860248201527f436c61696d696e67206e6f7420737461727465642079657400000000000000006044820152606401610722565b6006805410611a4a5760405162461bcd60e51b815260206004820152601e60248201527f436c61696d206d696e74696e6720706572696f6420636f6d706c6574656400006044820152606401610722565b60006203f480611a7a7f00000000000000000000000000000000000000000000000000000000016e0f3c43612157565b611a84919061235e565b905060006004821015611a98576000611aae565b611aa3600483612157565b611aae9060016122dd565b90506006548111611ad15760405162461bcd60e51b815260040161072290612327565b600060065482611ae19190612157565b90506003811115611af0575060035b600681600654611b0091906122dd565b1115611b165760068054611b1391612157565b90505b8060066000828254611b2891906122dd565b9091555060009050611b3c6012600a6122a1565b611b4983620516156122c6565b611b5391906122c6565b9050611b737306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c82611d11565b60065460408051838152602081019290925243908201524260608201527306cb9263abaa71c84ecce77d62ff7b4a1ce1b60c9033907f66ee2205d6b22a0492b258ed6e9b34c42dd3804ffffe9c9d43bc051ece72fdb6906080015b60405180910390a350505050565b6108668383836001611dad565b6001600160a01b03838116600090815260016020908152604080832093861683529290522054600019811015611c625781811015611c5357604051637dc7a0d960e11b81526001600160a01b03841660048201526024810182905260448101839052606401610722565b611c6284848484036000611dad565b50505050565b6001600160a01b038316611c9257604051634b637e8f60e11b815260006004820152602401610722565b6001600160a01b038216611cbc5760405163ec442f0560e01b815260006004820152602401610722565b610866838383611e74565b600062301ec0611cf77f00000000000000000000000000000000000000000000000000000000016e0f3c43612157565b611d01919061235e565b611d0c9060016122dd565b905090565b6001600160a01b038216611d3b5760405163ec442f0560e01b815260006004820152602401610722565b61146060008383611e74565b60006203f480611cf77f00000000000000000000000000000000000000000000000000000000016e0f3c43612157565b6001600160a01b038216611da157604051634b637e8f60e11b815260006004820152602401610722565b61146082600083611e74565b6001600160a01b038416611dd75760405163e602df0560e01b815260006004820152602401610722565b6001600160a01b038316611e0157604051634a1406b160e11b815260006004820152602401610722565b6001600160a01b0380851660009081526001602090815260408083209387168352929052208290558015611c6257826001600160a01b0316846001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92584604051611bce91815260200190565b6001600160a01b038316611e9f578060026000828254611e9491906122dd565b90915550611f119050565b6001600160a01b03831660009081526020819052604090205481811015611ef25760405163391434e360e21b81526001600160a01b03851660048201526024810182905260448101839052606401610722565b6001600160a01b03841660009081526020819052604090209082900390555b6001600160a01b038216611f2d57600280548290039055611f4c565b6001600160a01b03821660009081526020819052604090208054820190555b816001600160a01b0316836001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051610a8691815260200190565b602081526000825180602084015260005b81811015611fbf5760208186018101516040868401015201611fa2565b506000604082850101526040601f19601f83011684010191505092915050565b80356001600160a01b0381168114611ff657600080fd5b919050565b6000806040838503121561200e57600080fd5b61201783611fdf565b946020939093013593505050565b60008060006060848603121561203a57600080fd5b61204384611fdf565b925061205160208501611fdf565b929592945050506040919091013590565b60006020828403121561207457600080fd5b5035919050565b60006020828403121561208d57600080fd5b61209682611fdf565b9392505050565b600080604083850312156120b057600080fd5b6120b983611fdf565b91506120c760208401611fdf565b90509250929050565b600181811c908216806120e457607f821691505b60208210810361210457634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601a908201527f4f6e6c79204a757374414a616e69746f722063616e206d696e74000000000000604082015260600190565b634e487b7160e01b600052601160045260246000fd5b818103818111156106b0576106b0612141565b60208082526018908201527f4e6f20796561726c7920736c6f7420617661696c61626c650000000000000000604082015260600190565b6000600182016121b3576121b3612141565b5060010190565b6001815b60018411156121f5578085048111156121d9576121d9612141565b60018416156121e757908102905b60019390931c9280026121be565b935093915050565b60008261220c575060016106b0565b81612219575060006106b0565b816001811461222f576002811461223957612255565b60019150506106b0565b60ff84111561224a5761224a612141565b50506001821b6106b0565b5060208310610133831016604e8410600b8410161715612278575081810a6106b0565b61228560001984846121ba565b806000190482111561229957612299612141565b029392505050565b600061209660ff8416836121fd565b634e487b7160e01b600052603260045260246000fd5b80820281158282048414176106b0576106b0612141565b808201808211156106b0576106b0612141565b60208082526019908201527f4d6f6e74686c792064656c6179206e6f74207265616368656400000000000000604082015260600190565b60208082526019908201527f4e6f206d6f6e74686c7920736c6f7420617661696c61626c6500000000000000604082015260600190565b60008261237b57634e487b7160e01b600052601260045260246000fd5b50049056fea26469706673582212206047331e4bb500040bdfe8963f384212cbd90d0347687c76708071bd122eb5aa64736f6c634300081d0033